動的リンカの再配置と、プロシージャのリンクテーブルやグローバルオフセットテーブルを含む位置に依存しないコードについて、たくさん読んだ。静的にリンクされた実行可能ファイルにPLTとGOTが必要な理由がわかりません。私はubuntu x86_64マシンでhello worldプログラムをコンパイルしました。セクションヘッダーをダンプすると、readelf -S
PLTセクションとGOTセクションが表示されます。
また、コンパイルせgcc -shared
ずにコンパイルした単純なインクリメント関数を使用して共有ライブラリを作成しました-fpic
。PLTセクションとGOTセクションも表示されます。私もこれを期待していませんでした。
静的にリンクされた実行可能ファイルにPLTとGOTが必要な理由がわかりません。
そうではありません。
ubuntu x86_64マシンでhello worldプログラムをコンパイルしました。readelf-Sでセクションヘッダーをダンプすると、PLTセクションとGOTセクションが表示されます。
これは実装の事故です。セクションから来crt1.o
て、独立した存在ではありませんcrt1s.o
あなたがで終わるので、完全に静的リンク用.plt
および.got
そこからのエントリ。
これらのセクションを削除しても、バイナリは引き続き機能します。
objcopy -R.got -R.plt a.out a.out2
注:は.rela.plt
実装しないでください。そのセクションはを実装するために必要ですIFUNC
。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加