簡體   English   中英

Gcc 隱藏來自包含的靜態庫的符號的可見性

[英]Gcc hide visibility of symbols coming from included static library

我有:

  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;
}

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM