解决动态库的符号冲突
一次debug遇到的疑惑
某天发现一个程序有点问题。祭上print大法,在关键的 lib_func()
函数里添加 print
调试信息,重新编译运行。
期望 print
出的信息一点都没有,但是程序确确实实又执行过了 libfunc()
,因为除了添加的调试 print
没有执行,libfunc()
该有的功能都执行了。这真是奇怪了。
程序不会骗人。执行的 libfunc()
肯定不是我们修改后的那个 libfunc()
,一定是别的地方有原版的 lib_func()
被执行了。一番调查,果然如此。为了便于说明,把程序和现象简化说明如下:
程序包含如下代码文件——
main.c # 主程序
plugin.c # 插件程序
lib.c lib.h # 一个库
Makefile如下:
all:main plugin
main:
cc -o main main.c lib.c -ldl -rdynamic
plugin:
cc -shared -fPIC -o plugin.so plugin.c lib.c
编译后,生成可执行程序main, 和动态库文件 plugin.so
。其中主程序运行的时候,会动态加载插件 plugin.so
(调用了 lib.c
里的程序)并执行。
怀疑出问题的地方在lib.c里。修改后的lib.c内容如下,添加了debug字样。
void lib_func()