関数内でローカル文字配列を定義し、objdump を使用してその特定の関数のアセンブリ コードを取得した場合、アセンブリ コード内でその配列のメモリを見つけることができますか?
これは宿題についての質問です。
確かに、配列にゼロ以外の初期化子がある限り、それを見つけることができるはずです。ARM用に作成した例を次に示します。
char function(int i)
{
char arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
return arr[i];
}
それを構築します。
$ clang -O2 -Wall -c -o example.o example.c
出力を逆アセンブルします。
$ objdump -d example.o
example.o: file format elf32-littlearm
Disassembly of section .text:
00000000 <function>:
0: e59f1004 ldr r1, [pc, #4] ; c <function+0xc>
4: e7d10000 ldrb r0, [r1, r0]
8: e12fff1e bx lr
c: 00000000 .word 0x00000000
.word 0x0000000
うーん -オフセットにあることに注意して0xc
ください。これは、配列を指すようにリンカーによって修正されます。再配置テーブルをチェックしてみましょう。
$ objdump -r example.o
example.o: file format elf32-littlearm
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
00000008 R_ARM_V4BX *ABS*
0000000c R_ARM_ABS32 .rodata.cst8
あはは!at という単語0xc
は、セクションへの絶対ポインターで固定されます.rodata.cst8
。これは、私たちが望んでいるように聞こえます。見てみましょう:
$ objdump -s -j .rodata.cst8 example.o
example.o: file format elf32-littlearm
Contents of section .rodata.cst8:
0000 01020304 05060708 ........
配列の内容が表示されます。
ローカル配列は、実行時のみ (関数に入ったとき) にスタックに割り当てられます。したがって、実行可能ファイルには存在しません。
例外はstatic
配列です。