Gcc隐藏来自包含的静态库的符号的可见性

Mau*_*uro 5 c++ gcc visibility shared-libraries linker-flags

我有:

  1. 一个共享库,比如libShared.so,它包含一个Bar带有方法的类int Bar::do(int d) const
  2. 一个静态库,比如libStatic.a,它包含一个Foo带有方法的类int Foo::act(int a) const.

代码Bar是这样的:

//Bar.h
class __attribute__ ((visibility ("default"))) Bar
{
  private: 
    __attribute__ ((visibility ("hidden"))) int privateMethod(int x) const;
  public:
    Bar() {}
    int do(int d) const;
}

//Bar.cpp
#include "Bar.h"
#include "Foo.h"

int Bar::do(int d) const {
   Foo foo;
   int result = foo.act(d) + this->privateMethod(d);
   return result;
}
Run Code Online (Sandbox Code Playgroud)

libShared.so使用flag -fvisibility = hidden编译.

问题如下:我执行Linux命令nm -g -D -C --defined-only libShared.so,结果是Foo及其方法在libShared.so之外可见,尽管告诉了编译器隐藏除标记为"公共"之外的所有内容(事实上​​,它们被标记为"T"by nm).

我怎么能避免这个?我希望libShared.so不要公开来自其依赖项的符号.

谢谢

m.s*_*.s. 8

您还需要使用flag 编译libStatic.a-fvisibility=hidden.

  • 我回答自己.有用!我想这是因为静态链接不支持符号隐藏,所以_hidden_​​标志只有在静态库中的对象在共享对象中使用时才会生效.非常感谢! (4认同)