为什么GDB和Objdump的指令地址是一样的?

Why addresses of instructions from GDB and Objdump are the same?

我正在研究逆向工程,这真的很有趣。

但是我有一个问题:为什么我从GDBObjdump得到的指令地址是一样的?

不应该每次都在不同的地址加载二进制文件吗?

谢谢。 朱利安

GDB 默认禁用 ASLR。如果您 set disable-randomization off,那么 PIE 可执行文件(位置独立)将加载到随机地址,即使您 run 它来自 GDB 内部也是如此。

有关 PIE 的更多信息,请参阅 32-bit absolute addresses no longer allowed in x86-64 Linux?

Position-dependent 可执行文件 always 在同一地址加载,只有它们的堆栈地址可以随机化。 code+data 可以将地址硬编码为 32 位绝对地址,并且它们不包含完成该操作的每个位置的重定位信息。 (例如 mov $string, %edicall puts)。

查看 Hello World 的 gcc 代码生成 with/without -fPIE on the Godbolt compiler explorer.

.LC0:
    .string "Hello World!"
main:
    lea     rdi, .LC0[rip]     # RIP-relative with -fPIE
    sub     rsp, 8
    call    puts@PLT
    xor     eax, eax
    add     rsp, 8
    ret

但是使用 -fno-PIE(Godbolt 上的默认设置,现代 Linux 发行版通常不是默认设置),你会得到 mov edi, OFFSET FLAT:.LC0,一个 32 位绝对地址。

(其余代码相同,除了它发出 call puts 并让链接器将其转换为 call puts@PLT。使用 -fno-plt 内联间接 call 通过 GOT 地址。)