Gcc隐藏来自包含的静态库

时间:2015-07-28 08:21:14

标签: c++ gcc shared-libraries visibility linker-flags

我有:

  1. 一个共享库,比如 libShared.so ,其中包含一个类Bar,其方法为int Bar::do(int d) const
  2. 一个静态库,例如 libStatic.a ,其中包含一个类Foo,方法为int Foo::act(int a) const
  3. 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;
    }
    

    libShared.so 使用标志 -fvisibility = hidden 进行编译。

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

    我该如何避免这种情况?我希望 libShared.so 不要公开来自其依赖项的符号。

    由于

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

-fvisibility=hidden 只影响编译器生成的符号的默认可见性,它不会修改现有符号的可见性,例如从静态库中获得的符号。

幸运的是,链接器确实有一个标志可以做到这一点:使用 -Wl,--exclude-libs=ALL 将全局符号的可见性从静态库更改为“隐藏”,从而防止它们被您的共享库导出。