objdumpで完全なアドレスを取得する方法はありますか?使用されて コマンドは次のとおりです。objdump -d progname
Objdumpで完全なアドレスが表示されない
先行ゼロが間違っています。次のようにアドレスは次のようになります。
アドレスの最後の3つの値が正しいです。しかし、私は完全なアドレスがobjdumpに表示されるのが大好きです。
objdumpで完全なアドレスを取得する方法はありますか?使用されて コマンドは次のとおりです。objdump -d progname
Objdumpで完全なアドレスが表示されない
先行ゼロが間違っています。次のようにアドレスは次のようになります。
アドレスの最後の3つの値が正しいです。しかし、私は完全なアドレスがobjdumpに表示されるのが大好きです。
アプリケーションがロードされる前に、メモリ内のどこで終了するかを知ることはできません。
#include <stdio.h>
int main()
{
printf("%p\n", main);
}
はgcc test.c
でそれをコンパイルし、数回実行します。
は、次のコードを試してみてください。
私の結果は:
0x55f71f8936b0
0x5630ed7ff6b0
0x558a18eea6b0
...
だから、あなたはそれがメモリ内に終了する場所を確実に知ることができません。私はそれがいつもそうとは限らないと信じています、そして、この行動はセキュリティの "もの"として意図されています。古いカーネル/ローダーがそれぞれの実行時に同じアドレスを与えても、私は驚くことはありません。私は確かにそれを知らない。もちろんobjdump
の
はあなたに相対アドレスを与える:
00000000000006b0 <main>:
は、このプログラムの出力はあなたの物理アドレスを与えないことに注意してください、彼らはまだ仮想です。
点はobjdump
によってダンプアドレスがそれぞれ実行からリンカーと実際の仮想アドレスの責任であるためローダであることです。
これは大変です。私は古いカーネルで作業していましたが、最近新しいカーネルに変更しました。その面白いセキュリティ機能があることに気付かなかっただけです。私が居眠りして尋ねる前に、私はしばらく探しました。私が間違ったことを探していたと思います。とにかく、情報のおかげで。 –
使用しているローダによっては、シンボルの最終アドレスがobjdumpで使用できないことに注意してください。より古いローダーでは、この実行時アドレスは各実行で同じになる可能性がありますが、それは唯一の違いです。 –
これらのアドレスは*ゼロ*から始まっていますか? –
いいえ、edbで実行すると、アドレスは2番目のイメージとして表示されます。 –
私の最初の質問は、物理アドレスか仮想アドレスを探していますか?第二に、これがユーザ空間アプリケーションであると仮定すると、 'objdump'は実行時にカーネルがどこにアプリケーションを置くかを知っておらず、物理アドレスを知る可能性は低いと考えます。 –