GCC -c和ld:EXEC没有这样的文件或目录
我知道这是一个非常基本的问题,但同时,我发现类似的问题,我没有找到一个解决办法...GCC -c和ld:EXEC没有这样的文件或目录
我有这个同样的问题简单的程序:
#include <stdio.h>
void main()
{
printf("Hi\n");
fflush(stdout);
}
如果我用gcc main.c编译,我没有问题。
如果我编译用gcc -c main.c中,然后用LD -o主main.o链接,我获得错误未定义参考为提出,标准输出和fflush 。我在末尾添加了-lc,二进制文件仅在_start处创建了warnig,但是当我执行该程序时,它返回一个通用的“文件未找到”错误。 如果我没看错的问题是,连接器使用的libc.so.1不存在的相反,我认为,libc.so.6的:与readelf -a主
[Requesting program interpreter: /usr/lib/libc.so.1]
有谁知道什么是错的?这是一些环境/系统问题,或者我必须更改ld选项?怎么样?
谢谢你,对不起,“愚蠢”的问题......(和我可怜的“英语”)
编辑:“解决”(见下文),我想补充的形式获得的新的ld选项GCC -v main.c中 [COLLECT_GCC_OPTIONS]我试图在最小,以减少:
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 *)
你不能只是链接一个目标文件并注意获取一个可执行文件。您需要链接到定义目标文件所需符号的库。由于任何C程序都需要一些启动代码来初始化main
的argc和argv,因此您可能至少需要链接一个通常称为crt0.o
的文件,可能还需要使用C标准库。
这是相当重要的。如果使用gcc -v
运行详细编译,则可以看到实际的链接命令。
是的,谢谢你,我按照上面的建议,在查看gcc -v后解决了 – user7707645
如果你让'gcc'调用'ld',你会得到同样的错误,也就是说,如果你用'gcc -o main main.o'链接会发生什么? –
不,如说我让海湾合作委员会呼吁ld我没有问题,对不起,我不得不更好地突出它 – user7707645
这个答案帮助:http://*.com/a/14418246/646887? –