我目前正在链接 linux 上的两个第三方共享库(A.so 和 B.so)。问题是这两个so都与另一个库静态链接,因此来自A.so和B.so的大约400个函数具有相同的名称。当我使用 -lA -lB 或 -lB -lA 编译和链接时,由于函数插入导致问题并且代码无法运行,这取决于从 A 或 B 分别提取函数的顺序。我想知道是否有办法将函数名称绑定到它们的库,以便两个库都可以链接和使用?因为那些重叠的函数名称是在 A 和 B 内部调用的,所以我不能使用 objcopy 之类的东西。dlopen 有帮助吗?
问问题
4056 次
1 回答
5
我想知道是否有办法将函数名称绑定到它们的库,以便两个库都可以链接和使用?
当两个库链接时,他们应该控制了他们导出的符号,并且应该隐藏了“其他”库,但他们没有......
dlopen 会有帮助吗?
是的:如果你dlopen("A.so", RTLD_LOCAL);
和dlopen("B.so", RTLD_LOCAL);
,那么两个库都不会被添加到全局范围内,它们也不会“看到”对方。
您必须从A.so
和中显式查找所需的符号B.so
,但这是您能做的最好的事情。
更新:
在构建 A.so 时,是否有一种快速链接到静态库的方法,而无需从“其他”库中导出符号
这最好通过使用-fvisibility=hidden
标志和__attribute__((visibility("default")))
应导出的符号来完成。例子:
#define EXPORTED __attribute__((visibility("default")))
struct Foo {
void EXPORTED ExportedFunction();
void EXPORTED AnotherExportedFunction();
void InternalFunction();
};
void Foo::ExportedFunction() { }
void Foo::AnotherExportedFunction() { }
void Foo::InternalFunction() { }
gcc -shared -fPIC -o foo.so foo.cc
nm -CD foo.so | grep Foo::
00000000000005fc T Foo::ExportedFunction()
0000000000000610 T Foo::InternalFunction()
0000000000000606 T Foo::AnotherExportedFunction()
如果没有明确的出口控制,一切都会被出口(包括InternalFunction
我们不想要的)。
gcc -shared -fPIC -o foo.so foo.cc -fvisibility=hidden
nm -CD foo.so | grep Foo::
00000000000005bc T Foo::ExportedFunction()
00000000000005c6 T Foo::AnotherExportedFunction()
瞧:只有我们明确想要导出的东西。
于 2013-02-04T07:04:59.330 回答