問題タブ [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.

0 投票する
1 に答える
1338 参照

assembly - LEA 命令を使用した GAS ASM PIE x86-64 アクセス変数

.datax86-64 arch で位置に依存しない方法で sectionから変数にアクセスできる GAS 構文を使用して、 32 ビットarch と IS (%eipの代わりに) を適用するアセンブリ プログラムを作成しようとしています%rip

どのレジスタを試しても、得られた最良の結果は であり、Segmentation fault: 11それでさえ、まったく実行できないはずの EIP、つまり SF にアクセスするためのものでした。少なくとも「まあ、それはうまくいかない」以外のことを教えてくれたので、最良の結果です。

私はgccmacOS 10.13.6 mid 2010 Intel Core 2 Duo でファイルをコンパイルしています (それがclangおそらく理由です):

これを使用して、いくつかのオプションをリンカーに渡します。

ld: 警告: PIE が無効になっています。絶対アドレス指定 (おそらく -mdynamic-no-pic) は、コード署名された PIE では許可されていませんが、/whatever.../test-a07cf9.o の _main で使用されています。この警告を修正するには、-mdynamic-no-pic を使用してコンパイルしたり、-Wl、-no_pie を使用してリンクしたりしないでください。ld: 致命的な警告によってエラーが発生しました (-fatal_warnings)。 -v 呼び出しを表示します) 1


test.s

./a.out; echo $?最後からEAX値を確認するために実行していますret

さまざまな情報源を調べましたが、ほとんどはインテルの構文またはこれらの質問の123です。私が思いついた最も単純なCの例、つまりグローバル変数 +returnからmain()-を逆アセンブルしようとしましたgcc -S test.c -fPIE -pie -fpie -m32:

基本的に次の結果になりました。

これは明らかにMOVをLEAとして使用し、私のものとほぼ同じ命令を使用しますが、セクションに入るために-L0$pb+/-のようなアドレスの_var1-アドレスの部分を除きます。L0$pb.data

var1それでも、_mainラベルと同じアプローチを試してみると、何もありません:

私が間違っていることは何ですか?

編集:

逆アセンブルされた C の例から不要なものを切り取り、最終的には次のようになりました。

このガイドによると、呼び出し元は 1) パラメータをスタックにプッシュする (なし) 2)callラベルと呼び出し先は実際に ESP、EBP、およびその他のレジスタを操作する必要があるため、私にはあまり意味がありません。また、なぜ中間のラベルが必要なのか、もっと言えば、それなしで方法はありますか?

0 投票する
2 に答える
2246 参照

unix - 2 つのプロセスが同じ共有ライブラリを共有するにはどうすればよいですか?

私は共有ライブラリがどのように機能するかをよりよく理解しようとしてきましたが、2 つのことについて頭を悩ますことができません。

1-各プロセスには独自の仮想メモリ空​​間とページテーブルがあるため、共有ライブラリが1つのプロセス仮想メモリ空​​間にロードされた場合、2番目のプロセスはメモリ空間にないため、どのようにしてその共有ライブラリにアクセスできますか?

2- テキスト セクションのみが共有され、グローバル データは共有されないことを理解しています。これはどのように可能ですか? 私の理解では、グローバル変数への各参照はグローバル オフセット テーブル(略して GOT) を介して行われます。したがって、このコード行がある場合、これは、GOT のベース値として使用されるアセンブリのx = globようなものとほぼ同じになります。しかし、この場合、どのプロセスがその行を呼び出しても、GOT のオフセット 0x10 にあるアドレスを持つ同じグローバル変数に常にアクセスすることは明らかです。では、2 つのプロセスが同じ GOT エントリを参照する同じテキスト セクションを使用する場合、どのようにしてグローバル変数の異なるコピーを持つことができるのでしょうか?mov eax,DWORD PTR [ecx-0x10]ecx