Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在docker下运行objdump会显示不同的结果_C_Docker_Gcc_Gdb_Objdump - Fatal编程技术网

在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
?它是起始位置的偏移量吗?@Josh
0x5fa
是代码的相对地址。它是相对于二进制文件实际加载的地址,而这个地址只有在运行时才知道。那么,它将加载的位置的偏移量呢?@Josh,这不是我说的吗?“相对于x的偏移量”和“相对于x的地址”是同义词。