运行 docker 下的 objdump 显示不同的结果

Running objdump under docker shows different result

假设此 c 代码:

int main(){
 return 0;
}

在普通 运行 linux 机器下使用 gcc 编译,运行 objdump -d 输出显示如下:

00000000004004cd <main>:
  4004cd:   55                      push   %rbp
  4004ce:   48 89 e5                mov    %rsp,%rbp
  4004d1:   b8 00 00 00 00          mov    [=13=]x0,%eax
...

我可以使用 0x4004cd 地址在 gdb 中轻松设置 breakpoints

在 Docker 容器中执行相同的操作在左侧 (5fa) 有奇怪的内存地址,我无法在它们上设置断点。为什么会这样?

00000000000005fa <main>:
 5fa:   55                      push   %rbp
 5fb:   48 89 e5                mov    %rsp,%rbp
 5fe:   b8 00 00 00 00          mov    [=14=]x0,%eax

Why is this happening?

您的 Docker 容器中的编译器默认配置为构建 position-independent executables

您可以通过 运行 file a.out 来验证这一点,它应该在 docker 中显示 ELF 64-bit LSB pie executable,在其外部显示 ELF 64-bit LSB executable, x86-64

您可以通过以下方式禁用构建 PIE:gcc -no-pie -fno-pie ...

I can't breakpoint on them

您不能在 0x5fa 处的指令上设置断点,因为那不是二进制文件实际运行的地址。相反,这样做:

(gdb) start
(gdb) disas main

以上命令将向您显示二进制文件在运行时重定位的位置,您现在应该能够在重定位地址上设置断点。