前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >教你偷偷摸摸在别人静态库干“坏事情”

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

作者头像
Rice加饭
发布2022-05-10 17:47:36
2040
发布2022-05-10 17:47:36
举报
文章被收录于专栏:Rice嵌入式

摘要

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

流程:

  1. 创建两个文件rice.c、rice.h和CMakeLists.txt,然后编译生成librice.a。
  • rice.c文件内容:
代码语言:javascript
复制
#include "rice.h"

void rice_func()
{
    printf("rice func\n");
}
  • rice.h文件内容:
代码语言:javascript
复制
#ifndef __RICE_H
#define __RICE_H

#include <stdio.h>

void rice_func();

#endif
  • CMakeLists.txt文件内容:
代码语言:javascript
复制
SET(LIBRICE_SRC rice.c)

ADD_LIBRARY(rice STATIC ${LIBRICE_SRC})
  1. 创建文件main.c文件,然后链接静态库。
  • main.c文件内容:
代码语言:javascript
复制
#include <rice.h>

int main(int argc, char *argv[])
{
    printf("test sample\n");
    rice_func();
}
  1. 编译执行,注意输出结果:
代码语言:javascript
复制
$ gcc main.c -I ./  -L./  -lrice
$ ./a.out
test sample
rice func
  1. 创建文件test.c:
  • test.c文件内容:
代码语言:javascript
复制
#include <stdio.h>

void rice_func()
{
    printf("rice yes\n");
}

  1. 然后编译执行,会发现重复定义,以为静态库librice.a和test.c的函数重复定义:
代码语言:javascript
复制
$ 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符号弱定义:
代码语言:javascript
复制
$ objcopy -W rice_func librice.a
$
  1. 重新编译运行,注意输出结果:
代码语言:javascript
复制
$ gcc main.c -I ./  -L./  -lrice test.c
$ ./a.out
test sample
rice yes
  1. 从打印的情况,发现本来调用的库中的函数,然后库中的函数被弱定义后,调用了test.c的函数。在有些时候这个方法,可以重写一些库中的函数,然后截取库中的一些数据。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rice 嵌入式开发技术分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 摘要
  • 流程:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档