zoukankan      html  css  js  c++  java
  • Linux下全局符号覆盖问题

    在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,这样能彻底解决同名覆盖问题。

  • 相关阅读:
    VBA值列选取与复制,赋值
    Processing的条件式
    VBA之四给程序自动加行号
    自上而下的语法分析
    Processing绘制四边形
    Processing的代码编写流程
    Processing编程语言简介
    follow集的求解
    Processing函数与循环
    在UBUNTU下用ruby求得网卡地址IP地址和用户名
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3398170.html
Copyright © 2011-2022 走看看