gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:21:52 24 4
gpt4 key购买 nike

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

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

在Docker容器中执行相同操作的左侧( 5fa)端具有奇怪的内存地址,而我无法在这些地址上设置断点。为什么会这样呢?
00000000000005fa <main>:
5fa: 55 push %rbp
5fb: 48 89 e5 mov %rsp,%rbp
5fe: b8 00 00 00 00 mov $0x0,%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 - 在docker下运行objdump显示不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59094256/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com