英文:
Where is the data string located in this disassembly?
问题
I am going through the OS-dev book by Nick Blundell and I am disassembling the code in section 5.1.4.
Specifically, I have this c code stored in string.c
:
void my_function()
{
char* str = "Hello";
}
I compile it in 32-bit mode (since I am on 64-bit Linux) this way:
gcc -ffreestanding -fno-pie -m32 -c string.c -o string.o
Linking step:
ld -m elf_i386 -o string.bin -Ttext 0x0 --oformat binary string.o
And disassembly:
ndisasm -b 32 string.bin > string.dis
And here is my result:
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
I see that the compiler is allocating 16 bytes on the third line but I don't see where the "Hello" string is located. I especially don't understand what happens at the 4th line.
Any help would be appreciated.
英文:
I am going through the OS-dev book by Nick Blundell and I am disassembling the code in section 5.1.4.
Specifically, I have this c code stored in string.c
:
void my_function()
{
char* str = "Hello";
}
I compile it in 32-bit mode (since I am on 64-bit linux) this way:
gcc -ffreestanding -fno-pie -m32 -c string.c -o string.o
Linking step:
ld -m elf_i386 -o string.bin -Ttext 0x0 --oformat binary string.o
And disassembly:
ndisasm -b 32 string.bin > string.dis
And here is my result:
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
I see that the compiler is allocating 16-bytes on the third line but I don't see where the "hello" string is located. I especially don't understand what happens at the 4th line.
Any help would be appreciated.
答案1
得分: 1
0x1000
不要在代码段中查找字符串。它们不在那里。唯一不属于序言或尾声的指令是 mov dword [ebp-0x4],0x1000
,它明显将局部变量 str
设置为 0x1000
。我们知道 str
指向该字符串。
字符串不在文本段中。它们位于rodata段中。你在链接时是否省略了rodata段?
(你以 -O0 编译。因此,未使用的代码变量分配未被删除。)
英文:
0x1000
Don't look for strings in the code segment. That's not where they are. The only instruction that is not part of the prologue or epilogue is mov dword [ebp-0x4],0x1000
; which is clearly setting the local variable str
to 0x1000
. And we know that str
points to the string.
Strings aren't in the text segment. They're in the rodata segment. Did you omit the rodata segment on linking?
(You compiled at -O0. Thus the dead code variable assignment was not removed.)
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论