案例分享:工程中同时引用某库源码与.so文件的情况
发布时间
阅读量:
阅读量
1. 问题背景
最近在Redhat Linux平台上开发模块时, 由于各种原因, 项目中同时采用了公司内部提供的源代码以及对该源代码进行了封装后的.so文件. 在编译过程中, 系统通过-l参数成功链接了.so文件, 编译过程顺利进行, 最终却导致程序在启动时崩溃. 使用gdb进行调试发现, 程序调用了.so文件中的A函数, 而该函数又调用了B函数. 恰好源码中也定义了一个名为B的函数, 因此.so中的A函数调用的实际执行的是源码中的同名B函数, 这一行为直接导致了运行结果难以预测.
2. 问题分析及验证结果
之前一直认为SO文件应当将所有依赖项预先链接好,并被视为一个独立的功能块,在任意使用情况下都不会与源码产生冲突。然而通过Core Dump的实际运行结果发现这一认识存在偏差。
为了弄清楚程序的真实运行机制,在此基础上进行了多项测试操作——总结如下:
- 当SO文件单独运行时,在外部代码调用SO中的函数时会直接触发SO自身的源代码执行功能
- 当SO与源码同时存在时,在编译阶段通过 –l参数进行静态链接的情况下运行期调用SO中的相同名称函数会导致其进入源码函数的行为发生作用(即SO中的对应函数会被覆盖)——这也就解释了为什么会崩溃
- 当外层代码通过dlopen()系列函数动态加载SO并直接调用与其命名相同的源码函数时会
全部评论 (0)
还没有任何评论哟~
