电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
教你偷偷摸摸在别人静态库干“坏事情”
分 享
扫描二维码分享
教你偷偷摸摸在别人静态库干“坏事情”
弱定义
Rice嵌入式开发
关注
发布时间: 2021-04-07
丨
阅读: 396
## 摘要 - 这篇文章主要总结一下工作中的一些细节,作为笔录。 - 其实静态库干"坏事情"就是将库里面的函数弱定义。然后再外部重新定义该函数。接管库中函数的操作。 - 下面我以一个小小demo来做演示整个流程。 ## 流程: 1. 创建两个文件rice.c、rice.h和CMakeLists.txt,然后编译生成librice.a。 - rice.c文件内容: ``` C #include "rice.h" void rice_func() { printf("rice func\n"); } ``` - rice.h文件内容: ``` C #ifndef __RICE_H #define __RICE_H #include
void rice_func(); #endif ``` - CMakeLists.txt文件内容: ``` C SET(LIBRICE_SRC rice.c) ADD_LIBRARY(rice STATIC ${LIBRICE_SRC}) ``` 2. 创建文件main.c文件,然后链接静态库。 - main.c文件内容: ``` C #include
int main(int argc, char *argv[]) { printf("test sample\n"); rice_func(); } ``` 3. 编译执行,注意输出结果: ``` C $ gcc main.c -I ./ -L./ -lrice $ ./a.out test sample rice func ``` 4. 创建文件test.c: - test.c文件内容: ``` C #include
void rice_func() { printf("rice yes\n"); } ``` 5. 然后编译执行,会发现重复定义,以为静态库librice.a和test.c的函数重复定义: ``` C $ gcc main.c -I ./ -L./ -lrice test.c /tmp/ccLygTKk.o: In function `rice_func': test.c:(.text+0x0): multiple definition of `rice_func' .//librice.a(rice.c.o):rice.c:(.text+0x0): first defined here collect2: error: ld returned 1 exit status ``` 6. 因为很多时候在一些中,有一些厂商只提供库文件,但是又想在库中插一脚那么怎么办呢?使用弱定义,将库中的rice_func符号弱定义: ``` C $ objcopy -W rice_func librice.a $ ``` 7. 重新编译运行,注意输出结果: ``` C $ gcc main.c -I ./ -L./ -lrice test.c $ ./a.out test sample rice yes ``` 8. 从打印的情况,发现本来调用的库中的函数,然后库中的函数被弱定义后,调用了test.c的函数。在有些时候这个方法,可以重写一些库中的函数,然后截取库中的一些数据。
关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。 ![](https://RiceChen0.gitee.io/picture/logo/logo_.jpg)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
0
)
Rice嵌入式开发
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交