【发布时间】:2020-09-25 03:17:42
【问题描述】:
我是学习基本编译的初学者。我创建了一个非常简单的 c 文件,如下所示
#include <stdio.h>
int main (void) {
printf("Hello World!\n");
return 0;
}
然后我运行命令,
cpp -E helloworld.c -o helloworld.i
gcc -S helloworld.i -o helloworld.s
as helloworld.s -o helloworld.o
ld -shared -o helloworld /usr/lib64/libc.so helloworld.o
在这里,我收到了这样的错误消息,
ld -shared -o helloworld /usr/lib64/libc.so helloworld.o
ld: helloworld.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
ld: final link failed: Nonrepresentable section on output
所以我重新运行上层,但使用 -fPIC
cpp -E helloworld.c -o helloworld.i
gcc -S helloworld.i -o helloworld.s -fPIC
as helloworld.s -o helloworld.o
ld -shared -o helloworld /usr/lib64/libc.so helloworld.o
最后,我得到了我的 helloworld,但是当我尝试 ./helloworld 时,我遇到了分段错误。
有人可以帮忙吗?提前致谢!
【问题讨论】:
-
您是否有理由尝试单独执行构建的每个部分而不是使用
gcc来构建所有命令?那是gcc -o helloworld helloworld.c?您的命令还不够,因为需要链接的不仅仅是libc。运行gcc -v helloworld.c以查看gcc执行的确切步骤并与您所拥有的进行比较。 -
是的,gcc -o helloworld helloworld.c 有效,但我尝试了解 ld 命令的工作原理,这就是我这样做的原因。 gcc -v 输出对我来说有点复杂。能否请您提供更多细节?非常感谢!
-
那么是的,请查看
gcc -v输出以更好地了解命令详细信息。它不像你现在做的那么简单。 -
好的,感谢任何解释 gcc -v 输出的网络链接!