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

linux怎么判断全局符号,Linux下全局符号覆盖有关问题相关推荐

  1. Linux内核判断大小端,linux kernel 如何处理大小端

    暂时在用MPC8309,不太清楚大小端内核是什么时候给转的. 今天看了关于readl和writel具体实现的文章 今天就主要来分析下readl/writel如何实现高效的数据swap和寄存器读写.我们 ...

  2. linux脚本判断流程控制,linux shell awk 流程控制语句(if,for,while,do)详细介绍

    在linux awk的 while.do-while和for语句中允许使用break,continue语句来控制流程走向,也允许使用exit这样的语句来退出.break中断当前正在执行的循环并跳到循环 ...

  3. linux if 判断文件数量,linux if判断命令

    linux if命令 无论什么编程语言都离不开条件判断.SHELL也不例外. if list then do something here elif list then do another thin ...

  4. linux awk判断字符串开头,Linux文件比较三剑客(awk/grep/sed)之awk

    一.什么是awk awk是Linux下的一个命令,他对其他命令的输出,对文件的处理都十分强大,其实他更像一门编程语言,他可以自定义变量,有条件语句,有循环,有数组,有正则,有函数等.他读取输出,或者文 ...

  5. linux循环判断输出结果,Linux Shell基础学习——循环与条件判断

    for循环 1. 注意do必须换行 for i in {1..10} do echo $i done 2. 注意do必须换行 for i in 1 2 3 4 5 do echo $i done 3. ...

  6. linux shell判断当前目录下的文件或目录

    linux shell判断当前目录下的文件或目录 #!bin/sh for file in ./* doif test -f $filethenecho $file 是文件elseecho $file ...

  7. Linux的nm查看动态和静态库中的符号

    功能 列出.o .a .so中的符号信息,包括诸如符号的值,符号类型及符号名称等.所谓符号,通常指定义出的函数,全局变量等等. 使用 nm [option(s)] [file(s)] 有用的optio ...

  8. linux怎么打出管道命令这个符号,linux 管道命令 竖线 ‘ | ’

    管道符号,是unix功能强大的一个地方,符号是一条竖线:"|", 用法: command 1 | command 2 他的功能是把第一个命令command 1执行的结果作为comm ...

  9. 【Linux】GCC程序开发工具(下)

    00. 目录 文章目录 00. 目录 01. GCC的二进制工具 02. objdump 03. objcopy命令 04. 总结 05. 附录 01. GCC的二进制工具 objdump 显示目标文 ...

最新文章

  1. 发力大陆移动VR,HTC刚刚发布ViveWave开放平台和ViveFocus一体机
  2. 商务之路有多远,贿赂就有多远吗? 续一
  3. 反射获取空参数构造方法并运行
  4. Python—实训day4—爬虫案例3:贴吧图片下载
  5. 图片鉴黄大赛上线,请开始你的表演
  6. 操作系统实验_Chcore -- 上交IPADS操作系统银杏书配套Lab实验笔记 - Lab2内存管理(一)...
  7. 曾经很火的迅雷,为什么现在不怎么火了?
  8. 【Java】synchronized与lock的区别
  9. C语言实现飞机订票系统
  10. 大数据开发之CDH篇----cloudera-scm-agent启动不了后的一堆事
  11. linux怎样入门,Linux新手如何入门?给新手的四点建议!
  12. python中id是什么意思_什么是python的id函数
  13. 个人成长:2021年8月记
  14. python+opencv实现图像拼接
  15. 苹果手机设置邮箱服务器端口设置,苹果手机邮箱怎样设置
  16. 基于STM32F407四旋翼无人机---MS5611气压计(三)
  17. 联想拯救者y7000p加内存条_内存、硬盘不够用?手把手教你升级联想拯救者 Y7000P...
  18. HDU-1014 线性同余法
  19. SMARTBI 电子表格——分片报表
  20. 华为OD机试 - 荒地(Java JS Python)

热门文章

  1. c语言变量生存期,C语言变量的生命周期
  2. mos管的rc吸收电路计算_MOS/CMOS集成电路简介及N沟道MOS管和P沟道MOS管
  3. UE4 在游戏中使用Slate
  4. 副法线和正切是什么?
  5. c#中onclick事件请求的两种区别
  6. scp上传服务器加特殊端口
  7. 安全应对MySQL攻击
  8. #region的快捷键+++从一个页面中弹出一个新窗口,当新窗口关闭时刷新原窗口!...
  9. liunx 下的动态地址分配服务DHCP
  10. solr 高并发_Solr搜索引擎 — SolrCloud介绍和环境准备