Gcc 隐藏来自包含的静态库的符号的可见性
Gcc hide visibility of symbols coming from included static library
我有:
- 一个共享库,比如 libShared.so,其中包含一个 class
Bar
,方法 int Bar::do(int d) const
- 一个静态库,比如说 libStatic.a,它包含一个 class
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;
}
libShared.so 使用标记 -fvisibility=hidden 编译。
问题如下:我执行Linux命令nm -g -D -C --defined-only libShared.so,结果class Foo 及其方法在 libShared.so 之外可见,尽管已告知编译器隐藏除标记为 "public" 之外的所有内容(事实上,它们被 nm 标记为 "T")。
我怎样才能避免这种情况?我希望 libShared.so 不要公开来自其依赖项的符号。
谢谢
您还需要编译 libStatic.a 并使用标志 -fvisibility=hidden
。
-fvisibility=hidden
只影响编译器生成的符号的默认可见性,不会修改现有符号的可见性,例如从静态库中获取的符号。
幸运的是,链接器确实有一个标志可以做到这一点:使用 -Wl,--exclude-libs=ALL
将全局符号的可见性从静态库更改为“隐藏”,从而防止它们被您的共享库导出。
我有:
- 一个共享库,比如 libShared.so,其中包含一个 class
Bar
,方法int Bar::do(int d) const
- 一个静态库,比如说 libStatic.a,它包含一个 class
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;
}
libShared.so 使用标记 -fvisibility=hidden 编译。
问题如下:我执行Linux命令nm -g -D -C --defined-only libShared.so,结果class Foo 及其方法在 libShared.so 之外可见,尽管已告知编译器隐藏除标记为 "public" 之外的所有内容(事实上,它们被 nm 标记为 "T")。
我怎样才能避免这种情况?我希望 libShared.so 不要公开来自其依赖项的符号。
谢谢
您还需要编译 libStatic.a 并使用标志 -fvisibility=hidden
。
-fvisibility=hidden
只影响编译器生成的符号的默认可见性,不会修改现有符号的可见性,例如从静态库中获取的符号。
幸运的是,链接器确实有一个标志可以做到这一点:使用 -Wl,--exclude-libs=ALL
将全局符号的可见性从静态库更改为“隐藏”,从而防止它们被您的共享库导出。