android - 从仅导出全局和可见符号的静态存档 (`.a`) 创建共享库 (`.so`)
问题描述
我有一个foo.a
包含很多符号的静态库 ( ),例如:
0000000000000000 l d .text.finish_doctype_system_id 00000000 .text.finish_doctype_system_id
0000000000000000 gw F .text._ZN16FlutterContainer14create_elementEPKcRKNSt6__ndk13mapINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_NS2_4lessIS9_EENS7_INS2_4pairIKS9_S9_EEEEEERKNS2_10shared_ptrIN8litehtml8documentEEE 0000003c .hidden _ZN16FlutterContainer14create_elementEPKcRKNSt6__ndk13mapINS2_12basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEES9_NS2_4lessIS9_EENS7_INS2_4pairIKS9_S9_EEEEEERKNS2_10shared_ptrIN8litehtml8documentEEE
...
0000000000000000 g F .text.document_width 0000002c document_width
当我用-whole-archive
它创建一个.so
时.a
,所有符号都出现在.so
. 但是,我只希望导出全局和非隐藏符号。
在上面的案例中,我只想document_width
被导出。
解决方案
如果您正在使用 JNI,并且正在使用 JNI_OnLoad,您可以使用 RegisterNatives 方法注册所有公共符号,并使用
-fvisibility=hidden
你可以参考这个了解更多细节:https ://developer.android.com/training/articles/perf-jni#native-libraries
推荐阅读
- python - 闪信不显示
- puppet - puppet 中是否有任何资源可以在 linux 上创建“cgroup”?
- swiftui - SwiftUI 列表的透明背景——iOS14 中的行为变化
- javascript - JavaScript - 不刷新就看不到通过编辑表单发布的信息
- r - 如何根据列的因子值长度对行进行子集化?
- laravel - laravel 验证所需的空间
- ubuntu - 你如何为 ubuntu 平台构建一个 Electron.Net 应用程序?
- powershell - 自动登录到网站的 Powershell 问题
- bash - 捕获一行代码的错误流并用trap报告它,同时保持stdout不变
- google-sheets - 用于将给定列的每日运行计数制表的每单元格公式