有没有办法再出口内部符号?

时间:2015-07-24 16:58:11

标签: c++ linux gcc shared-libraries

一个简单的例子,展示了我当前的问题:

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

0 个答案:

没有答案