第一次海报。CS二年级学生。
我正在探索在 C 源代码->GCC 编译->Linux 执行环境的上下文中在虚拟地址空间的 .data 部分中创建静态变量。
C程序是test.c
int main()
{
register int i = 0;
register int sum = 0;
static int staticVar[10] = {1,2,3,4,5,6,7,8,9,-1};
Loop:
sum = sum + staticVar[i]; //optimized away
i = i+1;
if(i != 10)
goto Loop;
return 0;
}
要求 GDB ' disass /m
' 显示没有用于创建 staticVar[] 的代码,因为检查 .s 文件显示该变量驻留在虚拟地址空间的读/写 .data 段中,该段在创建进程时已放置在那里(这个过程是我感兴趣的)。
检查(我虽然它是' readelf -A test.o
')的输出,目标文件包含我假设是在数据段中创建数组的程序集。这是 ELF 输出。
(如果你能告诉我是什么命令生成了这个输出,那么奖励。我无法使用 readelf 复制它。我从网站上获取了命令并保存了输出。我不记得是如何生成的)
[剪辑]
00000000 <staticVar.1359>:
0:01 00 add %eax,(%eax)
2:00 00 add %al,(%eax)
4:02 00 add (%eax),%al
6:00 00 add %al,(%eax)
8:03 00 add (%eax),%eax
a:00 00 add %al,(%eax)
c:04 00 add $0x0,%al
e:00 00 add %al,(%eax)
10:05 00 00 00 06 add $0x6000000,%eax
15:00 00 add %al,(%eax)
17:00 07 add %al,(%edi)
19:00 00 add %al,(%eax)
1b:00 08 add %cl,(%eax)
1d:00 00 add %al,(%eax)
1f:00 09 add %cl,(%ecx)
21:00 00 add %al,(%eax)
23:00 ff add %bh,%bh
25:ff (bad)
26:ff (bad)
27:ff .byte 0xff
[剪辑]
假设(请正确):该程序集存在于可执行文件中,由 load_elf_binary() 或 execve() 启动的一系列函数的某些部分运行。我没有 at&t(基本英特尔)语法知识,但即使直观地我也看不到这些指令如何构建数组。看起来他们只是将寄存器值加在一起。
底线:我想尽可能多地了解这个静态数组的生命周期,特别是构建它的“缺失代码”在哪里以及如何查看它?或者更好的是如何调试(逐步执行)加载程序过程?我曾尝试在 __start_libc 条目(或类似条目)的 main 之前设置断点,但无法确定该区域有任何前景。
附加信息的链接很棒!谢谢你的时间!