2008-09-18 111 views
21

我建立使用GNU工具链的一个项目,直到我得到它联系起来,其中连接器抱怨说,它缺少/找不到crti.o一切工作正常。这不是我的目标文件之一,它似乎与libc有关,但我不明白为什么它需要这个crti.o,它不会使用库文件,例如libc.acrti.o文件丢失

我正在为手臂平台交叉编译。我有工具链中的文件,但我如何让链接器包含它?

crti.o是在'图书馆'搜索路径之一,但它应该寻找库路径上的.o文件?

是搜索路径同样为gccld

+0

对于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 /命令行 - 库 - 构建 - 失败与连接器错误/ 16102769 – kenorb 2013-04-19 10:44:44

回答

22

crti.o是bootstrap库,一般很小。它通常静态链接到你的二进制文件中。它应该在/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是感到困惑和你想看看它的开放来自路径...

+0

+1为非常有用的strace技巧。但我的问题仍然没有解决(交叉编译ARM上的pjsip) – FractalSpace 2014-09-17 21:29:33

+0

@FractalSpace它可能是一个不同的问题。你可以发布你的输出的问题吗? – stsquad 2014-09-18 16:16:08

0

我得到同样的问题,在Ubuntu默认安装8.04。我必须手动获取libc开发人员头文件/文件才能工作。

1

好的,我不得不重新安装工具链,以便包括丢失的文件。这似乎很奇怪,因为它应该在gcc路径上找到它。我猜想的主要问题是我的计算机上有15个左右不同的crti.o文件,并没有指向正确的文件。不过,因为不会使,但现在它工作:-)感谢您的帮助:-)

1

我有一个严重的建立交叉编译器类似的问题。我周围有像这样:

/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c 

这假定/ lib目录,/ usr/include目录等所描述的地点由SYSROOT选项指向。这可能不是应该如何完成的,但是当我需要编译一个简单的C文件时,它使我摆脱了麻烦。

0

这解决了我(交叉编译PJSIP为ARM):

export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot' 
2

我不得不同时交叉编译同样的问题。 crti.o在<sysroot>/usr/lib64但链接器不会找到它。

原来,创建一个空目录<sysroot>/usr/lib修复了这个问题。看来,链接器将搜索路径<SYSROOT>/usr/lib目录第一,且仅当它存在,它甚至会考虑<SYSROOT>在/ usr/lib64下

这是链接器中的错误吗?或者这种行为记录在某处?

1

在我的情况Linux Mint 18.0/Ubuntu 16.04,我没有crti.o可言:

$ find /usr/ -name crti* 

我觉得没有什么,所以我安装开发包:

sudo apt-get install libc6-dev 

如果你能找到一些库read here