你能用objdump在函数中找到本地字符数组的内存吗?

时间:2013-07-27 16:05:57

标签: c arrays memory objdump

如果我在函数中定义一个局部字符数组然后使用objdump来获取该特定函数的汇编代码,我可以在汇编代码中找到该数组的内存吗?

这是我的家庭作业问题。

2 个答案:

答案 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数组。