我正在研究C庫的測試環境。該庫廣泛使用全局變量,我想檢查測試代碼。不幸的是,我必須動態加載庫(使用libdl)才能重置函數靜態變量。這樣我必須使用dlsym()加載每個全局,並且我必須手動將它們逐個轉換爲正確的類型。有沒有什麼辦法來自動化,並以某種方式獲得變量的類型信息? 據我看到libdl沒有這樣的功能。我想知道我可以鏈接到gdb,使用它來訪問共享庫全局變量,但我沒有設法找到任何有關這種可能性的線索。在C/C++中檢查動態加載的共享庫中變量的類型
0
A
回答
1
不,沒有辦法獲得某些dlsym
-ed符號的類型,因爲ELF共享對象不會(總是)攜帶任何類型信息(除了C++,使用name mangling)。
原則上,ELF共享對象可能在沒有任何C編譯器的情況下生成,因此給定符號類型的概念可能不存在,或者該類型與C約定不兼容。
但是,您可以使用調試信息將自己限制爲共享庫。 DWARF格式確實帶有關於符號的類型(甚至源位置)信息。你可以用例如libdwarf或其他一些圖書館。例如,你可以有自己的GCC插件或MELT擴展(MELT是擴展GCC的領域特定語言),這將在編譯(使用GCC)共享庫時使用,並將註冊某處的類型信息。
相關問題
- 1. 在動態加載之前檢查共享庫的兼容性
- 2. 檢查動態類型的變量android
- 3. 動態加載:共享靜態庫中的未定義符號
- 4. 共享庫加載的靜態變量損壞
- 5. 加載器引用共享庫中的變量是如何的?
- 6. 動態加載Linux共享庫?
- 7. 動態共享庫加載框架
- 8. Android:動態加載共享庫
- 9. 從Linux/Android上的另一個共享庫檢查加載的共享庫
- 10. 共享庫內部的靜態變量
- 11. 共享庫的動態鏈接或動態加載?
- 12. Swift中的共享(或靜態)變量
- 13. tensorflow保存庫中的共享變量
- 14. 如何聲明在DLL或共享庫中定義的類型的變量?
- 15. 將動態共享庫加載到db2服務器中
- 16. 如何從共享/動態庫中加載符號表結構?
- 17. 加載共享庫
- 18. 共享類變量
- 19. 檢查FreeMarker中的變量類型
- 20. 發佈在Java中加載共享庫
- 21. 無法在gdb中加載共享庫
- 22. 在gdb中加載本地共享庫
- 23. 在類實例中共享變量
- 24. 在不同類中共享變量Ruby
- 25. 共享庫/ dll中的全局變量,跨進程共享
- 26. 在Linux中查找共享庫的加載地址
- 27. 如何在共享對象庫中共享變量
- 28. asyncTask中的共享變量
- 29. PHP中的動態類型檢查
- 30. 在兩項活動中共享變量?
該庫確實使用gcc和調試信息編譯。我看到有一個閱讀DWARF信息的庫。這可能是一個很好的起點。感謝您的線索。 – simon 2013-05-06 16:40:20
隨時接受或upvote我的答案,如果它適合。 – 2013-05-06 16:41:17
我在最後使用了gcc的typeof()擴展。 – simon 2013-05-10 17:08:32