dlopen

    0熱度

    2回答

    我有一個遺留的C++代碼,我正在嘗試重新設計它。 我想將部分代碼作爲「.so」共享庫從項目中取出,並通過「dlopen」動態加載它們。 我寫了一個動態加載機制,可以在運行時動態加載新模塊。 現在我想解耦來自主項目的現有模塊。 例如,我從主項目中提取了模塊「X」,並創建了可以稍後加載的共享庫,但是主項目的某些部分直接使用了模塊X的類,並且我無法更改它們。 我可以使用模塊X的頭文件編譯項目,但鏈接器拋

    2熱度

    1回答

    現在我在linux下編寫一個可加載的.so模塊,我想在主程序中使用dlopen,並在可加載的.so模塊中使用_init()。我的計劃是這樣的: 主程序: ... dlopen(lib, flags); ... 加載模塊: #define MODULE_EXPORT(name, minit, mexit) \ int __##name##_init(void) __attribut

    0熱度

    2回答

    有沒有辦法在運行時確定哪些共享庫已加載到當前進程的全局符號名稱空間中?我主要對任何因使用RTLD_GLOBAL標誌的dlopen()調用而加載的任何內容感興趣。 我想對審計的目的做到這一點 - 它是我對動態加載的共享庫工作的重要應用程序加載與的RTLD_LOCALdlopen儘可能以不與第三方的代碼相沖突;任何加載到全局符號名稱空間的內容都需要嚴格控制。 我已經看過dl_iterate_phdr(

    1熱度

    1回答

    我想使用一個古老的軟件(從1999年開始的虛幻競技場「經典」,也被稱爲UT99)。隱式加載動態庫libtxc_dxtn.so,探測可選的S3紋理壓縮(S3TC)支持。不幸的是,在加載庫時,主應用程序崩潰並出現分段錯誤(崩潰還描述了here)。解決方法似乎是通過刪除或移動libtxc_dxtn.so來移除Mesa的紋理壓縮庫。應用程序運行得非常好,沒有紋理壓縮,但當然其他需要紋理壓縮支持的應用程序現

    1熱度

    1回答

    據其man page,dlopen()不會加載同一庫兩次: 如果相同的共享對象被使用dlopen再次加載(),則返回相同 對象的句柄。動態鏈接器維護對象句柄的引用計數 ,因此動態加載的共享對象是 不會被釋放,直到在其上調用dlclose()的次數爲 (因爲dlopen()已成功執行)。任何初始化返回(請參閱下面的 )都只調用一次。但是,隨後的調用 的dlopen()加載與RTLD_NOW相同的共享

    1熱度

    1回答

    我試圖檢查一個程序的行爲,該程序調用dlopen和dlsym:最終目標是設置一個微調函數,用於記錄調用通過dlsym獲得的函數。 通常情況下,要與DYLD_INSERT_LIBRARIES包裝一些功能foo,你寫的東西是這樣的: void (*real_foo)(void); void init() __attribute__((constructor)) { real_foo =

    -1熱度

    1回答

    由於特殊原因,我的共享庫(.so文件)必須壓縮到用於C使用的.zip文件中。 是否可以在不更改動態鏈接器的情況下爲C代碼動態加載(dlopen或調用)共享庫(.so)文件形式的.zip文件?

    1熱度

    1回答

    已經解決!See the result here。 不知道我是否在正確的地方問,但有沒有人知道基於.h文件生成dlopen和dlsym命令的正確方法? 我想動態加載SDL2 - 這是一個用C編寫的庫 - 但所有提取函數列表和他們的參數與ctags的方法似乎沒有結果(必須手動更正240個函數的參數列表3500是不好玩)。 ctags -R -x --sort=yes --c++-kinds=+p -

    0熱度

    1回答

    我假設我在使用dlopen時不必鏈接到共享庫。然而,在cmake的target_link_libraries(main_dlopen dl)導致鏈接錯誤 main_dlopen.cpp.o: In function `main': main_dlopen.cpp:25: undefined reference to `ntclass::init(char const*)' etc... 如

    0熱度

    1回答

    我有一個使用單身的程序。該程序在運行時加載共享對象庫。這個庫也使用同一個單例。 問題是,當從庫中訪問單例時,將創建單例的新實例。 程序與-rdynamic聯繫,我用-fPIC兩個和裝載情況是這樣的: std::shared_ptr<Module> createModuleObject(const std::string& filename) { if (!fs::exists(file