当前位置: 首页 > news >正文

封装SDK时如何隐藏内部符号

封装SDK时如何隐藏内部符号

  • 原始工程
    • 静态库(内部使用)
    • 动态库(外部使用)
  • 方法一(-fvisibility=hidden):
    • 静态库(内部使用)
    • 动态库(外部使用)
  • 方法二(-Wl,-Bsymbolic -Wl,--exclude-libs,ALL):
    • 静态库(内部使用)[无修改]
    • 动态库(外部使用)

在封装SDK,对外提供API时。希望不暴露内部符号,免得产生冲突,给集成带来麻烦.本文演示了二种方法

原始工程

静态库(内部使用)

cat <<EOF | sudo tee internal_function.c
#include <stdio.h>
int internal_function()
{printf("%s\n",__FUNCTION__);
}
EOF
gcc -c internal_function.c -o internal_function.o
ar rcs libinternal_function.a internal_function.o
nm libinternal_function.a | grep "internal_function" | grep "T"
#0000000000000000 T internal_function

动态库(外部使用)

cat <<EOF | sudo tee public_function.c
#include <stdio.h>
extern int internal_function();
int public_function()
{printf("%s\n",__FUNCTION__);internal_function();
}
EOF
gcc -fPIC -shared -o libpublic_function.so public_function.c libinternal_function.a
nm libpublic_function.so | grep -w "T"
#0000000000001164 T internal_function
#0000000000001139 T public_functionreadelf -s libpublic_function.so | grep -w  GLOBAL
#     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
#     6: 0000000000001139    43 FUNC    GLOBAL DEFAULT   14 public_function
#     7: 0000000000001164    33 FUNC    GLOBAL DEFAULT   14 internal_function
#    48: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.2.5
#    50: 0000000000001139    43 FUNC    GLOBAL DEFAULT   14 public_function
#    52: 0000000000001164    33 FUNC    GLOBAL DEFAULT   14 internal_function

可见 internal_function也对外暴露了,如果其它SDK中也有这样一个函数,后果很严重

方法一(-fvisibility=hidden):

静态库(内部使用)

cat <<EOF | sudo tee internal_function.c
#include <stdio.h>
int internal_function()
{printf("%s\n",__FUNCTION__);
}
EOF
# 编译选项增加 -fvisibility=hidden -fvisibility-inlines-hidden
gcc -fvisibility=hidden -fvisibility-inlines-hidden \-c internal_function.c -o internal_function.o
ar rcs libinternal_function.a internal_function.o
nm libinternal_function.a | grep -w "T"
#0000000000000000 T internal_function

动态库(外部使用)

cat <<EOF | sudo tee public_function.c
#include <stdio.h>
extern int internal_function();# API增加 __attribute__ ((visibility ("default"))) 修饰
__attribute__ ((visibility ("default"))) int public_function()
{printf("%s\n",__FUNCTION__);internal_function();
}
EOF#编译选项增加 -fvisibility=hidden -fvisibility-inlines-hidden
gcc -fvisibility=hidden -fvisibility-inlines-hidden \-fPIC -shared -o libpublic_function.so public_function.c \libinternal_function.a
nm libpublic_function.so | grep -w "T"
#0000000000001119 T public_functionreadelf -s libpublic_function.so | grep -w  GLOBAL
#     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
#     6: 0000000000001119    43 FUNC    GLOBAL DEFAULT   14 public_function
#    49: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@@GLIBC_2.2.5
#    51: 0000000000001119    43 FUNC    GLOBAL DEFAULT   14 public_function

方法二(-Wl,-Bsymbolic -Wl,–exclude-libs,ALL):

静态库(内部使用)[无修改]

cat <<EOF | sudo tee internal_function.c
#include <stdio.h>
int internal_function()
{printf("%s\n",__FUNCTION__);
}
EOF
gcc -c internal_function.c -o internal_function.o
ar rcs libinternal_function.a internal_function.o
nm libinternal_function.a | grep -w "T"
#0000000000000000 T internal_function

动态库(外部使用)

cat <<EOF | sudo tee public_function.c
#include <stdio.h>
extern int internal_function();
int public_function()
{printf("%s\n",__FUNCTION__);internal_function();
}
EOF# 编译选项增加 -Wl,-Bsymbolic -Wl,--exclude-libs,ALL
gcc -Wl,-Bsymbolic -Wl,--exclude-libs,ALL \-fPIC -shared -o libpublic_function.so public_function.c \libinternal_function.a
nm libpublic_function.so | grep -w "T"
#0000000000001119 T public_functionreadelf -s libpublic_function.so | grep -w  GLOBAL
#     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.2.5 (2)
#     6: 0000000000001119    33 FUNC    GLOBAL DEFAULT   14 public_function
#    51: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@@GLIBC_2.2.5
#    53: 0000000000001119    33 FUNC    GLOBAL DEFAULT   14 public_function

相关文章:

  • bacnet cov机制详细介绍
  • 第六章 Windows 10 注册表 实验案例二
  • Java 集合类的高级特性介绍
  • 21、状态模式(行为性模式)
  • 模板不存在:./Application/Home/View/OnContact/Index.html 错误位置
  • 如何隐藏前端项目编译后的.map文件
  • LDC——用于边缘检测的轻量级密集神经网络原理与C++推理
  • 科技云报道:阿里云降价,京东云跟进,谁能打赢云计算价格战?
  • OrangePiLinux连接小米手机使用adb显示“List of devices attached”的问题解决
  • Qt设置右键菜单无效customContextMenuRequested(const QPoint pos)
  • git workflow
  • 算法D39 | 动态规划2 | 62.不同路径 63. 不同路径 II
  • 前端性能优化 | CDN缓存
  • HBase介绍、特点、应用场景、生态圈
  • 每日一练:LeeCode-35、搜索插入位置【数组】、面试题 01.08. 零矩阵【数组】、面试题 01.07. 旋转矩阵【数组+行列翻转】
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • Android 控件背景颜色处理
  • css属性的继承、初识值、计算值、当前值、应用值
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • HTTP--网络协议分层,http历史(二)
  • Java,console输出实时的转向GUI textbox
  • Median of Two Sorted Arrays
  • Promise面试题,控制异步流程
  • Swift 中的尾递归和蹦床
  • Vultr 教程目录
  • WinRAR存在严重的安全漏洞影响5亿用户
  • Yeoman_Bower_Grunt
  • 安卓应用性能调试和优化经验分享
  • 后端_ThinkPHP5
  • 将回调地狱按在地上摩擦的Promise
  • 每天一个设计模式之命令模式
  • 如何使用 JavaScript 解析 URL
  • 实习面试笔记
  •  一套莫尔斯电报听写、翻译系统
  • 用Visual Studio开发以太坊智能合约
  • 中文输入法与React文本输入框的问题与解决方案
  • LevelDB 入门 —— 全面了解 LevelDB 的功能特性
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 说说我为什么看好Spring Cloud Alibaba
  • ​学习一下,什么是预包装食品?​
  • #设计模式#4.6 Flyweight(享元) 对象结构型模式
  • (26)4.7 字符函数和字符串函数
  • (6)设计一个TimeMap
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (附源码)springboot 校园学生兼职系统 毕业设计 742122
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (九)One-Wire总线-DS18B20
  • (转)nsfocus-绿盟科技笔试题目
  • (转载)(官方)UE4--图像编程----着色器开发
  • (转载)利用webkit抓取动态网页和链接
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .net core 依赖注入的基本用发