私はLinuxカーネルにC ++ランタイムと例外のサポートを追加しています。これを行うには、コンパイラが提供する標準ライブラリのlib/gcc
代わりに独自のライブラリを提供する必要があります。lib/libstdc++
だからリンカーに渡すフラグについて混乱しています。通常のカーネルの最上位のMakefileでは、LD = $(CROSS_COMPILE)ld
カーネルがデフォルトの標準ライブラリと起動ファイルを使用できるようにします。私のカーネルの場合は、LD = $(CROSS_COMPILE)ld -nostdlib -nodefaultlibs -nostartfiles
マニュアルの指示に従いました。私が何を学んだのかGCCドキュメント-nostdlib
リンカーに渡すことは、両方を渡すことです-nodefaultlibs -nostartfiles
。このフラグの実際の違いは何ですか?
答え1
これらのフラグは次に定義されます。GCC仕様ファイルしたがって、2つの違いを確認するための最良の方法は、次の点を見ることです。
gcc -dumpspecs
関連部分はlink_command
定義です。これは、次の効果があることを-nostdlib
示し-nodefaultlibs
ています-nostartfiles
。
%{!nostdlib:%{!nodefaultlibs:%:pass-through-libs(%(link_gcc_c_sequence))}}
- 必要に応じて追加されますlibgcc
。libpthread
libc
libieee
マクロlib
仕様文字列libgcc
%{!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
-nostartfiles
したがって、関連するすべての機能を無効にして何も追加しないで-nostdlib
ください。 (しかし、言及するのは悪くありません。)-nodefaultlibs
-nostartfiles