为什么clang仍然需要libgcc.a来编译我的代码
Why does clang still need libgcc.a to compile my code?
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
问题
- 为什么这么简单的程序仍然需要libgcc.a?我读了1和2,看了3
- 确实
- (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,令人惊讶的是它竟然奏效了!
- 为什么 emscripten 不编译我的函数?
- Qt - 为什么Visual Studio 2019在qml资源中添加10Mb文件后无法再编译我的项目?
- 编译我的 3 个文件时,我收到错误,说"运算符="不匹配
- 为什么clang仍然需要libgcc.a来编译我的代码
- 为什么Visual Studio 2019不编译我的代码?
- G++ 在编译我的 flex 和 bison 代码时无法识别我的 c++ 类
- 当我编译我的程序时,它显示"分段错误(或)分段错误(核心转储)
- 当我构建和编译我的C 项目时,没有通过我的CMake文件找到正确的C 库,我在做什么错
- 尝试编译我的程序时出现 3 个链接错误
- 编译我的C++代码需要很长时间
- 当我尝试使用 makefile 编译我的 qt 程序时,它不起作用
- 初学者C - 编译我的代码时遇到困难
- 为什么 OSX Mavericks 无法编译我的 GLSL 着色器?
- 用 C::B 编译我的第一个应用程序
- 尝试编译我的 wxWidgets 程序时出错"is_enum not declared in this scope"
- 编译我的第一个c++程序时遇到问题
- 编译我的第一个C++程序时遇到问题
- Visual C++ 没有编译我的代码
- g++ 无法编译我的复杂模板实例化
- 为什么我在尝试编译我的第一个 CORBA 服务器(使用 ACE/TAO ORB 实现)时遇到链接器错误