Rice我叫加饭? · 2021年03月24日

教你偷偷摸摸在别人静态库干“坏事情”

首发:Rice 嵌入式开发技术分享
作者:RiceDIY

摘要

  • 这篇文章主要总结一下工作中的一些细节,作为笔录。
  • 其实静态库干"坏事情"就是将库里面的函数弱定义。然后再外部重新定义该函数。接管库中函数的操作。
  • 下面我以一个小小demo来做演示整个流程。

流程:

  1. 创建两个文件rice.c、rice.h和CMakeLists.txt,然后编译生成librice.a。
  • rice.c文件内容:
#include "rice.h"  
  
void rice_func()  
{  
    printf("rice func\n");  
}  
  • rice.h文件内容:
#ifndef __RICE_H  
#define __RICE_H  
  
#include <stdio.h>  
  
void rice_func();  
  
#endif  
  • CMakeLists.txt文件内容:
SET(LIBRICE_SRC rice.c)  
  
ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})  
  1. 创建文件main.c文件,然后链接静态库。
  • main.c文件内容:
#include <rice.h>  
  
int main(int argc, char *argv[])  
{  
    printf("test sample\n");  
    rice_func();  
}  
  1. 编译执行,注意输出结果:
$ gcc main.c -I ./  -L./  -lrice  
$ ./a.out  
test sample  
rice func  
  1. 创建文件test.c:
  • test.c文件内容:
#include <stdio.h>  
  
void rice_func()  
{  
    printf("rice yes\n");  
}  
  
  1. 然后编译执行,会发现重复定义,以为静态库librice.a和test.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  
  1. 因为很多时候在一些中,有一些厂商只提供库文件,但是又想在库中插一脚那么怎么办呢?使用弱定义,将库中的rice\_func符号弱定义:
$ objcopy -W rice_func librice.a  
$  
  1. 重新编译运行,注意输出结果:
$ gcc main.c -I ./  -L./  -lrice test.c  
$ ./a.out  
test sample  
rice yes  
  1. 从打印的情况,发现本来调用的库中的函数,然后库中的函数被弱定义后,调用了test.c的函数。在有些时候这个方法,可以重写一些库中的函数,然后截取库中的一些数据。

关注微信公众号『Rice嵌入式开发技术分享』,后台回复“微信”添加作者微信,备注”入群“,便可邀请进入技术交流群。

image.png
推荐阅读

更多嵌入式技术干货请关注Rice 嵌入式开发技术分享
推荐阅读
关注数
1761
内容数
51
一个周末很无聊的嵌入式软件工程师,写写经验,写写总结。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息