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

2021-06-20 07:18:17 字數 2125 閱讀 6980

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

有四種方法:

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

2. gcc 在鏈結時設定 -fvisibility=hidden,則不加 visibility宣告的都預設為hidden; gcc預設設定 -fvisibility=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,則不...

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,則不...