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

Why does clang still need libgcc.a to compile my code?

本文关键字:编译 我的 代码 libgcc clang 为什么      更新时间:2023-10-16
int main(int argc, char **argv)
{
return 0;
}

我交叉编译(主机=linux x86_64,目标=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?我读了1和2,看了3
  2. 确实
    • (a)链接器需要libgcc自己进行链接工作,或者
    • (b) 链接器使用libgcc是因为我的代码需要libgcc提供的东西吗
    • 我想是(b),但我只是想确定一下

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            10338        e     2 .gnu.version
10338            10338        e     2         <internal>:(.gnu.version)
10348            10348       20     4 .gnu.version_r
10348            10348       20     4         <internal>:(.gnu.version_r)
10368            10368       1c     8 .gnu.hash
10368            10368       1c     8         <internal>:(.gnu.hash)
10384            10384       87     1 .dynstr
10384            10384       87     1         <internal>:(.dynstr)
10410            10410       18     8 .rela.dyn
10410            10410       18     8         <internal>:(.rela.dyn)
10428            10428       48     8 .rela.plt
10428            10428       48     8         <internal>:(.rela.plt)
10470            10470       20     4 .note.ABI-tag
10470            10470       20     4         crt1.o:(.note.ABI-tag)
10470            10470        0     1                 $d
10490            10490        4     4 .rodata
10490            10490        4     4         <internal>:(.rodata)
10494            10494        c     4 .eh_frame_hdr
10494            10494        c     4         <internal>:(.eh_frame_hdr)
104a0            104a0        4     4 .eh_frame
20000            20000      210     8 .text
20000            20000       48     8         crt1.o:(.text)
20000            20000        0     1                 $x
20000            20000        0     1                 _start
2002c            2002c        0     1                 $d
20048            20048       14     4         crti.o:(.text)
20048            20048        0     1                 $x
20048            20048       14     1                 call_weak_fn
20060            20060       e0     8         crtbegin.o:(.text)
20060            20060        0     1                 $x
20060            20060        0     1                 deregister_tm_clones
20090            20090        0     1                 $d
20098            20098        0     1                 $x
20098            20098        0     1                 register_tm_clones
200d0            200d0        0     1                 $d
200d8            200d8        0     1                 $x
200d8            200d8        0     1                 __do_global_dtors_aux
20108            20108        0     1                 frame_dummy
20138            20138        0     1                 $d
20140            20140       54     4         /tmp/main-762849.o:(.text)
20140            20140        0     1                 $x.0
20140            20140       10     1                 do_math(int*)
20150            20150       44     1                 main
20194            20194       7c     4         ./libs/libc_nonshared.a(elf-init.oS):(.text)
20194            20194        0     1                 $x
20194            20194       78     1                 __libc_csu_init
2020c            2020c        4     1                 __libc_csu_fini
20210            20210        0     1         crtend.o:(.text)
20210            20210        0     1         crtn.o:(.text)
20210            20210       14     4 .init
20210            20210        c     4         crti.o:(.init)
20210            20210        0     1                 $x
20210            20210        0     1                 _init
2021c            2021c        8     1         crtn.o:(.init)
2021c            2021c        0     1                 $x
20224            20224       10     4 .fini
20224            20224        8     4         crti.o:(.fini)
20224            20224        0     1                 $x
20224            20224        0     1                 _fini
2022c            2022c        8     1         crtn.o:(.fini)
2022c            2022c        0     1                 $x
20240            20240       50    16 .plt
20240            20240       50    16         <internal>:(.plt)
30000            30000       10     8 .data
30000            30000        4     1         crt1.o:(.data)
30000            30000        0     1                 data_start
30000            30000        0     1                 __data_start
30004            30004        0     1         crti.o:(.data)
30008            30008        8     8         crtbegin.o:(.data)
30008            30008        0     1                 $d
30008            30008        0     1                 __dso_handle
30010            30010        0     1         ./libs/libc_nonshared.a(elf-init.oS):(.data)
30010            30010        0     1         crtend.o:(.data)
30010            30010        0     1         crtn.o:(.data)
30010            30010        0     8 .tm_clone_table
30010            30010        0     8         crtbegin.o:(.tm_clone_table)
30010            30010        0     1                 __TMC_LIST__
30010            30010        0     8         crtend.o:(.tm_clone_table)
30010            30010        0     1                 __TMC_END__
30010            30010       30     8 .got.plt
30010            30010       30     8         <internal>:(.got.plt)
40000            40000        8     8 .jcr
40000            40000        0     8         crtbegin.o:(.jcr)
40000            40000        0     1                 __JCR_LIST__
40000            40000        8     8         crtend.o:(.jcr)
40000            40000        0     1                 $d
40000            40000        0     1                 __JCR_END__
40008            40008        8     8 .fini_array
40008            40008        8     8         crtbegin.o:(.fini_array)
40008            40008        0     1                 $d
40008            40008        0     1                 __do_global_dtors_aux_fini_array_entry
40010            40010        8     8 .init_array
40010            40010        8     8         crtbegin.o:(.init_array)
40010            40010        0     1                 $d
40010            40010        0     1                 __frame_dummy_init_array_entry
40018            40018      180     8 .dynamic
40018            40018      180     8         <internal>:(.dynamic)
40198            40198        8     8 .got
40198            40198        8     8         <internal>:(.got)
50000            50000        1     1 .bss
50000            50000        0     1         crt1.o:(.bss)
50000            50000        0     1         crti.o:(.bss)
50000            50000        1     1         crtbegin.o:(.bss)
50000            50000        1     1                 completed.7557
50000            50000        0     1                 $d
50001            50001        0     1         ./libs/libc_nonshared.a(elf-init.oS):(.bss)
50001            50001        0     1         crtend.o:(.bss)
50001            50001        0     1         crtn.o:(.bss)
0                0       24     1 .gnu_debuglink
0                0        c     1         crt1.o:(.gnu_debuglink)
c                c        c     1         crti.o:(.gnu_debuglink)
18               18        c     1         crtn.o:(.gnu_debuglink)
0                0       9d     1 .comment
0                0       9d     1         <internal>:(.comment)
0                0      5b8     8 .symtab
0                0      5b8     8         <internal>:(.symtab)
0                0      119     1 .shstrtab
0                0      119     1         <internal>:(.shstrtab)
0                0      228     1 .strtab
0                0      228     1         <internal>:(.strtab)

Clang没有附带链接器,而是依赖于ld。并且ld依赖于系统上的libgcc.a和/或libgcc.so(无论这是LLVM链接器ld.lld还是GNU ld)。这就是您收到此错误消息的原因。

所以答案实际上是:

(a)链接器需要libgcc来完成自己的链接工作

有关这方面的更多详细信息,请访问omniprog.info:

如果我们想摆脱GCC,并在上使用clang作为默认编译器系统,我们可能不得不根据一些RPM进行一些调整系统。Clang不提供链接器,但依赖于系统的链接器,通常为ld,用于链接可执行文件。即使在FreeBSD和MacOSX系统,Clang是默认编译器。我们可以使用-v选项clang++看到这一点。现在,ld不起作用了没有以下文件:

libgcc.a
libgcc_s.so
〔…〕

必须使用选项-nodefaultlibs-nostdlibs进行编译。

这里引用GCC文档(clang接口是一样的):

-nostdlib-nodefaultlibs绕过的标准库之一是libgcc.a,它是GCC用来克服特定机器的缺点或某些语言的特殊需求的内部子例程库。

您可能必须执行c++静态初始化例程和/或使用lib目录中的对象文件crt<x>.o提供的内容。这些文件是libc的一部分,并提供了可执行的入口点。

以防万一我使用Qt,并且在Qt版本大于5.11的安卓系统上运行应用程序,在最新的NDK-r20c安卓SDK中遇到了这个问题。经过一番折腾,终于用上了NDK-r19c。在最新的Qt时(5.11),用最新的Android NDK编译应该可以,正如文件所说。但它并没有解决找不到与GCC相关的东西的错误(Android NDK使用Clang,不应该抱怨GCC)。在挖掘并没有找到答案之后,我用一个早期的NDK-r19替换了最新的Android NDK-r20,令人惊讶的是它竟然奏效了!