我用简短的篇幅描述下这个坑。
如下代码编译成动态库:
void foo() {
printf("i am foo");
}
void bar() {
foo();
}
如果只加载这个动态库,并通过dlsym找到bar来调用,是符合预期的。
但如果在加载这个动态库前加载了另外一个动态库,而且前面加载的动态库也含有一个全局的foo函数,可能(我环境测试是“一定”)会调用到前面动态库的foo函数,而不是直觉上的同一动态库,甚至同一文件下的foo函数。
这是在window wsl ubuntu下的测试结果,我不确认这是window wsl ubuntu这特定平台的规则,或者特定版本编译器的规则。对我来说这十分反直觉,故分享下。