2012-01-13 62 views
0

編輯:我完全改寫了我的原始問題,因爲它很不清晰(它的底部不清晰!)。如何重命名調試信息?

我正在開發其中兩個內核和應用程序必須映射到內存中非常特殊的位置的RTOS。例如:

0x00000000:0x0000ffff: application #1 
0x00010000:0x0000ffff: application #2 
... 
0xffff0000:0xffffffff: kernel 

應用程序(和內核)分別開發(和編譯)。要將所有內容合併到一個可執行文件中,請使用以下過程:

  1. (單獨)編譯內核和應用程序(刪除任何符號)。
  2. (通過腳本)生成鏈接描述文件,將內核和應用程序重定位到所需的位置。爲了防止部分名稱之間發生衝突,生成的鏈接描述文件「重命名」所有應用程序的所有部分(例如.app1.text,.app1.data,.app1.bss,...)。
  3. 使用先前生成的鏈接描述文件進行鏈接(即合併全部)。

問題1)是否可以用以下過程替換步驟#2和#3?

  1. 將內核和應用程序的目標文件重定位到所需位置。
  2. 重命名應用程序目標文件上的所有符號(以防止名稱衝突)。
  3. 合併所有。

我想用一些已經可用的工具代替鏈接描述文件的代。

第1步應該通過創建一個位置無關可執行文件的可能(我還是要調查這個)。

步驟#2有可能通過GNU objcopy把

對於步驟#3我還沒有可能的解決方案。如果使用了GNU ld,則它會使用一些默認鏈接器腳本,並且以前的重定位會丟失。如果從GNU產生GNU GDB接受檔案AR這個問題將得到解決(我猜的!)。

問題2)如果上述過程是可能的,可以把它應用到,以及調試信息?

步驟#1應保持完整。

對於第2步,我不知道,如果調試信息被改名與否。

步驟#3的問題依然存在。

原來的問題如下:

我有一個定製的內核和一個或多個應用程序,而且我想用 GDB調試整個系統。爲了避免任何名稱衝突 鏈接期間我使用objcopy重命名所有部分和符號 名稱(應用程序的起始地址在內核中硬編碼)。 但是,調試信息是[我猜]在這些 .debug。*部分內硬編碼,並且不會被重命名。

有沒有辦法重新命名調試信息?並且,之後, 將該信息與另一組已存在的調試 信息合併在一起?

我已搜查GCC的手冊,看看能不能找到一個選項編譯期間前綴 (像一個全局命名空間)的所有符號,但是我 還沒有發現任何。

我的猜測是有一個調試格式,它在對象符號表(可以重命名)上公開它的 信息。

+0

你的問題是非常不清楚。你的意思是「應用程序的起始地址是硬編碼的」。這些是你的內核或用戶級程序的一部分嗎?另外,哪些部分是你重命名的?重命名例如'.debug_lines'到別的東西不可能產生任何GDB可以處理的東西。 – 2012-01-14 11:55:39

+0

「應用程序的起始地址是硬編碼的」我的意思是內核不依賴任何命名約定來啓動它的「用戶級」應用程序。因此,符號表中的任何條目都可以自由重命名。 – 2012-01-17 02:43:22

+0

對不起,你*仍然*沒有任何意義(對我來說)。也許別人會有更好的運氣。同時,刪除上面的註釋並將該信息移動到您的問題中。 – 2012-01-17 08:27:16

回答

0

回答問題1)

第1步應該通過創建一個位置 獨立可執行的可能(我還是要調查這個)。

不,這是不可能的。只有在加載時才知道可執行文件的加載地址時,與位置無關的可執行文件纔有用。在我的情況下,我想硬連線的地址。

對於步驟#3我還沒有可能的解決方案。如果使用GNU ld,它將使用一些默認鏈接描述文件,並且之前的重定位會丟失。 如果GNU gdb接受了從GNU ar生成的檔案文件,問題將被解決(我想!) 。

似乎沒有解決方法。鏈接器腳本因此是強制性的。

回答問題2)

對於第2步,我不知道,如果調試信息被重命名或 沒有。

實際上,調試信息不​​會被重命名。您可以使用objdump -s,並檢查調試信息是否在.debug。*部分中硬連線。

解決方法)

即使沒有調試信息,您可以使用對象文件的符號表中設置斷點。但是,b主您必須使用b *主,因爲symtable中的符號被解釋爲地址。這並不多,但它肯定有幫助。