相關(guān)的宏定義
#define __LIBC_HIDDEN__ __attribute__((visibility("hidden")))
#define __LIBC_EXPORT__ __attribute__((visibility("default")))
相關(guān)的編譯項(xiàng)
-fvisibility=default|hidden(這個(gè)是編譯項(xiàng),是gcc通知編譯器的)
-Wl,-export-dynamic or -rdynamic(這個(gè)是鏈接項(xiàng),是gcc通知鏈接器的)
符號(hào)可見的兩個(gè)要素
1 符號(hào)導(dǎo)出行為(so默認(rèn)導(dǎo)出忍些,exe默認(rèn)只有被其它so用的符號(hào)才導(dǎo)出)
2 符號(hào)可見性(編譯的時(shí)候指定毒坛,默認(rèn)都是可見的)
只有1,2都判斷成功誓竿,符號(hào)才會(huì)被導(dǎo)出到.dynsym表中
基本原理
1 -fvisibility=hidden辨泳,是編譯屬性,決定了每個(gè)obj中全局符號(hào)的hidden or default(visibility)
2 完成所有obj的鏈接后唉铜,會(huì)根據(jù)如下規(guī)則來完成符號(hào)導(dǎo)出
1 是exe(默認(rèn)沒有符號(hào)導(dǎo)出行為台舱,但可以通過-export-dynamic改變默認(rèn)行為)
2 是so(默認(rèn)是有符號(hào)導(dǎo)出行為的)
3 判斷完1,2后,進(jìn)行符號(hào)可見性的判斷(即Vis屬性)
上述條件都滿足潭流,則export符號(hào)到.dynsym表中竞惋,注意最后生成的exe或者so文件
是沒有Vis屬性的,因?yàn)檫@個(gè)時(shí)候Vis已經(jīng)整合到Bind屬性中(local or global)