我遇到了 OS X 和 Android 之间的不同行为:
- 我的共享库中有一个弱函数
foo
, - 我想用我的可执行文件中定义的强大函数覆盖它。
- 我希望重写也会影响库内的调用
结果:我在 OS X 上得到了预期的结果,但在 Android 上失败了。
这是我的测试项目:
文件:shared.h
void library_call_foo();
void __attribute__((weak)) foo();
文件:shared.c
#include "shared.h"
#include <stdio.h>
void library_call_foo()
{
printf("shared library call foo -> ");
foo();
}
void foo()
{
printf("weak foo in library\n");
}
文件:main.c
#include <stdio.h>
#include <shared.h>
void foo()
{
printf("strong foo in main\n");
}
int main()
{
library_call_foo();
printf("main call foo -> ");
foo();
return 0;
}
我在 OS X 中使用命令编译并运行它:
clang -shared -fPIC -o libshared.so shared.c
clang -I. -L. -lshared -o test main.c
./test
如我所料返回结果:
shared library call foo -> strong foo in main
main call foo -> strong foo in main
但是当我使用 NDK 工具链为 Android 编译它时使用相同的命令:
arm-linux-androideabi-clang -shared -fPIC -o libshared.so shared.c
arm-linux-androideabi-clang -I. -L. -lshared -o test main.c
然后在设备上运行它,我得到了不同的结果:
shared library call foo -> weak foo in library
main call foo -> strong foo in main
为什么行为不同,我该如何解决?
最佳答案
Android 动态链接器实际上支持弱符号。问题是这个特殊情况是库是用 -Bsymbolic 编译的(检查这个运行“readelf -d libshared.so”)。
解决此问题的方法是在链接库时使用“-Wl,-shared”而不是“-shared”。
请参阅https://code.google.com/p/android/issues/detail?id=68956了解详细信息和解决方法。
关于android - OS X 和 Android 共享库中覆盖弱函数的不同行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20196368/