【发布时间】:2017-05-08 08:30:13
【问题描述】:
我知道这是一个非常基本的问题,但是虽然我发现了类似的问题,但我没有找到解决方案...
我对这个简单的程序也有同样的问题:
#include <stdio.h>
void main()
{
printf("Hi\n");
fflush(stdout);
}
如果我用 gcc main.c 编译,我没有问题。
如果我用 gcc -c main.c 编译然后用 ld -o main main.o 链接,我会得到错误 undefined reference em> 表示 puts、stdout 和 fflush。我在末尾添加了 -lc 并在创建二进制文件时仅在 _start 点上有一个警告,但是当我执行程序时,它返回一个通用 “找不到文件” 错误。 如果我没记错的话,问题是链接器使用的是不存在的 libc.so.1 而不是我认为的 libc.so.6: readelf -a main
[Requesting program interpreter: /usr/lib/libc.so.1]
有谁知道怎么回事?这是一些环境/系统问题还是我必须更改 ld 选项?怎么样?
谢谢你,对这个“愚蠢”的问题感到抱歉......(以及我可怜的“英语”)
编辑:“已解决”(见下文),只是添加从 gcc -v main.c [COLLECT_GCC_OPTIONS] 获得的新 ld 选项,我试图在最小值处减少:
ld -o main main.o --hash-style=gnu --as-needed -dynamic-linker /lib/ld-linux.so.2 -z relro /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crt1.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/5 -L/usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/5/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/5/crtend.o /usr/lib/gcc/i686-linux-gnu/5/../../../i386-linux-gnu/crtn.o
EDIT2:启动程序,我认为最小值是
ld -o main main.o --as-needed -dynamic-linker /lib/ld-linux.so.2 -lc
它返回一个分段错误(我认为是缺少指向 crt* 的链接)
【问题讨论】:
-
如果你让
gcc调用ld,你会得到同样的错误吗,也就是说,如果你使用:gcc -o main main.o链接会发生什么? -
不,就像我说的,如果我让 gcc 调用 ld 我没有问题,抱歉我必须更好地突出它
-
这个答案有帮助吗:stackoverflow.com/a/14418246/646887 ?
-
尝试在带有详细 (-v) 标志的 .o 文件上调用
gcc。它将打印用于调用ld的命令。检查它传递给ld的其他标志。 -
@KlasLindbäck 实际上,您链接的答案有所帮助,使用在 ld 中使用 gcc -v 打印的 COLLECT_GCC_OPTIONS,该程序有效,谢谢