Linux下gcc編譯控制動態庫匯出函式小結

2021-09-08 01:24:13 字數 2303 閱讀 6255

根據說明文件「how to write shared libraries"介紹,

有四種方法:

1. 在方法宣告定義時,加修飾:__attribute__((visibility("hidden")))

就是說將不公開的函式都加上這個屬性,沒加的就是可見的

2. gcc 在鏈結時設定 -fvisibility=hidden,則不加 visibility宣告的都預設為hidden; gcc預設設定 -fvisibility=default,即全部可見;

在gcc中加了這個設定之後表示所有的函式都是對外不可見了,然後在**裡面對於想公開的函式加上 __attribute__((visibility("default")))

3. 使用export map,gcc -wl,--version-script=export.map, 在export.map中指定

global:export_func;

local:*;

則除了export_func外,全部為內部可見;

4. 使用libtool的export-symbols選項,沒試過,略;

以上方法,對於gcc的visibility功能需要 gcc 4以上版本,

常見的巨集,用於等同於 windows下的 __declspec(dllexport)(摘自:

#if defined _win32 || defined __cygwin__

#ifdef building_dll

#ifdef __gnuc__

#define dll_public __attribute__((dllexport))

#else

#define dll_public __declspec(dllexport) // note: actually gcc seems to also supports this syntax.

#endif

#else

#ifdef __gnuc__

#define dll_public __attribute__((dllimport))

#else

#define dll_public __declspec(dllimport) // note: actually gcc seems to also supports this syntax.

#endif

#define dll_local

#else

#if __gnuc__ >= 4

#define dll_public __attribute__ ((visibility("default")))

#define dll_local __attribute__ ((visibility("hidden")))

#else

#define dll_public

#define dll_local

#endif

#endif

實踐中發現幾個有意思的東西[實驗環境為ubuntu 9.10, gcc 4.4.1]:

1. gcc -fvisibility=hidden 只在鏈結時傳入的.c檔案起作用,對.o檔案不其作用;

比如test.c test1.c, 使用以下命令:

gcc -shared -fvisibility=hidden -o test.so test.c test1.c

和命令gcc -c test.c test1.c

gcc -shared -fvisibility=hidden -o test.so test.o test1.o

生成的test.so中的對應可見性是不一樣的, 使用「readelf -s test.so」檢視發現:

第乙個達到預期目的,即將兩個.c檔案中的functions設為hidden,

而第2個則不行,-fvisibility=hidden不起作用;

再用gcc -shared -fvisibility=hidden -o test.so test.o test1.c

生成的so,則可發現test1.c中的函式為hidden,但test.o中的函式仍為default;

2. 實驗通過export map的方法,通過readelf總是發現函式仍然可見,後來搜尋發現:

需同時使用ld --retain-symbols-file --version-script 兩個選項方能達到 使得elf檔案中的.dynsym和.symtab

中的符號表都得到控制;其中--retain-symbols-file控制靜態符號表,--version-script則對應dynamic符號表;

另外可以參考
**

Linux下gcc編譯控制動態庫匯出函式小結

根據說明文件 how to write shared libraries 介紹,有四種方法 1.在方法宣告定義時,加修飾 attribute visibility hidden 2.gcc 在鏈結時設定 fvisibility hidden,則不加 visibility宣告的都預設為hidden g...

Linux下gcc編譯控制動態庫匯出函式小結

根據說明文件 how to write shared libraries 介紹,有四種方法 1.在方法宣告定義時,加修飾 attribute visibility hidden 就是說將不公開的函式都加上這個屬性,沒加的就是可見的 2.gcc 在鏈結時設定 fvisibility hidden,則不...

Linux下gcc編譯控制動態庫匯出函式小結

根據說明文件 how to write shared libraries 介紹,有四種方法 1.在方法宣告定義時,加修飾 attribute visibility hidden 就是說將不公開的函式都加上這個屬性,沒加的就是可見的 2.gcc 在鏈結時設定 fvisibility hidden,則不...