开发者社区 问答 正文

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

假设此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

展开
收起
kun坤 2019-11-29 11:27:04 773 分享 版权
1 条回答
写回答
取消 提交回答
  • 为什么会这样呢?
    
    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
    上面的命令将向您显示二进制文件在运行时的重定位位置,现在您应该能够在重定位的地址上设置断点。
    
    
    2019-11-29 11:27:14
    赞同 展开评论
问答标签:
问答地址: