2014-10-20 74 views
3

背景GDB遠程調試:對遠程目標上執行的影響

我使用的是定製的工具鏈(基於Yocto用gcc 4.7和gdb 7.5)與ARM設備的工作,並利用遠程GDB的使用Eclipse CDT作爲調試器前端進行調試。最近,我有,我不能調試遠程目標上特定的可執行文件,由於當主機GDB連接到目標之後緊接着發生這個錯誤(通過對目標的gdbserver的報道)問題:

error while loading shared libraries: unexpected PLT reloc type 0xf0 

我最終可以追蹤到目標和主機上的動態鏈接程序庫/lib/ld-2.16.so的二進制文件不匹配問題,其中通過在gdb中調用set sysroot,我使用了本地存儲的與工具鏈一起生成的目標根目錄。

保持本地文件與遠程文件同步工作,但我也可以忽略設置sysroot以便至少調試可執行文件本身。這使我下面

問題

如何做一個錯誤ld.so二進制的調試主機影響目標gdbserver的內部應用程序的執行的使用情況如何?如果主機上沒有ld.so,我寧願期望在主機上運行的可執行文件沒有問題(在gdbserver中)時,我只能得到錯誤的主機調試信息。但是,由於行爲不同,當文件可用時,似乎從主機到目標有一些反饋。

回答

1

如何在調試主機上使用錯誤的ld.so二進制文件影響目標機器上gdbserver中應用程序的執行?

好問題。

一個可能的解釋:爲了正確地跟蹤例如在目標上加載共享庫,GDB設置一些內部斷點(這些在maintenance info breakpoints輸出中可見 - 它們具有負斷點編號)。當你根本不提供本地文件時,GDB不知道在哪裏設置這些斷點,所以它不會(例如,你不能在沒有它們的情況下調試庫初始化程序)。

當您提供了不正確的本地文件,GDB並設置斷點......在錯誤地方(通過改寫什麼GDB認爲是一個指令,但什麼在現實中是一個PLT搬遷)。當加載器遇到這個被覆蓋的重定位時,它會抱怨。

+0

到現在爲止,我從來沒有質疑過斷點是如何工作的,但是你的回答讓我趕上了這個話題。我認爲你的解釋很有道理,這是我學到的另一個寶貴的教訓,謝謝! – 2014-10-22 07:47:54