动态共享库引发的double free错误的分析

本文讨论了在特定情况下,动态链接库可能导致的double free错误。通过场景对比,作者发现错误出现在将动态链接库与主程序一起编译时。通过对链接过程的深入理解和问题的逐步缩小,解析了由于动态库加载和卸载过程中对静态全局变量的处理导致的问题。解决方案包括调整链接顺序或把静态库转换为动态库。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题背景

项目中遇到了这么个场景:项目中,所有文件可以生成一个动态链接库A.so

场景1:

A.so 假设由N个.o生成,不妨假设由a.o,b.o生成。

如果将main.cpp -> main.o

main.o, a.o, b.o  -> main_bin,运行./main_bin,运行正常。

 

场景2:

将A.so、main.cpp,两个一起生成一个可执行程序

即是main.cpp -> main.o

A.so , main.o -> main_bin,运行./main_bin,出现在double free问题。真实的现场长这个样子

glibc detected ***  double free or corruption(fasttop)

问题初步分析

直接原因,肯定是因为某个变量被重复释放了。可是,这可能是什么原因导致呢?直接换一种编绎方式去生成目标可执行程序,就不会出现问题,真是太奇怪了!

这时候,自己确实没有什么思路,一般常用手段,就是求助百度君,谷歌君了,看看有没有前人一些经验可以借鉴。

在查找问题的过程中,自己发现理论知识上的几个盲区:

1、GCC对静态链接库的链接过程是怎么样?

2、对动态链接库的过程是怎么样?

3、项目代码比较庞大,想办法缩小问题,进行定位。

对于问题1,2,可以参考一本书籍《程序员的自我修养—链接、装载与库》,花了一个晚上时间把相关章节学习。

问题缩小

对于研究问题,找到网上一则示例代码,可以非常完美的重现项目中的错误。

foo.h
#ifndef _FOO_H
#define _FOO_H
#include <stdio.h>
#include <string>
class Foo {
     public :
         static Foo s_foo;
         Foo();
         ~Foo();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值