簡體   English   中英

給定一個完全鏈接的定義符號foo的a.out,如何在不重新鏈接a.out的情況下知道該定義來自哪個目標文件?

[英]Given a fully linked a.out, which defines symbol foo, how can I tell which object file that definition came from, without relinking the a.out?

我正在嘗試解析ELF文件並創建在每個目標文件中定義的符號列表。 除了符號和目標文件之間的鏈接,我能夠找到我需要的所有內容。

我在ELF規范中找不到類似的內容。 在這個特定的文件中,我正在解析我可以使用的一些嵌入式DWARF調試信息,但理想情況下,我想在符號和對象之間找到一個標准的鏈接,因為我想將此鏈接應用於許多非GCC編譯器。

我正在嘗試解析ELF文件並創建在每個目標文件中定義的符號列表。

您正在處理單個 ELF對象文件,還是完全鏈接的可執行文件或共享庫? 因為讓您的問題有意義的唯一方法是后者,所以我們假設您的實際問題是:

給定一個完全鏈接的定義符號foo a.out ,如何在不重新鏈接a.out情況下知道該定義來自哪個目標文件?

一般來說,您不能。

首先,在不限定每一個符號a.out甚至可能來自一個對象文件:一些可通過接頭腳本或定義--defsym命令行參數。

其次, 符號可以在多個目標文件中定義,鏈接器可以自由選擇它們中的任何一個。

最后,在a.out絕對沒有目標文件->符號關聯的記錄。 實際上,您甚至無法提取鏈接到的.o文件列表(無需重做鏈接並要求鏈接器將其打印)。

可以通過查看調試信息來重新建立此關聯,該調試信息將告訴您該符號來自哪個翻譯單元,然后猜測foo.c 可能已編譯為foo.o ,但這又可能會失敗為foo.c可能已被編譯成bar.obaz.o (具有不同-DFOO定義)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM