問題タブ [position-independent-code]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
gcc - gcc および ld の位置に依存しない実行可能ファイルの -fPIE オプションは何ですか?
関数呼び出しなど、コードをどのように変更しますか?
assembly - ジャンプが絶対的か相対的かはどうすればわかりますか?
私はアセンブリのテストのために勉強していますが、「位置独立コード」の主題で、相対ジャンプと絶対ジャンプの違いがわかりにくいと感じています。ジャンプの種類をどうやって見分けるのですか?
相対ジャンプとは何か(現在の行からのオフセット)を理解しています。しかし、絶対的なジャンプはどのように見えるでしょうか? それはいつ起こりますか?
c - gcc に PIC コードで関数を直接呼び出すように強制するにはどうすればよいですか?
次の関数を検討してください。
-fpic
これは、 amd64 Linuxなしで gcc が生成するコードです。
でコンパイルすると-fpic
、gcc は PLT を介して明示的に呼び出し、シンボル挿入を有効にします。
ただし、これは位置に依存しないコードには厳密には必要ないため、サポートしたくない場合は省略できます。必要に応じて、リンカはジャンプ ターゲットを PLT シンボルに書き換えます。
ソース コードを変更したり、コンパイルされたコードを共有ライブラリに適さないものにしたりせずに、PLT を明示的に経由する代わりに、関数呼び出しをターゲットに直接送るにはどうすればよいでしょうか?
c - -fpic と -pie でコンパイルされたプログラムに再配置テーブルがあるのはなぜですか?
単純なプログラムが次のコマンドでコンパイルされた場合:
再配置エントリは次のコマンドで出力されます。
たくさんの再配置エントリ セクションがあります (以下を参照)。
-fpic / -pie フラグにより、コンパイラは位置に依存しない実行可能ファイルを生成するため、ローダーは問題なく実行可能イメージをどこにでも配置できるため、再配置テーブルは必要ないという単純な (そして明らかに間違った) 仮定があります。では、なぜそこに再配置テーブルがあるのでしょうか。これは、コードが実際には位置に依存しないことを示しているのでしょうか?
linux - 共有ライブラリはどのように GOT セクションを見つけますか?
http://eli.thegreenplace.net/2011/11/03/position-independent-code-pic-in-shared-libraries/#id1を読んでいるときに 質問が来ました:
プロセスの仮想アドレス空間のどこかにロードされた後のPIC共有ライブラリは、外部変数を参照する方法をどのように知っていますか?
問題の共有ライブラリのコードは次のとおりです。
オブジェクト コードを生成し、次に共有オブジェクト (ライブラリ) を生成します。
shara_func
共有ライブラリで 逆アセンブル:
アドレス0x6d4の命令が、 PCに相対的なアドレスを に移動することがわかります。これは、実行時に外部変数のアドレスを取得するためにPCrax
から相対的に参照される GOT のエントリであると思います (ロードされた場所に応じて実行時に解決されます) 。 . 次に、0x6dbで命令を実行した後、外部変数の実際の内容をraxに配置し、値をraxからrsi (レジスタに渡された 2 番目の関数パラメーター) に移動します。var
var
プロセス メモリには GOT が 1 つしかないと思っていましたが、ライブラリが GOT を参照していることがわかりますか? (PIC ライブラリ) がプロセス メモリのどこにロードされるかわからない場合、共有ライブラリはプロセスの GOT へのオフセットをどのように認識しますか? それとも、各共有ライブラリには、彼女と一緒に読み込まれる独自の GOT がありますか? 私の混乱を明確にしていただければ幸いです。
c - `ld -r` を使用し、シンボルが欠落している場合はコンパイル エラーを取得します
最近、新しい ELF ローダーを使い始めました。ローダーでは、アプリケーションを とリンクする必要がありますld -r
。
問題は、GCC が未定義の関数について警告しなくなり、ローダーが (明らかに) それらを見つけられないことです。
ld -r
とリンクし、未定義シンボル メソッドを取得するにはどうすればよいですか。
私はld -r
移転目的で使用しているので、移転を含める別の方法もうまくいきます。