我正在浏览Nick Blundell的OS-dev书籍,并在5.1.4节中反汇编代码。
具体来说,我将以下c代码存储在string.c
中:
void my_function()
{
char* str = "Hello";
}
字符串
我在32位模式下编译它(因为我在64位Linux上),如下所示:gcc -ffreestanding -fno-pie -m32 -c string.c -o string.o
个
连接步骤:ld -m elf_i386 -o string.bin -Ttext 0x0 --oformat binary string.o
个
和拆卸:ndisasm -b 32 string.bin > string.dis
个
这是我的结果:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C745FC00100000 mov dword [ebp-0x4],0x1000
0000000D 90 nop
0000000E C9 leave
0000000F C3 ret
型
我看到编译器在第三行分配了16个字节,但我没有看到“hello”字符串的位置。我不明白第四行发生了什么。
如果你能帮忙的话,我将不胜感激。
1条答案
按热度按时间eanckbw91#
0x1000
不要在代码段中查找字符串。他们不在那里。唯一不属于序言或尾声的指令是
mov dword [ebp-0x4],0x1000
;这显然是将局部变量str
设置为0x1000
。我们知道str
指向字符串。字符串不在文本段中。他们是在rodata部分。你是否在链接时省略了rodata段?
(You编译在-O 0。因此,没有删除无效代码变量赋值。)