dlopen

    0熱度

    2回答

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

    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相同的共享

    0熱度

    1回答

    這是cygwin。 我有一個共享庫,其中包含一些其他共享庫和一些靜態庫。當調用dlopen()時,會返回一個句柄,但perror()會返回NULL,並顯示「無效或不完整的多字節或寬字符」 顯然,我的庫內某些內容失敗。我怎樣才能調試呢?有沒有辦法讓dlopen告訴我哪些包含庫或函數有錯?

    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 -

    2熱度

    1回答

    我有一個JavaScriptCore框架的分支,我添加了一個我自己的函數,該函數被導出。該框架編譯只是找到。在框架運行nm揭示了功能(JSContextCreateBacktrace_unsafe)的確是出口: Leo-Natans-Wix-MPB:JavaScriptCore.framework lnatan$ nm -gU JavaScriptCore.framework/JavaScript

    0熱度

    1回答

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