android – 当链接到共享库时,防止从静态库中删除函数?

前端之家收集整理的这篇文章主要介绍了android – 当链接到共享库时,防止从静态库中删除函数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个静态库,Foo,由共享库Bar使用. Bar是我的 Android应用加载的本机共享库. Foo包含仅由Java代码调用的JNI函数,而不是Bar中的任何C代码.因此,在构建共享库(Bar)时,这些JNI函数会从静态库(Foo)中删除.我目前正在使用一种稍微粗暴的方法来防止这种情况发生.

那么,在这种情况下,有没有办法告诉编译器在链接时不要删除JNI(或任何)函数

解决方法

他们没有被剥夺,他们被忽略了.链接共享库时,链接器仅使用实际使用的函数提取目标文件. (这是静态库的定义方式.)

我相信将“–whole-archive”标志传递给链接器会导致它从静态库中提取所有目标文件.您可以在gcc链接行中使用“-Wl,-whole-archive”提供它.在指定库之后,您需要使用“-Wl,-no-whole-archive”跟随它,或者ld将继续执行它遇到的任何其他静态库的行为,这可能不是您想要的行为.另请参见Linux系统上的ld(1)手册页.

另一种完成相同操作的方法输出单个大型.o文件而不是.a文件.

编辑:
简单的命令行示例,在桌面上使用libz:

% echo "int main() { return 0; }" > foo.c
% gcc -o foo /usr/lib/libz.a foo.c
% ls -s foo
12 foo*
% gcc -o foo -Wl,-whole-archive /usr/lib/libz.a -Wl,-no-whole-archive foo.c
% ls -s foo
104 foo*

(你必须在这里使用“/usr/lib/libz.a”而不是“-lz”,因为后者找到共享库/usr/lib/libz.so.)

我没有多少使用NDK,但看起来像将标志添加到LOCAL_LDFLAGS可能会有所帮助.

猜你在找的Android相关文章