相关疑难解决方法(0)

直接将C程序与ld链接失败,未定义引用`__libc_csu_fini`

我正在尝试在Linux下编译一个C程序.然而,出于好奇,我正在尝试手动执行一些步骤:我使用:

  • gcc前端生成汇编代码
  • 然后运行GNU汇编程序以获取目标文件
  • 然后将其与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(反对).

问题是什么?

c linker gcc glibc ld

15
推荐指数
3
解决办法
2万
查看次数

为什么clang仍然需要libgcc.a来编译我的代码?

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

问题

  1. 为什么这样一个简单的程序仍然需要libgcc.a?我读了12,我看了3.
  2. 是否
    • (a)链接器要求libgcc进行自己的链接工作,或者
    • (b)链接器是否使用libgcc,因为我的代码需要libgcc提供的东西
    • 我认为这是(b),但我只想确定.

一张地图

     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)

c++ linux gcc llvm clang

12
推荐指数
2
解决办法
1425
查看次数

标签 统计

gcc ×2

c ×1

c++ ×1

clang ×1

glibc ×1

ld ×1

linker ×1

linux ×1

llvm ×1