gpt4 book ai didi

makefile - crti.o 文件丢失

转载 作者:太空宇宙 更新时间:2023-11-04 12:00:33 24 4
gpt4 key购买 nike

我正在使用 GNU 工具链构建一个项目,一切正常,直到我开始链接它,链接器提示它丢失/找不到 crti.o。这不是我的目标文件之一,它似乎与 libc 有关,但我不明白为什么它需要这个 crti.o,它不会使用库文件吗,例如libc.a?

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

crti.o 位于“库”搜索路径之一,但它是否应该在库路径中查找 .o 文件?

gccld的搜索路径是否相同?

最佳答案

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 就会变得困惑,您想看看在哪里它打开的路径来自...

关于makefile - crti.o 文件丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52583696/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com