簡體   English   中英

在 docker 下運行 objdump 顯示不同的結果

[英]Running objdump under docker shows different result

假設這個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
...

我可以使用0x4004cd地址輕松地在 gdb 中設置breakpoints

在 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 ,以及ELF 64-bit LSB executable, x86-64在它之外。

您可以使用以下命令禁用構建 PIE: gcc -no-pie -fno-pie ...

我不能在它們上斷點

您不能在0x5fa處對指令設置斷點,因為那不是二進制文件實際運行的地址。 相反,請執行以下操作:

(gdb) start
(gdb) disas main

上面的命令將向您顯示二進制文件在運行時重新定位的位置,您現在應該能夠在重新定位的地址上設置斷點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM