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 *)

+1

如果你让'gcc'调用'ld',你会得到同样的错误,也就是说,如果你用'gcc -o main main.o'链接会发生什么? –

+0

不,如说我让海湾合作委员会呼吁ld我没有问题,对不起,我不得不更好地突出它 – user7707645

+0

这个答案帮助:http://*.com/a/14418246/646887? –

你不能只是链接一个目标文件并注意获取一个可执行文件。您需要链接到定义目标文件所需符号的库。由于任何C程序都需要一些启动代码来初始化main的argc和argv,因此您可能至少需要链接一个通常称为crt0.o的文件,可能还需要使用C标准库。

这是相当重要的。如果使用gcc -v运行详细编译,则可以看到实际的链接命令。

+0

是的,谢谢你,我按照上面的建议,在查看gcc -v后解决了 – user7707645