GCCで組み込みプログラミングを行っています。Cコードで画像のベースアドレスを取得するにはどうすればよいですか?
PSリンカースクリプトで変数を設定できることはわかっています。しかし、わざわざスクリプトを変更せずにそれを達成する方法は他にありますか?
前もって感謝します。
私があなたの質問を正しく理解していれば、ベースアドレスを明示的に設定するのではなく、出力の一部としてベースアドレスが何に設定されたかを知りたいと考えています。
リンカーに引数を渡すことにより、コンパイルの一部としてマップ ファイルを生成できます。例えば:
gcc -Wall -o hello_world.exe -Wl,-Map,hello_world.map hello_world.c
関連するセクションは、オプションをリンカーに-Wl,-Map,hello_world.map
渡し、ファイルを生成するように指示していることを意味します。-Map
hello_world.map
結果の出力には多くの情報が含まれていますが、次のようなセクションを探しています。
Linker script and memory map
0x00400000 __image_base__ = 0x400000
0x00000000 __dll__ = 0x0
0x00400000 ___ImageBase = 0x400000
0x00001000 __section_alignment__ = 0x1000
0x00000200 __file_alignment__ = 0x200
0x00000004 __major_os_version__ = 0x4
0x00000000 __minor_os_version__ = 0x0
0x00000001 __major_image_version__ = 0x1
0x00000000 __minor_image_version__ = 0x0
0x00000004 __major_subsystem_version__ = 0x4
0x00000000 __minor_subsystem_version__ = 0x0
0x00000003 __subsystem__ = 0x3
0x00200000 __size_of_stack_reserve__ = 0x200000
0x00001000 __size_of_stack_commit__ = 0x1000
0x00100000 __size_of_heap_reserve__ = 0x100000
0x00001000 __size_of_heap_commit__ = 0x1000
0x00000000 __loader_flags__ = 0x0
0x00008000 __dll_characteristics__ = 0x8000
画像のベース アドレスと、スタック、ヒープ (ある場合)、およびすべての関数の場所が明確に表示されている必要があります。