我正在玩dylib多重負載,並試圖瞭解是什麼使符號differents。什麼使得Dylib與另一個Dylib不同?
這裏是我的步驟:
構建lib_a.dylib用下面的切入點:
FactoryA : IFActory() {} extern "C" IFactory* GetFactory() { return new FactoryA(); }
- 複製lib_a.dylib到lib_b.dylib從lib_a
負載GetFactory。 dylib和lib_b.dylib
void * module=dlopen(fileName,RTLD_LAZY); void * proc = (void *)dlsym(module, "GetFactory");
加載第二個dylib(lib_b.dylib)時,GetFactory被視爲已由lib_a.dylib定義。
實際上,nm輸出具有相同的結果。
但我認爲編譯標籤-two_level_namespace保證2 dylib是在一種不同的命名空間,我錯了嗎?
我可以改變我的兩個dylib加載?
下面是我的測試。
myclass.h:
#include <stdio.h>
class IFactory {
public:
virtual int GetCount() = 0;
};
extern "C"
{
extern IFactory* GetFactory();
}
myclass.cpp
#include <stdio.h>
#include "myclass.h"
class MyFactory : public IFactory {
public:
virtual int GetCount() { mCount++; return mCount; }
static int mCount;
};
int MyFactory::mCount = 0;
IFactory* GetFactory() {
return new MyFactory;
}
mytest.cpp
#include <stdio.h>
#include <dlfcn.h>
#include <mach-o/dyld.h>
#include "myclass.h"
typedef IFactory* (*factoryPtr)();
int main()
{
void* handleA = dlopen("libmylib.dylib", RTLD_LAZY);
factoryPtr functionA = (IFactory*(*)())dlsym(handleA, "GetFactory");
IFactory* factoryA = (*functionA)();
fprintf(stderr, "Handle A: %p\tFunction A: %p\t Count: %d\n", handleA, functionA, factoryA->GetCount());
// Reload same library
void* handleB = dlopen("libmylib.dylib", RTLD_LAZY);
factoryPtr functionB = (IFactory*(*)())dlsym(handleB, "GetFactory");
IFactory* factoryB = (*functionB)();
fprintf(stderr, "Handle B: %p\tFunction B: %p\t Count: %d\n", handleB, functionB, factoryB->GetCount());
// Load copy of first library (just rename)
void* handleC = dlopen("libmylib_copy.dylib", RTLD_LAZY);
factoryPtr functionC = (IFactory*(*)())dlsym(handleC, "GetFactory");
IFactory* factoryC = (*functionC)();
fprintf(stderr, "Handle C: %p\tFunction C: %p\t Count: %d\n", handleC, functionC, factoryC->GetCount());
return 0;
}
命令:
clang++ -dynamiclib myclass.cpp -o libmylib.dylib
cp libmylib.dylib libmylib_copy.dylib
clang++ mytest.cpp -o mytest
./mytest
輸出:
Handle A: 0x7fe5dac039b0 Function A: 0x106d49d30 Count: 1
Handle B: 0x7fe5dac039b0 Function B: 0x106d49d30 Count: 2
Handle C: 0x7fe5dac03e00 Function C: 0x106d7cd30 Count: 3
。爲什麼我們要在最後數= 3?
屬性-fvisibility = hidden -fvisibility-inlines-hidden允許做同樣的事情。
修改myclass.h:
#include <stdio.h>
#define EXPORT_FACTORY __attribute__ ((visibility ("default")))
class IFactory {
public:
virtual int GetCount() = 0;
};
extern "C"
{
extern EXPORT_FACTORY IFactory* GetFactory();
}
體形:
clang++ -dynamiclib myclass.cpp -o libmylib.dylib -fvisibility=hidden -fvisibility-inlines-hidden
cp libmylib.dylib libmylib_copy.dylib
clang++ mytest.cpp -o mytest
./mytest
輸出:
Handle A: 0x7fe078c039b0 Function A: 0x1076e1c00 Count: 1
Handle B: 0x7fe078c039b0 Function B: 0x1076e1c00 Count: 2
Handle C: 0x7fe078c03e20 Function C: 0x107714c00 Count: 1
在兩個dylib上調用dlopen之後,如果使用dlsym(RTLD_NEXT,「GetFactory」)並調用它兩次,是否返回兩個函數? – TheDarkKnight
我收到以下錯誤錯誤:dlsym(RTLD_NEXT,GetProcessorFactory):找不到符號 – PLL
您可以將相關代碼添加到您的問題嗎? – TheDarkKnight