リンカーフラグの違い

リンカーフラグの違い

私は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))}}- 必要に応じて追加されますlibgcclibpthreadlibclibieeeマクロ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.ocrtend.o

ドキュメントが示すように、銀と-nostdlibの親セットです。また、仮想テーブルの検証も無効になります。-nodefaultlibs-nostartfiles

したがって、関連するすべての機能を無効にして何も追加しないで-nostdlibください。 (しかし、言及するのは悪くありません。)-nodefaultlibs-nostartfiles

おすすめ記事