phr*_*xOS 5 c virtual static gdb execve
第一次海报.第二年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;
}
Run Code Online (Sandbox Code Playgroud)
要求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
Run Code Online (Sandbox Code Playgroud)
[剪断]
假设(请更正):此程序集存在于可执行文件中,由load_elf_binary()或execve()启动的一系列函数运行.我没有at&t(基本的英特尔)语法知识,但是直觉上我也看不出这些指令如何构建数组.看起来他们只是一起添加寄存器值.
结论:我想尽可能多地了解这个静态数组的生命周期,尤其是构建它的"缺失代码"在哪里,我该如何看待它?或者更好的是我如何调试(逐步执行)加载程序进程?我曾尝试设置之前,在__start_libc条目(或类似的东西)主要断点,但不能确定任何事情在这方面大有可为.
链接到其他信息非常棒!谢谢你的时间!
的初始化程序staticVar存储在.data可执行文件的部分中。使用objdump(例如,如何在 Linux 上检查 ELF 文件的数据部分的内容?)应该会为您的文件显示如下内容:
./test: file format elf64-x86-64
Contents of section .data:
00d2c0 00000000 00000000 00000000 00000000 ................
00d2d0 00000000 00000000 00000000 00000000 ................
00d2e0 01000000 02000000 03000000 04000000 ................
00d2f0 05000000 06000000 07000000 08000000 ................
00d300 09000000 ffffffff 00000000 00000000 ................
00d310 00000000 00000000 00000000 00000000 ................
Run Code Online (Sandbox Code Playgroud)
可执行文件中的内容直接映射到进程的地址空间,因此不需要任何代码来创建数据。操作的代码staticVar将直接使用内存指针引用内容;例如,对于您发布的循环,gcc -S给了我这个:
18 .L5:
19 0013 90 nop
20 .L2:
21 0014 4863C3 movslq %ebx, %rax
22 0017 8B148500 movl staticVar.1707(,%rax,4), %edx
22 000000
23 001e 8B45F4 movl -12(%rbp), %eax
24 0021 01D0 addl %edx, %eax
25 0023 8945F4 movl %eax, -12(%rbp)
26 0026 83C301 addl $1, %ebx
27 0029 83FB0A cmpl $10, %ebx
28 002c 75E5 jne .L5
Run Code Online (Sandbox Code Playgroud)
该静态数组的生命周期将是进程的生命周期,类似于全局变量。无论如何,没有代码可以构建它。这只是内存中的一些数据。
P/S:您可能需要添加volatile,如下sum所示:volatile int sum = 0;否则gcc可能会优化它,因为从未使用 sum 的结果值。
| 归档时间: |
|
| 查看次数: |
2496 次 |
| 最近记录: |