运行 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
以上命令将向您显示二进制文件在运行时重定位的位置,您现在应该能够在重定位地址上设置断点。
假设此 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
以上命令将向您显示二进制文件在运行时重定位的位置,您现在应该能够在重定位地址上设置断点。