Решил вспомнить работу с gdb. (Linux 64)
Вот простая программа
| Код | #include <unistd.h>
int main(int argc, char* argv[]) { char str[] = "Hello, world!\n"; write(1, str, sizeof(str) - 1); _exit(0); }
|
Собираем, запускаем gdb, выводим код
| Код | gcc -g -o hello hello.c gdb -q ./hello Reading symbols from /home/kirichenko/tmp/asm/hello...done. (gdb) break main Breakpoint 1 at 0x400543: file hello.c, line 5. (gdb) run Starting program: /home/kirichenko/tmp/asm/hello
Breakpoint 1, main (argc=1, argv=0x7fffffffe298) at hello.c:5 5 char str[] = "Hello, world!\n"; (gdb) disassemble main Dump of assembler code for function main: 0x0000000000400534 <+0>: push %rbp 0x0000000000400535 <+1>: mov %rsp,%rbp 0x0000000000400538 <+4>: sub $0x20,%rsp 0x000000000040053c <+8>: mov %edi,-0x14(%rbp) 0x000000000040053f <+11>: mov %rsi,-0x20(%rbp) => 0x0000000000400543 <+15>: movl $0x6c6c6548,-0x10(%rbp) 0x000000000040054a <+22>: movl $0x77202c6f,-0xc(%rbp) 0x0000000000400551 <+29>: movl $0x646c726f,-0x8(%rbp) 0x0000000000400558 <+36>: movw $0xa21,-0x4(%rbp) 0x000000000040055e <+42>: movb $0x0,-0x2(%rbp) 0x0000000000400562 <+46>: lea -0x10(%rbp),%rax 0x0000000000400566 <+50>: mov $0xe,%edx 0x000000000040056b <+55>: mov %rax,%rsi 0x000000000040056e <+58>: mov $0x1,%edi 0x0000000000400573 <+63>: callq 0x400428 <write@plt> 0x0000000000400578 <+68>: mov $0x0,%edi 0x000000000040057d <+73>: callq 0x400418 <_exit@plt> End of assembler dump.
|
Дальше я выполняю несколько раз ni, чтобы в rbp - 0x10 и ниже записалось несколько адресов. На сколько я понимаю, где то среди этих адресов должен быть адрес на строку Hello, world. Но почему то не могу посмотреть память
| Код | // 5 раз ni (gdb) x/4xw $rbp - 0x10 0x7fffffffe1a0: 0x6c6c6548 0x77202c6f 0x646c726f 0x00000a21 // Я вижу те самые адресса (gdb) x/s 0x6c6c6548 0x6c6c6548: <Address 0x6c6c6548 out of bounds> (gdb) x/s 0x77202c6f 0x77202c6f: <Address 0x77202c6f out of bounds> (gdb) x/s 0x646c726f 0x646c726f: <Address 0x646c726f out of bounds>
|
Но посмотреть, что в них не могу. Раньше не работал с gdb на 64 разрядной машине. Сейчас же не пойму, где мне найти мой hello world.
Добавлено @ 19:36 Нашел. Оказывается строка на прямую пишется. 0x6c6c6548 это уже символы в обратном порядке. |