Linux

連結器標誌之間的區別

  • June 27, 2018

我正在向 Linux 核心添加 c++ 執行時和異常支持。為此,我需要提供自己的lib/gcclib/libstdc++不是編譯器提供的標準庫。

所以,我對要傳遞給連結器的標誌感到困惑。在普通核心的頂層 Makefile 中,LD = $(CROSS_COMPILE)ld它使核心能夠使用預設的標準庫和啟動文件。對於我的核心,我LD = $(CROSS_COMPILE)ld -nostdlib -nodefaultlibs -nostartfiles按照文件中的說明使用。我從gcc 文件中了解到的是,傳遞-nostdlib給連結器就是傳遞兩個-nodefaultlibs -nostartfiles. 這些標誌之間實際上有什麼區別?

這些標誌在GCC 的規範文件中定義,因此確定它們之間差異的最佳方法是查看那裡:

gcc -dumpspecs

相關部分是link_command定義。這表明-nostdlib,-nodefaultlibs-nostartfiles產生以下影響:

  • %{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}— 這會根據需要添加libgcc, libpthread, libc,libieee使用以及 theliblibgccspec 字元串;
  • %{!nostdlib:%{!nostartfiles:%S}}— 這會添加startfile規範字元串 ,它指定要添加以處理啟動(crti.o等)的目標文件
  • %{!nostdlib:%{fvtable-verify=std: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end} %{fvtable-verify=preinit: -lvtv -u_vtable_map_vars_start -u_vtable_map_vars_end}}— 這增加了虛擬表驗證使用libvtv
  • %{!nostdlib:%{!nodefaultlibs:%{mmpx:%{fcheck-pointer-bounds: %{static:--whole-archive -lmpx --no-whole-archive %:include(libmpx.spec)%(link_libmpx)} %{!static:%{static-libmpx:-Bstatic --whole-archive} %{!static-libmpx:--push-state --no-as-needed} -lmpx %{!static-libmpx:--pop-state} %{static-libmpx:--no-whole-archive -Bdynamic %:include(libmpx.spec)%(link_libmpx)}}}}%{mmpx:%{fcheck-pointer-bounds:%{!fno-chkp-use-wrappers: %{static:-lmpxwrappers} %{!static:%{static-libmpxwrappers:-Bstatic} -lmpxwrappers %{static-libmpxwrappers: -Bdynamic}}}}}}}- 這個處理libmpx
  • %{!nostdlib:%{!nodefaultlibs:%{%:sanitize(address): %{static-libasan:%:include(libsanitizer.spec)%(link_libasan)} %{static:%ecannot specify -static with -fsanitize=address}} %{%:sanitize(thread): %{static-libtsan:%:include(libsanitizer.spec)%(link_libtsan)} %{static:%ecannot specify -static with -fsanitize=thread}} %{%:sanitize(undefined):%{static-libubsan:-Bstatic} -lubsan %{static-libubsan:-Bdynamic} %{static-libubsan:%:include(libsanitizer.spec)%(link_libubsan)}} %{%:sanitize(leak): %{static-liblsan:%:include(libsanitizer.spec)%(link_liblsan)}}}}- 這處理各種消毒選項
  • %{!nostdlib:%{!nodefaultlibs:%(link_ssp) %(link_gcc_c_sequence)}}— 這添加了堆棧保護選項並重複 C 連結序列(其庫已在開始時指定)
  • %{!nostdlib:%{!nostartfiles:%E}}— 這添加了endfile規範字元串,該字元串指定要添加以處理剩餘物(等)的crtfastmath.o目標crtend.o文件

正如您從文件中了解的那樣,-nostdlib-nodefaultlibsand的超集-nostartfiles。它還禁用虛擬表驗證。

禁用-nostdlib所有相關功能就足夠了;-nodefaultlibs並且-nostartfiles不要添加任何東西。(但提及它們也無妨。)

引用自:https://unix.stackexchange.com/questions/452187