假设此c代码:
int main(){
return 0;
}
gcc在正常运行的linux机器上使用编译,并objdump -d在输出上显示以下内容:
00000000004004cd <main>:
4004cd: 55 push %rbp
4004ce: 48 89 e5 mov %rsp,%rbp
4004d1: b8 00 00 00 00 mov $0x0,%eax
...
我可以breakpoints使用0x4004cd地址轻松地在gdb中进行设置。
在Docker容器中执行相同操作的左侧(5fa)处有奇怪的内存地址,我无法在这些地址上设置断点。为什么会这样呢?
00000000000005fa <main>:
5fa: 55 push %rbp
5fb: 48 89 e5 mov %rsp,%rbp
5fe: b8 00 00 00 00 mov $0x0,%eax
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
为什么会这样呢?
Docker容器中的编译器默认配置为构建与位置无关的可执行文件。
您可以通过运行进行验证file a.out,它应该显示ELF 64-bit LSB pie executable在docker中以及ELF 64-bit LSB executable, x86-64它外部。
您可以使用禁用构建PIE gcc -no-pie -fno-pie ...。
我不能在他们身上断点
您不能在指令的断点,0x5fa因为这不是二进制文件实际运行的地址。相反,请执行以下操作:
(gdb) start
(gdb) disas main
上面的命令将向您显示二进制文件在运行时的重定位位置,现在您应该能够在重定位的地址上设置断点。