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

摘要

  • 这篇文章主要总结一下工作中的一些细节,作为笔录。

  • 其实静态库干"坏事情"就是将库里面的函数弱定义,然后再外部重新定义该函数,接管库中函数的操作。

  • 下面我以一个小小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的函数。在有些时候这个方法,可以重写一些库中的函数,然后截取库中的一些数据。

1.外媒谈英伟达-Arm并购案~

2.这里聚焦了全球嵌入式技术风景~

3.航天器、导弹喜欢用单片机?

4.工程师的硬核单片机编程思想~

5.嵌入式开发需要架构设计吗?

6.【技术转管理必备】嵌入式产品的研发流程

免责声明:本文系网络转载,版权归原作者所有。如涉及作品版权问题,请与我们联系,我们将根据您提供的版权证明材料确认版权并支付稿酬或者删除内容。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值