2014-02-25 65 views
2

的應用程序(應用)取決於兩個共享圖書館的時候是否有符號衝突。
liba and libb具有相同的功能void Hello()但具有不同的實現。 在運行時加載兩個共享庫並嘗試訪問Hello()的兩個版本。
我通過poco C++共享庫加載liba.so和libb.so,但最終它調用dlopen()來加載共享庫。下面的代碼:裝載兩個共享庫有相同的符號

#include "Poco/SharedLibrary.h" 
using Poco::SharedLibrary; 
typedef void (*HelloFunc)(); // function pointer type 


int main(int argc, char** argv) 
{ 
    std::string path("liba"); 
    path.append(SharedLibrary::suffix()); // adds ".so" 
    SharedLibrary library(path); 
    HelloFunc func = (HelloFunc) library.getSymbol("hello"); 
    func(); 

    std::string path2("libb"); 
    path2.append(SharedLibrary::suffix()); // adds ".so" 
    SharedLibrary library2(path2); 
    HelloFunc func2 = (HelloFunc) library2.getSymbol("hello"); 
    func2(); 

    library.unload(); 
    library2.unload(); 

    return 0; 
} 

我的問題是,當應用程序加載liba.so和libb.so通過dlopen()的,會不會有兩個你好()實現任何符號衝突?
事實上,代碼運行良好,但我想知道是否有任何潛在風險來加載這樣的庫。

回答

2

我的問題是,當應用程序通過dlopen()加載liba.so和libb.so時,兩個Hello()實現是否會有任何符號衝突?

沒有。這些是返回的地址,並且這兩個動態加載的庫都將位於單獨的地址空間中。

即使你傳遞了dlopen函數返回的句柄,也不能混淆dlsym函數,所以它不會變得含糊不清。

(這甚至不會成爲同一庫中超載的問題)

相關問題