在docker下运行objdump会显示不同的结果
假设此在docker下运行objdump会显示不同的结果,c,docker,gcc,gdb,objdump,C,Docker,Gcc,Gdb,Objdump,假设此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 m
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 $0x0,%eax
...
为什么会这样
00000000000005fa <main>:
5fa: 55 push %rbp
5fb: 48 89 e5 mov %rsp,%rbp
5fe: b8 00 00 00 00 mov $0x0,%eax
默认情况下,Docker容器中的编译器配置为生成
您可以通过运行文件a.out
来验证这一点,该文件应在docker中显示ELF 64位LSB饼图可执行文件
,并在docker外部显示ELF 64位LSB可执行文件x86-64
您可以使用以下命令禁用生成饼图:gcc-no-PIE-fno-PIE…
我不能在他们身上设置断点
您不能在指令上的0x5fa
处设置断点,因为该地址不是二进制文件实际运行的地址。相反,请执行以下操作:
(gdb) start
(gdb) disas main
上面的命令将向您显示二进制文件在运行时重新定位的位置,您现在应该能够在重新定位的地址上设置断点。非常感谢,那么在这种情况下,什么是
5fa
?它是起始位置的偏移量吗?@Josh0x5fa
是代码的相对地址。它是相对于二进制文件实际加载的地址,而这个地址只有在运行时才知道。那么,它将加载的位置的偏移量呢?@Josh,这不是我说的吗?“相对于x的偏移量”和“相对于x的地址”是同义词。