如果我在函数中定义一个局部字符数组然后使用objdump来获取该特定函数的汇编代码,我可以在汇编代码中找到该数组的内存吗?
这是我的家庭作业问题。
答案 0 :(得分:2)
当然,只要您的阵列具有非零初始值设定项,您就应该能够找到它。这是我为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
的{{1}}?这将由链接器修复以指向数组。我们去看一下搬迁表:
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
上的单词将通过指向0xc
部分的绝对指针来修复 - 这听起来像我们想要的。我们来看看:
.rodata.cst8
你有阵列的内容!
答案 1 :(得分:1)
仅在运行时在堆栈上分配本地数组(当输入函数时)。所以它不存在于可执行文件中。
例外是static
数组。