2016-08-24 167 views
0

我嘗試使用gdb在目標上調試嵌入式應用程序。因此,在主機上運行的gdb需要帶有調試符號的二進制文件,即用-g編譯的二進制文件。在目標上,一個二進制文件的剝離副本就足夠了。在目標上,我嘗試使用不帶-g代替剝離副本編譯的二進制文件,但它不起作用。gdb:使用-g編譯的二進制文件與使用-g編譯的二進制編譯的代碼

GNU strip丟棄了目標文件中的所有符號(用-g編譯)。那麼,這不等於一個沒有-g編譯的二進制文件嗎?爲什麼它不起作用?

+0

-g還關閉默認情況下啓用的優化,因此它不等同於剝離可執行文件。 –

+0

@ n.m。你錯了:對於GCC,'-g'標誌根本*不影響優化*。 –

+0

@EmployedRussian你是對的,必須是另一個神話,從舊的壞的許多私有unixes日子繼承。 –

回答

0

在主機上,我嘗試使用不帶-g代替剝離副本的二進制編譯,但它沒有工作。

你得到了相反的結論:你需要在目標上剝離二進制文件,並在主機上完全調試二進制文件。

gdbserver確實通過-g生產需要(或使用)調試信息,gdb一樣。

最好是不編譯兩次,而是與-g一次編譯,然後:

cp a.out a.out.stripped 
strip -g a.out.stripped 

,並保持兩者完全調試和剝離二進制在一起。

+0

對不起,你是對的,目標和描述中的主機已被交換。我糾正了我的問題。謝謝! – xaverius

+0

回到我的問題:是否可以使用不帶-g的strip來刪除所有符號?如果是這樣,我認爲不建議編譯兩次,因爲我們並不真正瞭解編譯器的功能。 – xaverius

+0

@xaverius完全剝離所有符號也應該有效,但'strip'中有一些錯誤,比如https://sourceware.org/bugzilla/show_bug.cgi?id=11786 –