• gcc 的visibility 使用


    gcc 的visibility 使用(zz)

    -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 ");
    }

    void is_hidden ()
    {
    printf("hidden one ");
    }

    想要做的是,第一个函数符号可以被导出,第二个被隐藏。
    先编译成一个动态库,使用到属性-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确实起到作用了。
  • 相关阅读:
    Cron表达式,springboot定时任务
    go 语言中windows Linux 交叉编译
    SSM框架处理跨域问题
    golang gin解决跨域访问
    关于Integer类的值使用==比较
    IoC注解
    spring基础知识
    SQL SERVER大话存储结构(3)_数据行的行结构
    SQL SERVER
    MySQL-记一次备份失败的排查过程
  • 原文地址:https://www.cnblogs.com/lixiaofei1987/p/3171410.html
Copyright © 2020-2023  润新知