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 回答