Linux下全域性符號覆蓋問題

2021-06-18 22:06:42 字數 784 閱讀 4299

在windows上,預設情況下,動態庫中的符號都是對外隱藏的,除非你顯示的指出要匯出哪些符號,否則外界是看不到的。但是linux下情況剛好相反,對靜態變數和全域性變數,linux下so裡面的符號對外可見。這就很容易出現乙個問題,就是外界很可能會無意中修改so內部的符號或符號同名但記憶體結構不同,帶來各種問題。有一種方法能將so裡面的

符號隱藏起來,避免全域性符號覆蓋。

1、首先,程式設計引數中新增編譯選項 -fvisibility=hidden,這個是隱藏符號的控制。

2、其次,在要匯出的界面前新增__attribute__ ((visibility("default")))。

通過以上兩步,就可以像windows平台那樣,只把需要的介面或變數匯出去,其他的都隱藏在so內部。

例如so中要匯出乙個int add(int x, int y )介面,可以這樣:

gcc test.c -o test -fvisibility=hidden

然後在介面處這樣處理:

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

myapi int add(int x, int y);

注意:1、window平台上匯出符號的命令在是返回值和函式名中,但是linux平台這一點有所不同,需要加在返回值前面,尤其是返回const char*型別時,如果不放在返回值前面會導致異常或崩潰。

2、某些情況下,so內部的單體和外部的同名單體可能會重複導致操作無效或異常的情況,可以在編譯引數裡面再新增乙個編譯選項-wl,-bsymbolic,這樣能徹底解決同名覆蓋問題。

Linux下全域性符號覆蓋問題

在windows上,預設情況下,動態庫中的符號都是對外隱藏的,除非你顯示的指出要匯出哪些符號,否則外界是看不到的。但是linux下情況剛好相反,對靜態變數和全域性變數,linux下so裡面的符號對外可見。這就很容易出現乙個問題,就是外界很可能會無意中修改so內部的符號或符號同名但記憶體結構不同,帶來...

Linux 符號命令及符號問題

1 回車 r 本義是游標重新回到本行開頭,r的英文return,控制字元可以寫成 cr,即 carriage return 換行 n 本義是游標往下一行 不一定到下一行行首 n 的英文 newline,控制字元可以寫成 lf,即 line feed。2 windows下,記事本不支援 n 換行,它只...

ARM下char型別符號問題

最近在專案中遇到問題,在x86平台下除錯好的程式,移植到arm上,程式行為完全變了。示例如下 include include int main int argc,char argv else return 0 在x86平台輸出smaller than 128。在arm平台輸出bigger than ...