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

C 您能在使用objdump的函数中找到本地字符数组的内存吗?,c,arrays,memory,objdump,C,Arrays,Memory,Objdump,如果我在一个函数中定义一个本地字符数组,然后使用objdump获取该特定函数的汇编代码,那么我可以在汇编代码中找到该数组的内存吗 这是我的家庭作业问题。仅在运行时(当输入函数时)在堆栈上分配本地数组。所以它不存在于可执行文件中 一个例外是静态数组。当然,只要数组具有非零初始值设定项,就应该能够找到它。下面是我为ARM制作的一个示例: char function(int i) { char arr[] = { 1, 2, 3, 4, 5, 6, 7, 8 }; return arr

如果我在一个函数中定义一个本地字符数组,然后使用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
啊哈!
0xc
处的单词将通过指向
.rodata.cst8
部分的绝对指针得到修复,这听起来像是我们想要的。让我们看一看:

$ objdump -s -j .rodata.cst8  example.o 

example.o:     file format elf32-littlearm

Contents of section .rodata.cst8:
 0000 01020304 05060708                    ........        

这就是数组的内容

什么?通过查看汇编代码,可以在运行时找出数组在内存中的位置。但是,由于数组是一个运行时概念,那么您将无法获取存储在数组中的任何值-这根本没有意义。在ASLR的今天,您至少可以在运行时找到它的内存位置。也就是说,如果您的数组具有非零初始值设定项,则该数据可能会在可执行文件中的某个位置找到,是的。我在以下位置制作了一个小的重新定位教程:
$ objdump -s -j .rodata.cst8  example.o 

example.o:     file format elf32-littlearm

Contents of section .rodata.cst8:
 0000 01020304 05060708                    ........