【问题标题】:Why does clang still need libgcc.a to compile my code?为什么 clang 还需要 libgcc.a 来编译我的代码?
【发布时间】:2018-12-12 21:45:40
【问题描述】:
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> 有很多行。不知道那些是什么。见底部的.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            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)

【问题讨论】:

标签: c++ linux gcc clang llvm


【解决方案1】:

Clang 不附带链接器,而是依赖于ld。而ld 取决于您系统上的libgcc.a 和/或libgcc.so(不管这是LLVM linker ld.lld 或GNU ld)。这就是您收到此错误消息的原因。

所以答案其实是:

(a) 链接器需要 libgcc 自己做链接工作

更多详情请见here at omniprog.info

如果我们想摆脱 GCC 并使用 clang 作为我们的默认编译器 系统,我们可能需要对一些基于 RPM 的 系统。 Clang 不提供链接器,而是依赖于系统的 链接器,通常是 ld,用于链接可执行文件。即使在这种情况下 Clang 是默认编译器的 FreeBSD 和 Mac OS X 系统。我们 可以使用 clang++ 的 -v 选项看到这一点。现在,ld 行不通 没有以下文件:

libgcc.a
libgcc_s.so
[...]

【讨论】:

  • 当我用 -v 调用 clang 时,会调用 ld.lld,我认为它是 llvm 链接器。 ld.lld 是否仍然使用 GNU ld?
  • 如果使用-lgcc 调用链接器,它必须查找libgcc,即使它后来注意到没有任何libgcc 的对象被引用,因此没有链接到最终的可执行文件中。我认为开发人员不会费心根据所使用的链接器来区分调用。
  • @robor78 是的,ld.lld 是 LLVM 链接器。即使他们没有提到它,它似乎仍然使用 libgcc:lld.llvm.org - 如果尚未完成,可能需要报告一个问题。
  • libgcc 包含系统特定的代码/信息,当前 llvm 贡献者并不特别想复制或保持同步,但您的程序经常需要。这是有目的的,因为它是众所周知的,并且对其进行处理不是任何开发人员的优先事项。如果有人要加强功能补丁,事情可能会改变。
【解决方案2】:

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

这里引用GCC documentation的一段话(clang界面也一样):

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

您可能必须 execute c++ static initialization routines 和/或使用 lib 目录中的目标文件 crt&lt;x&gt;.o 提供的内容。这些文件是libc 的一部分并提供可执行的入口点。

【讨论】:

    【解决方案3】:

    以防万一 我使用 Qt 并在 Qt 版本高于 5.11 的 Android 上运行应用程序,在使用 NDK-r20c 的最新 Android SDK 时遇到了这个问题。经过一番挣扎,最终它与 NDK-r19c 一起工作。 如文档所述,在最新的 Qt 时间(5.11)中,使用最新的 Android NDK 编译应该没问题。但它不适用于未找到与 GCC 相关的内容的错误(Android NDK 使用 Clang,不应该抱怨 GCC)。在挖掘并没有找到答案后,我用早期的 NDK-r19 替换了最新的 Android NDK-r20,令人惊讶的是它起作用了!

    【讨论】:

    • 你能再解释一下吗?
    • 很抱歉回答迟了。我只记得,在最新的 Qt 时间(5.11)中,使用最新的 Android NDK 编译应该没问题,如文档所述。但它不适用于未找到与 GCC 相关的内容的错误。在挖掘并没有找到答案后,我用早期的 NDK-r19 替换了最新的 Android NDK-r20,令人惊讶的是它起作用了!
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    相关资源
    最近更新 更多