[英]Gcc hide visibility of symbols coming from included static library
我有:
Bar
類,方法是int Bar::do(int d) const
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 ,結果是類Foo及其方法在libShared.so之外可見,盡管已告知編譯器隱藏除了標記為“public”的所有內容(事實上,它們被nm標記為“T”)。
我怎樣才能避免這種情況? 我希望libShared.so不公開來自其依賴項的符號。
謝謝
您還需要使用標志-fvisibility=hidden
編譯libStatic.a 。
-fvisibility=hidden
僅影響編譯器生成的符號的默認可見性,它不會修改現有符號的可見性,例如從靜態庫中獲得的符號。
幸運的是,鏈接器確實有一個標志可以做到這一點:使用-Wl,--exclude-libs=ALL
將全局符號的可見性從靜態庫更改為“隱藏”,從而防止它們被共享庫導出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.