Linux
連結器標誌之間的區別
我正在向 Linux 核心添加 c++ 執行時和異常支持。為此,我需要提供自己的
lib/gcc
而lib/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
使用宏以及 thelib
和libgcc
spec 字元串;%{!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
是-nodefaultlibs
and的超集-nostartfiles
。它還禁用虛擬表驗證。禁用
-nostdlib
所有相關功能就足夠了;-nodefaultlibs
並且-nostartfiles
不要添加任何東西。(但提及它們也無妨。)