![](/img/trans.png)
[英]Undefined reference, but objdump shows the function is in the object file?
[英]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.