1

関数内でローカル文字配列を定義し、objdump を使用してその特定の関数のアセンブリ コードを取得した場合、アセンブリ コード内でその配列のメモリを見つけることができますか?

これは宿題についての質問です。

4

2 に答える 2

3

確かに、配列にゼロ以外の初期化子がある限り、それを見つけることができるはずです。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                    ........        

配列の内容が表示されます。

于 2013-07-27T16:21:17.330 に答える
1

ローカル配列は、実行時のみ (関数に入ったとき) にスタックに割り当てられます。したがって、実行可能ファイルには存在しません。

例外はstatic配列です。

于 2013-07-27T16:12:34.383 に答える