我正在为arm平台交叉编译。我在工具链中有这个文件,但如何让链接器将其包含进来? 在其中一个“库”搜索路径上,但它是否应该在库路径上寻找<.o>文件?
对于和,搜索路径是否相同?
crti.o
是引导库,通常很小。它通常静态链接到二进制文件中。应该在 /usr/lib
中找到。
如果你正在运行二进制发行版,它们倾向于把所有开发人员的东西放入-dev包中(例如libc6-dev),因为这些不需要用来运行已编译的程序,只需要用来构建它们。
你没有进行交叉编译吧?
如果你正在进行交叉编译,通常问题出现在gcc的搜索路径与crti.o所在的位置不匹配。它应该在工具链构建时被构建。首先要检查的是gcc -print-search-dirs
并查看其中是否有crti.o所在的路径。
实际上,链接工作是由ld完成的,但是它的路径是由gcc传递给它的。可能最快的方法是编译一个helloworld.c程序并对其进行strace,以查看传递给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
可能会变得混乱,你想知道它正在打开的路径来自哪里...
Linux Mint 18.0/Ubuntu 16.04
中根本没有crti.o
:$ find /usr/ -name crti*
sudo apt-get install libc6-dev
如果你想找一些库,点击这里
好的,我不得不重新安装工具链,这样缺失的文件就被包含了。这似乎很奇怪,因为它应该在gcc路径上找到它。我想主要问题是我电脑上有15个左右不同的crti.o文件,并没有指向正确的文件。虽然还是不太明白,但现在它可以工作了 :-) 感谢您的帮助 :-)
我曾经遇到过一个类似的问题,是由于交叉编译器设置不当引起的。我通过以下方式解决了这个问题:
/home/rob/compiler/usr/bin/arm-linux-gcc --sysroot=/home/rob/compiler hello.c
这假设/sysroot选项指向的位置存在/lib、/usr/include等文件夹。这可能不是正确的做法,但当我需要编译一个简单的C文件时,它帮了我的大忙。
export LDFLAGS=""--sysroot=${SDKTARGETSYSROOT}" -L${SDKTARGETSYSROOT}/lib -L${SDKTARGETSYSROOT}/usr/lib -L${SDKTARGETSYSROOT}/usr/lib/arm-poky-linux-gnueabi/5.3.0"
这对我有用(交叉编译pjsip为ARM):
export LDFLAGS='--sysroot=/home/me/<path-to-my-sysroot-parent>/sysroot'
我在默认的Ubuntu 8.04安装中遇到了同样的问题。我不得不手动获取libc开发人员头文件/文件才能使其正常工作。