Linux下使用dlclose与dlopen重载动态库,Clang编译正常但GCC编译异常
Linux下使用dlclose与dlopen重载动态库,Clang编译正常但GCC编译异常
最近碰到一个挺头疼的问题,我写了一段循环动态加载、调用、卸载动态库的代码,逻辑上每次循环都应该重新加载库,但实际测试时出现了明显差异:
先看主程序的核心代码:
while (true) { void* lib = dlopen("bin/liblibrary.so", RTLD_NOW | RTLD_LOCAL); assert(lib); typedef void (*f_t)(void); f_t f = (f_t)dlsym(lib, "foo"); assert(f); f(); int res = dlclose(lib); assert(!res); }
对应的动态库代码非常简单,就是一个基础的打印函数:
extern "C" void foo() { printf("hello from foo\n"); }
这段代码的预期行为是每次循环都重新加载动态库——如果修改库的代码后重新编译,主程序应该立刻执行新的foo逻辑。
测试环境为Arch Linux:
- 用Clang 17.0.6编译时,完全符合预期:修改库代码重新编译后,主程序循环调用的就是新的
foo函数。 - 但用GCC 14.1.1编译相同代码(主程序用
g++ main.cpp -o main,库用g++ -shared -fPIC -o liblibrary.so library.cpp),异常就出现了:即使重新编译了动态库,主程序还是一直调用旧的foo函数,完全没有加载新的库内容。
备注:内容来源于stack exchange,提问作者Jakub Arnold
相关产品推荐
相关产品推荐

