博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux下全局符号覆盖问题
阅读量:6703 次
发布时间:2019-06-25

本文共 701 字,大约阅读时间需要 2 分钟。

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

转载地址:http://qzblo.baihongyu.com/

你可能感兴趣的文章
Linux常用命令汇总
查看>>
实现自定义的actuator端点
查看>>
爱情,是一场狡猾的战斗!
查看>>
rabbitmq在redhat5.5下搭建部署
查看>>
10.8.2,ssd开启trim
查看>>
Mac os X 必备的System Info 最新版
查看>>
配置管理小报100208:如何在不覆盖本地文件的情况下,获取文件的某个历史版本...
查看>>
android:name 的秘密
查看>>
开启简单的web服务器成为文件下载服务器
查看>>
shape详解
查看>>
轻松自动化---selenium-webdriver(python) (六)
查看>>
iPhone开发之UIWebview
查看>>
Mysql基本语法(-)
查看>>
Linux总线设备驱动模型简要分析
查看>>
OkHttp和Okio
查看>>
Chrome 假死
查看>>
割图片
查看>>
升级安装ubuntu12.04的感受
查看>>
360 evpp现代化C++11高性能TCP UDP HTTP网络库
查看>>
多例模式
查看>>