gcc 的visibility
生活随笔
收集整理的這篇文章主要介紹了
gcc 的visibility
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
-fvisibility=default|internal|hidden|protected
gcc的visibility是說,如果編譯的時候用了這個屬性,那么動態庫的符號都是hidden的,除非強制聲明。
1.創建一個c源文件,內容簡單
#include<stdio.h>
#include<stdlib.h>
__attribute ((visibility("default"))) void not_hidden ()
{
printf("exported symbol\n");
}
void is_hidden ()
{
printf("hidden one\n");
先編譯成一個動態庫,使用到屬性-fvisibility
gcc -shared -o libvis.so -fvisibility=hidden vis.c
現在查看
# readelf -s libvis.so |grep hidden
7: 0000040c ? ?20 FUNC ? ?GLOBAL DEFAULT ? 11 not_hidden
48: 00000420 ? ?20 FUNC ? ?LOCAL ?HIDDEN ? 11 is_hidden
51: 0000040c ? ?20 FUNC ? ?GLOBAL DEFAULT ? 11 not_hidden
可以看到,屬性確實有作用了。
現在試圖link
vi main.c
int main()
{
not_hidden();
is_hidden();
return 0;
}
試圖編譯成一個可執行文件,鏈接到剛才生成的動態庫,
gcc -o exe main.c -L ./ -lvis
結果提示:
/tmp/cckYTHcl.o: In function `main':
main.c:(.text+0x17): undefined reference to `is_hidden'
說明了hidden確實起到作用了。
gcc的visibility是說,如果編譯的時候用了這個屬性,那么動態庫的符號都是hidden的,除非強制聲明。
1.創建一個c源文件,內容簡單
#include<stdio.h>
#include<stdlib.h>
__attribute ((visibility("default"))) void not_hidden ()
{
printf("exported symbol\n");
}
void is_hidden ()
{
printf("hidden one\n");
}
先編譯成一個動態庫,使用到屬性-fvisibility
gcc -shared -o libvis.so -fvisibility=hidden vis.c
現在查看
# readelf -s libvis.so |grep hidden
7: 0000040c ? ?20 FUNC ? ?GLOBAL DEFAULT ? 11 not_hidden
48: 00000420 ? ?20 FUNC ? ?LOCAL ?HIDDEN ? 11 is_hidden
51: 0000040c ? ?20 FUNC ? ?GLOBAL DEFAULT ? 11 not_hidden
可以看到,屬性確實有作用了。
現在試圖link
vi main.c
int main()
{
not_hidden();
is_hidden();
return 0;
}
試圖編譯成一個可執行文件,鏈接到剛才生成的動態庫,
gcc -o exe main.c -L ./ -lvis
結果提示:
/tmp/cckYTHcl.o: In function `main':
main.c:(.text+0x17): undefined reference to `is_hidden'
說明了hidden確實起到作用了。
總結
以上是生活随笔為你收集整理的gcc 的visibility的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 解压命令
- 下一篇: Android 编译系统分析(一)