• (二十五)防编译后函数名通过ida查看到


    在使用多个动态库时,两个动态库之间有可能存在相同名称的函数,这样会出现只有第一个函数生效,即所有对该函数的调用都将指向第一个加载的动态库的同名函数中。这样就会很混乱,而且在想改名称也不是很简单的情况下就会很麻烦(例如同名函数太多,甚至就是模板)等等。

    处理方法
    这里只找到一种处理方法,当然你直接把名字改成不一样或者统一添加前缀(例如C++ namespace)也不错。方法如下:

    -fvisibility=hidden
    将以上的写入gcc/g++中去,从.o的生成到.so的生成的命令行都要填上。这个有什么作用呢?GUN规定动态库中的所有函数的全局变量默认是对外可见的,如果编译动态库时不添加以上参数,默认是可见的,添加之后,如果调用动态库的函数,会报错:

    undefined symbol: XXX
    所以还没有结束,接着就是要把动态库部分需要对外显示的函数接口显示出来:例如模块的入口函数:

    __attribute__((visibility("default"))) int app_main(void)

    __attribute__作用:

    __attribute__ 可以设置函数属性(Function Attribute)、变量属性(Variable Attribute)和类型属性(Type Attribute)

    格式:__attribute__(((visibility("default"),,,,,))

    参考:
    https://blog.csdn.net/u010144805/article/details/80811214

  • 相关阅读:
    java(一) 基础部分
    Spring使用Autowiring自动装配 解决提示报错小技巧
    idea 中dao层自动生成接口
    从git远程仓库Checkout项目到本地
    idea 新建项目上传至git(coding)
    使用Travis CI给hexo部署做持续集成
    LeetCode395-至少有 K 个重复字符的最长子串
    Java注解
    Java反射
    Java反射应用实例
  • 原文地址:https://www.cnblogs.com/zhangshenghui/p/12034351.html
Copyright © 2020-2023  润新知