Arch-Linux
調試符號在 Arch linux 上用於 gdb 調試的實際含義是什麼?
PS 英語不是我的母語;請原諒打字錯誤。
我(也許)了解動態連結中 ELF 文件中符號的基本主要思想。
參考教科書,如果我需要動態連結到 .so 或類似的東西,那麼我需要連結目標的函式名稱(比如說,如果我們只談論函式)。然後載入器做一些事情來找到你的目標的真實位置。然後做其他事情來載入它。函式的名字是一些我們可以稱之為符號的東西。
但是,在調試中,以下內容讓我感到困惑。
我嘗試在 Arch linux 上安裝 pwndbg(GDB 外掛)並遇到了一些問題。按照這些說明 [ 1 ] [ 2 ],我已經解決了這些問題。但不太明白解決方案是如何工作的。
解決方案提供者的發帖人,也是外掛的作者說,Arch的glibc沒有“調試符號”,需要手動安裝,而Ubuntu的glibc有“調試符號”——不需要手動安裝.
所以這裡有一個問題真的讓我很困惑。
- 為什麼我可以為 lib安裝符號,例如 glibc。如果 .so (ELF) 文件沒有符號,則將符號放入其中。這將破壞 ELF 文件格式,因為 ELF 是基於文件相對偏移量的,不是嗎?那麼INSTALL實際上做了什麼?或者在這種情況下實際上“符號”是什麼意思?
gcc -g
(“gcc -g 生成 GDB 調試器使用的調試資訊”)實際上生成了什麼?它們(我安裝的東西)是一樣的嗎?如果我需要“生成調試資訊”,那麼我必須需要原始碼,對嗎?
- 在許多發行版(Debian、Ubuntu、Fedora 等;但不是 Arch,據我從相應的 wiki 頁面得知),程序是使用調試資訊建構的(見下文),但調試資訊隨後被分離成單獨的文件。這些單獨的文件在調試包中和/或通過調試資訊伺服器提供,並且可以與它們幫助調試的文件一起安裝。
gcc -g
儲存基本上允許調試器從編譯器生成的二進制程式碼返回到原始碼的資訊。使用此資訊,調試器可以將執行檔或記憶體中的位置轉換為相應的原始碼:例如,變數位置可以連結到相關聲明,可執行程式碼中的位置可以連結到相關原始碼行.Michael J. Eager 的DWARF 調試格式簡介很好地解釋了調試資訊的作用。另請參閱/usr/lib/.build-id/ 目錄的用途是什麼?