2013-05-06 70 views
0

我正在研究C庫的測試環境。該庫廣泛使用全局變量,我想檢查測試代碼。不幸的是,我必須動態加載庫(使用libdl)才能重置函數靜態變量。這樣我必須使用dlsym()加載每個全局,並且我必須手動將它們逐個轉換爲正確的類型。有沒有什麼辦法來自動化,並以某種方式獲得變量的類型信息? 據我看到libdl沒有這樣的功能。我想知道我可以鏈接到gdb,使用它來訪問共享庫全局變量,但我沒有設法找到任何有關這種可能性的線索。在C/C++中檢查動態加載的共享庫中變量的類型

回答

1

不,沒有辦法獲得某些dlsym -ed符號的類型,因爲ELF共享對象不會(總是)攜帶任何類型信息(除了C++,使用name mangling)。

原則上,ELF共享對象可能在沒有任何C編譯器的情況下生成,因此給定符號類型的概念可能不存在,或者該類型與C約定不兼容。

但是,您可以使用調試信息將自己限制爲共享庫。 DWARF格式確實帶有關於符號的類型(甚至源位置)信息。你可以用例如libdwarf或其他一些圖書館。例如,你可以有自己的GCC插件或MELT擴展(MELT是擴展GCC的領域特定語言),這將在編譯(使用GCC)共享庫時使用,並將註冊某處的類型信息。

+0

該庫確實使用gcc和調試信息編譯。我看到有一個閱讀DWARF信息的庫。這可能是一個很好的起點。感謝您的線索。 – simon 2013-05-06 16:40:20

+0

隨時接受或upvote我的答案,如果它適合。 – 2013-05-06 16:41:17

+0

我在最後使用了gcc的typeof()擴展。 – simon 2013-05-10 17:08:32