2011-05-09 59 views
1
<http://www.gnu.org/software/gdb/bugs/>... 
Reading symbols from /root/ctest/printf...(no debugging symbols found)...done. 
(gdb) disas main 
Dump of assembler code for function main: 
0x0000000000400498 <main+0>: push %rbp 
0x0000000000400499 <main+1>: mov %rsp,%rbp 
0x000000000040049c <main+4>: sub $0x10,%rsp 

如何GDB解釋main時沒有調試符號裝?當沒有調試符號加載時,gdb如何解釋`main`?

回答

2

GDB不 「解釋」 main

如果您的問題是「GDB如何知道main的位置」,答案是:「因爲它的地址在符號表中」(請參閱​​nm /root/ctest/printf的輸出)。在UNIX上(與Windows不同),不需要調試符號就可以在可執行文件(或共享庫)中使用函數和全局變量名稱 - 它們在默認情況下保存(以便更容易調試)。如果你想隱藏你main,你可以運行strip printf從可執行文件中刪除它(和所有其他符號)。

對於第二個問題,main沒有被破壞,因爲它有extern "C"鏈接。它必須有這種連接,所以可以從程序集中調用它(它由C運行時啓動調用,通常爲crt1.o)。

+1

我有兩個問題:1.爲什麼還會出現'main'未加載調試符號時符號2.爲何名字'main'不manglinged走? – kernel 2011-05-09 05:23:27

+0

因此對於C++ ABI,'disas main'將不起作用? – kernel 2011-05-09 05:49:06

0

main是不是一個調試符號,所以不剝離。它具有外部鏈接,所以它將被保留,除非明確的條或鏈接命令將其刪除。它沒有被破壞,因爲在大多數平臺上,C ABI中沒有名稱(除了可能附加下劃線或類似名稱)。

鏈接器和其他工具能夠確定什麼是符號調試符號,哪些是EXTERN或私立機構等,因爲它們是在符號表中標明不同。例如,在Mac OS X上,我們可能會看到這樣的事情:

    U _constantFromAnotherModule 
0000000000000018 T _externFunction 
0000000000000410 s _privateInt 
0000000000000000 t _staticFunction 

中間列不同的字母,符號的名字前,表示不同類型的連接,它們是由工具區別對待。

即使符號錯位,工具通常知道如何撤消的是混淆,所以調試器應該能夠找到,即使它已經錯位符號表函數名,只要它建通過與調試器兼容的工具。除此之外,C++中的main()具有C鏈接,並且遵循平臺的C ABI,所以它通常不會被破壞。

+0

我有兩個相應的問題:1.如何判斷一個符號是否是調試符號?2.對於C++ ABI,disas main不起作用? – kernel 2011-05-09 05:39:45

+0

調試符號和其他符號有什麼區別?是不是所有的符號都用於調試目的?說,如果你去掉它的符號,它仍然有效。 – kernel 2011-05-09 06:03:05

+0

@kernel:不,所有符號都不用於調試。符號(或其他形式的簿記)是鏈接器運行所必需的。我的示例中沒有符號是調試符號。 – 2011-05-09 06:15:36

相關問題