2017-08-03 30 views
1

objdumpで完全なアドレスを取得する方法はありますか?使用されて コマンドは次のとおりです。objdump -d prognameObjdumpで完全なアドレスが表示されない

enter image description here

先行ゼロが間違っています。次のようにアドレスは次のようになります。

enter image description here

アドレスの最後の3つの値が正しいです。しかし、私は完全なアドレスがobjdumpに表示されるのが大好きです。

+0

これらのアドレスは*ゼロ*から始まっていますか? –

+0

いいえ、edbで実行すると、アドレスは2番目のイメージとして表示されます。 –

+0

私の最初の質問は、物理アドレスか仮想アドレスを探していますか?第二に、これがユーザ空間アプリケーションであると仮定すると、 'objdump'は実行時にカーネルがどこにアプリケーションを置くかを知っておらず、物理アドレスを知る可能性は低いと考えます。 –

答えて

2

アプリケーションがロードされる前に、メモリ内のどこで終了するかを知ることはできません。

#include <stdio.h> 
int main() 
{ 
    printf("%p\n", main); 
} 

gcc test.cでそれをコンパイルし、数回実行します。

は、次のコードを試してみてください。

私の結果は:

0x55f71f8936b0 
0x5630ed7ff6b0 
0x558a18eea6b0 
... 

だから、あなたはそれがメモリ内に終了する場所を確実に知ることができません。私はそれがいつもそうとは限らないと信じています、そして、この行動はセキュリティの "もの"として意図されています。古いカーネル/ローダーがそれぞれの実行時に同じアドレスを与えても、私は驚くことはありません。私は確かにそれを知らない。もちろんobjdump

はあなたに相対アドレスを与える:

00000000000006b0 <main>: 

は、このプログラムの出力はあなたの物理アドレスを与えないことに注意してください、彼らはまだ仮想です。

点はobjdumpによってダンプアドレスがそれぞれ実行からリンカーと実際の仮想アドレスの責任であるためローダであることです。

+0

これは大変です。私は古いカーネルで作業していましたが、最近新しいカーネルに変更しました。その面白いセキュリティ機能があることに気付かなかっただけです。私が居眠りして尋ねる前に、私はしばらく探しました。私が間違ったことを探していたと思います。とにかく、情報のおかげで。 –

+0

使用しているローダによっては、シンボルの最終アドレスがobjdumpで使用できないことに注意してください。より古いローダーでは、この実行時アドレスは各実行で同じになる可能性がありますが、それは唯一の違いです。 –

関連する問題