首页 > 编程语言 >C/C++程序隐藏符号

C/C++程序隐藏符号

时间:2023-02-23 11:56:11浏览次数:34  
标签:__ 函数 符号 default attribute visibility so C++ 隐藏

使用visibility

#ifdef __cplusplus  //如果是C++语言
#define PASSPORT_EXTERN         extern "C" __attribute__((visibility ("default")))
#else
#define PASSPORT_EXTERN         extern __attribute__((visibility ("default")))
#endif

GNU C 的一大特色就是attribute 机制。
试想这样的情景,程序调用某函数A,A函数存在于两个动态链接库liba.so,libb.so中,并且程序执行需要链接这两个库,此时程序调用的A函数到底是来自于a还是b呢?
这取决于链接时的顺序,比如先链接liba.so,这时候通过liba.so的导出符号表就可以找到函数A的定义,并加入到符号表中,链接libb.so的时候,符号表中已经存在函数A,就不会再更新符号表,所以调用的始终是liba.so中的A函数。
为了避免这种混乱,所以使用

__attribute__((visibility("default")))  //默认,设置为:default之后就可以让外面的类看见了。
__attribute__((visibility("hideen")))  //隐藏

设置这个属性。

visibility用于设置动态链接库中函数的可见性,将变量或函数设置为hidden,则该符号仅在本so中可见,在其他库中则不可见。

g++在编译时,可用参数-fvisibility指定所有符号的可见性(不加此参数时默认外部可见,参考man g++中-fvisibility部分);若需要对特定函数的可见性进行设置,需在代码中使用attribute设置visibility属性。

编写大型程序时,可用-fvisibility=hidden设置符号默认隐藏,针对特定变量和函数,在代码中使用attribute ((visibility("default")))另该符号外部可见,这种方法可用有效避免so之间的符号冲突。

经测试,C++会导出函数参数,C的方式不会,两者不能通用。

使用version-script

set_target_properties(your_so_or_exe PROPERTIES LINK_FLAGS "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/symbol.version")

symbol.version:

{
    global:JNI_OnLoad;JNI_OnUnload;Java_*;usedFun;
    local:*;
};

标签:__,函数,符号,default,attribute,visibility,so,C++,隐藏
From: https://www.cnblogs.com/flying_bat/p/17147415.html

相关文章

  • C++ 11
    C++11有哪些新特性?nullptr替代NULL引入了auto和decltype这两个关键字实现了类型推导基于范围的for循环for(auto&i:res){}类和结构体的中初始化列表Lambda......
  • JQuery_案例1_广告显示和隐藏与JQuery_案例2_抽奖_演示
    JQuery_案例1_广告显示和隐藏<!DOCTYPEhtml><html><head><metacharset="UTF-8"><title>广告的自动显示与隐藏</title><style>#content......
  • C++ vector容器
    日常使用方法,当作是数据类型好了初始化:intN=5;//元素个数intarray1={1,2,3,4,5,6};vector<int>a(N);//创建固定大小,默认为0vector<int>a(N,M);//......
  • C++基础
    类型名称字节其他名称值的范围int4signed–2,147,483,648到2,147,483,647unsignedint4unsigned0到4,294,967,295__int8......
  • C++ 基础知识-- 1
                 ......
  • LinuxShell常用特殊符号
    LinuxShell常用特殊符号引用地址—向作者致敬http://www.cnblogs.com/balaamwe/archive/2012/03/15/2397998.html所有常用符号汇总#;;;.,/......
  • 在 Visual Studio 中远程调试 C++ 项目
    参考​​远程调试C++项目-VisualStudio(Windows)|MicrosoftLearn​​工具应用本地文件搜索:msvsmon.exe安装完成VS,默认都会自带远程调试工具,解决了官网下载需要注册......
  • 如何快速找出文件夹里的全部带有符号&纯符号的文件
    参考此文章:如何快速找出文件夹里的全部带有中文&纯中文的文件只需要根据自己的需求,把下面相关的设置调整好即可 ......
  • C++ 17 遍历文件夹图片文件进行循环操作
    #include<filesystem>usingnamespacestd;namespacefs=std::filesystem; stringpath=filepath;//替换为指定目录的路径 for(constauto&entry:fs::dir......
  • 有符号数和无符号数
    有符号数数据二进制的最高位为符号位,其它位是数据位。最高位是1,表示负数。最高位是0,表示正数以一字节为例:11111111~10000000~00000000~01111111......