CPP静态连接与符号修改

6 篇文章 0 订阅

C++静态连接与符号修改

原因

  1. 在做API(或者叫SDk开发包)时,客户要求跨平台即支持windows;故引入了boost库
  2. 在引入boost库后,客户开发环境就依赖boost库;有些开发者觉得依赖boost环境麻烦;
  3. 引入boost库可能与客户已经使用的boost库版本不同;

解决方法

  1. 针对客户不需要依赖boost库环境,将boost库进行静态连接,并对外提供的头文件不包含boost相关头文件的引用;
  2. 针对API与客户程序使用boost版本不同情况,linux下修改boost符号;

静态连接

  • 编译生成boost库的.a文件,在编译API时使用该静态连接库替换动态链接库;
  • 对于APi暴露出的头文件进行封装,即对外的接口(.h文件中)或者类型定义使用非boost类型,将boost相关的操作全部放在cpp文件中即可;
  • 如:需要更加深层的操作,可对编译的so使用非导出方式(linux gcc默认符号是导出方式);cxxflags="-fvisibility=hidden",对.h中需要导出的符号使用导出符;
#define EXPORT __attribute__((visibility("default"))

修改符号

  • 将boost库编译并链接;
  • 查询所有的boost的.o文件,并将所有的.o文件打包成如:ar crv xxx.a ./*.o
  • 将boost库的所有.o文件的global相关的boost符号过滤,并生成文件newsymbols内容为:boostxxx boostxxxA_
  • 符号替换
objcopy --redefine-syms newsymbols
  • 使用同样的方法,在编译API的.so时,先编译出.o以及链接成so(需记住此时的链接命令)
  • 删除该so,使用同样的符号修改方法,将上述.o文件中boost符号修改成 boostxxxxA;
  • 将修改后的.o文件,使用链接命令链接成.so,如此即可完成修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值