一个简单的例子,展示了我当前的问题:
static.cpp:
#include <iostream>
using namespace std;
namespace nm {
class A {
public:
__attribute__((visibility("internal"))) virtual void myfunc() const;
};
}
namespace nm {
void A::myfunc() const { cout<<"hello"<<endl; }
}
如果将其构建到静态库中:
>gcc -fPIC -O0 -c static.cpp
>ar rcs libstatic.a static.o
现在,如果我将libstatic.a链接到共享库:
>gcc -shared -fPIC -o libshared.so shared.cpp -L. -Wl,--whole-archive -lstatic -Wl,--no-whole-archive
shared.cpp没有引用libstatic.a中的任何符号,这就是我需要使用--whole-archive的原因。
问题是符号(当然是去除了错误)“myfunc”不会被libshared.so导出(“nm -D libshared.so”)。
在实际案例中,libstatic.a由第三方提供,因此我无法更改其构建方式。我们提供libshared.so。这里的目标是让我们在libshared.so中链接的用户能够使用libstatic.a中定义的标记为“internal”的符号(有数千种此类符号)。我们的用户不允许直接在libstatic.a中链接。
我在构建libshared.so时尝试过-rdynamic / -Wl, - export-all-symbols,但它没有帮助。我也研究过objcopy,但我没有办法解决这个问题。
有关如何从libstatic.a创建这些内部符号的任何建议都可以在libshared.so的导出符号部分中找到?我的环境是redhat 5 + gcc 4.x