crti.o
- это библиотека начальной загрузки, обычно довольно маленькая. Обычно он статически связан с вашим двоичным кодом. Он должен быть найден в /usr/lib
.
Если вы используете двоичный дистрибутив, они, как правило, помещают все материалы разработчика в -dev-пакеты (например, libc6-dev), так как не нужно запускать скомпилированные программы, а просто создавать их.
Вы не перекрестно компилируете, не так ли?
Если вы выполняете кросс-компиляцию, обычно проблема связана с тем, что путь поиска gcc не совпадает с вашим crti.o. Он должен был быть построен, когда была инструментальная цепочка. Первое, что нужно проверить: gcc -print-search-dirs
и посмотреть, есть ли crti.o на любом из этих путей.
Связывание фактически выполняется ld, но оно имеет свои пути, переданные ему gcc. Вероятно, самый быстрый способ узнать, что происходит, - это составить программу helloworld.c и собрать ее, чтобы узнать, что передается ld и посмотреть, что происходит.
strace -v -o log -f -e trace=open,fork,execve gcc hello.c -o test
Открыть файл журнала и поиск crti.o, как вы можете видеть мой не-кросс-компилятор:
10616 execve("/usr/bin/ld", ["/usr/bin/ld", "--eh-frame-hdr", "-m", "elf_x86_64", "--hash-style=both", "-dynamic-linker", "/lib64/ld-linux-x86-64.so.2", "-o"
, "test", "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."..., "-L/usr/lib/gcc/x86_64-linux-g
nu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/usr/lib/gcc/x86_64-linux-gnu/"..., "-L/lib/../lib", "-L/usr/lib/../lib", "-L/usr/lib/gcc/x86_64-linux-gnu
/"..., "/tmp/cc4rFJWD.o", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "-lc", "-lgcc", "--as-needed", "-lgcc_s", "--no-as-needed", "/usr/lib/gcc/x86_
64-linux-gnu/4."..., "/usr/lib/gcc/x86_64-linux-gnu/4."...], "COLLECT_GCC=gcc", "COLLECT_GCC_OPTIONS=\'-o\' \'test\' "..., "COMPILER_PATH=/usr/lib/gcc/x86_6"..., "LIBRARY_PATH=/usr/lib/gcc/x86_64"..., "CO
LLECT_NO_DEMANGLE="]) = 0
10616 open("/etc/ld.so.cache", O_RDONLY) = 3
10616 open("/usr/lib/libbfd-2.18.0.20080103.so", O_RDONLY) = 3
10616 open("/lib/libc.so.6", O_RDONLY) = 3
10616 open("test", O_RDWR|O_CREAT|O_TRUNC, 0666) = 3
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crt1.o", O_RDONLY) = 4
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/../../../../lib/crti.o", O_RDONLY) = 5
10616 open("/usr/lib/gcc/x86_64-linux-gnu/4.2.3/crtbegin.o", O_RDONLY) = 6
10616 open("/tmp/cc4rFJWD.o", O_RDONLY) = 7
Если вы видите кучу попыток open(...crti.o) = -1 ENOENT
, ld
будет путаться и вы хотите увидеть, где путь, который он открыл, произошел от ...
Для Mac , см. http://stackoverflow.com/questions/1365211/error-in-xcode-project-ld-library-not-found-for-lcrt1-10-6-o/16102800 http://stackoverflow.com/ Questio ns/10941247/command-line-library-build-fail-with-linker-error/16102769 – kenorb 2013-04-19 10:44:44