我正在尝试在Linux下编译一个C程序.然而,出于好奇,我正在尝试手动执行一些步骤:我使用:
现在我被连接部分困住了.
该程序是一个非常基本的"Hello world":
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用以下命令来生成汇编代码:
gcc hello.c -S -masm=intel
Run Code Online (Sandbox Code Playgroud)
我告诉gcc在编译后退出并使用Intel语法转储汇编代码.
然后我使用GNU汇编程序来生成目标文件:
as -o hello.o hello.s
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用ld生成最终的可执行文件:
ld hello.o /usr/lib/libc.so /usr/lib/crt1.o -o hello
Run Code Online (Sandbox Code Playgroud)
但我不断收到以下错误消息:
/usr/lib/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
Run Code Online (Sandbox Code Playgroud)
符号__libc_csu_fini/init似乎是glibc的一部分,但我无法在任何地方找到它们!我尝试/usr/lib/libc.a使用相同的结果静态链接libc(反对).
问题是什么?
int main(int argc, char **argv)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我交叉编译(host = linux x86_64,target = linux aarch64)
/path/to/clang --target=aarch64-linux-gnu -v main.cpp -o main -fuse-ld=lld -L./libs -lc -lc_nonshared -Xlinker -Map=a.map
在-L./libs文件夹中,我放置了目标中的所有依赖项.当我排除libgcc.a时,会发生此链接器错误
ld.lld: error: unable to find library -lgcc
我添加了-Map选项以获取有关链接静态库的信息.在地图文件中,我看不到对libgcc.a的引用...但我正在努力阅读地图文件.有很多线条<internal>.不确定那是什么.请参见底部的a.map
问题
一张地图
VMA LMA Size Align Out In Symbol
10270 10270 1b 1 .interp
10270 10270 1b 1 <internal>:(.interp)
10290 10290 a8 8 .dynsym
10290 10290 a8 8 <internal>:(.dynsym)
10338 …Run Code Online (Sandbox Code Playgroud)