[英]Symbol visibility and gcc warnings
這是Symbol可見性和命名空間的后續問題
我稍微修改一下這個例子,因為它不是關於命名空間的:
namespace MyDSO {
struct __attribute__ ((visibility ("hidden"))) Foo {
void bar() {}
};
}
struct Bar {
MyDSO::Foo foo;
};
int main() {}
通過gcc example.cpp -o example
編譯gcc example.cpp -o example
吐出警告'Bar' declared with greater visibility than the type of its field 'Bar::foo'
鏈接問題中'Bar' declared with greater visibility than the type of its field 'Bar::foo'
。
問題:如果我,為什么不收到警告
a)明確地向結構欄添加默認可見性,即我有
namespace MyDSO {
struct __attribute__ ((visibility ("hidden"))) Foo {
void bar() {}
};
}
struct __attribute__ ((visibility ("default"))) Bar {
MyDSO::Foo foo;
};
int main() {}
b)刪除隱藏的可見性,向Bar添加默認可見性並使用-fvisibility="hidden"
編譯?
在我看來,最終結果是相同的,實際上,所有二進制文件都是完全相同的(gcc 7.3.1,但也包括較舊的二進制文件)。 如果我將兩個結構分成兩個類並用它們構建一個靜態庫,那么符號表(objdump -t -C)包含完全相同的符號和完全相同的修飾符(全局,本地等),只有幾個條目第一列(虛擬地址)不同。
在這兩種情況下,顯式可見性屬性是在每個類的基礎上使警告靜音的預期方式。 來自gcc/cp/decl2.c
:
/* Don't warn about visibility if the class has explicit visibility. */
if (CLASSTYPE_VISIBILITY_SPECIFIED (type))
vis = VISIBILITY_INTERNAL;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.