Android NDK隐藏jni动态库的内部符号表
来源:互联网 发布:美国购物节网络星期一 编辑:程序博客网 时间:2024/05/17 03:10
http://bbs.chinavideo.org/viewthread.php?tid=10844
写过win32程序的朋友对dll导出函数名都很熟悉,大家都可以通过.def文件或者__declspec(dllexport)来指定导出的函数名。在android下,可执行文件或者动态链接库用的是elf格式,和win32的pe格式有所不同。当编译动态链接库时,缺省的编译选项下默认所有的符号表都会导出。以android-ndk下的san-angeles例子为例,用ndk编译之后生成的jni动态库导出的符号表可以用下面命令看到(默认开发环境为win32 cygwin):
这里可以看到几乎所有的函数名全局变量名都会被导出。其中有Java_com_example_SanAngeles_为前缀的JNI接口函数,有importGLInit这些普通函数,有freeGLObject这些局部(static)函数,还有sStartTick等全局变量名。其实在这个动态发布的时候,只需要导出java_com_开头的jni函数就可以了,里面这些细节函数名完全不需要暴露出来。
如何做到这一点呢?首先,我们需要了解gcc新引进的选项-fvisibility=hidden,这个编译选项可以把所有的符号名(包括函数名和全局变量名)都强制标记成隐藏属性。我们可以在Android.mk中可以通过修改LOCAL_CFLAGS选项加入-fvisibility=hidden来做到这一点,这样编译之后的.so看到的符号表为:
这里可以看到所有源代码里出现的函数名和全局变量名(符号名)都变成了't',也就是说都是局部符号(类似于static),这样这些函数名主程序是看不到的。我们还需要把jni的入口函数变成'T'类型才行,我们可以修改jni入口函数的属性来导出这些入口函数,比如app-android.c中的Java_com_example_SanAngeles_DemoRenderer_nativeInit函数,可以改为:
其他几个Java_com_example_SanAngeles_开头的函数也这样修改一下即可。这样编译之后我们看到的符号表里所有Java_com_example_SanAngeles_开头的函数又变成'T'类型了。
最后我们还有一个问题就是如何隐藏那些局部符号名呢(t类型的符号)?我们可以调用strip -x来去掉这些局部的符号名。我们可以通过修改Android.mk重定义cmd-strip这个命令来实现,修改后的Android.mk如下:
这样每次编译之后会自动strip掉这些局部的符号名,如下:
这样局部符号都没有了,只有jni入口函数被导出。这样提高了jni动态库的安全性,同时.so文件的大小也小了不少。
关于elf文件的更多资料,可以参考这篇文章。如果要了解gcc和strip更多的选项,请移步gcc和binutils的官方文档。
0 0
- Android NDK隐藏jni动态库的内部符号表
- Android NDK隐藏jni动态库的内部符号表
- Android NDK隐藏jni动态库的内部符号表
- Android NDK隐藏jni动态库的内部符号表
- Android NDK隐藏jni动态库的内部符号表
- 动态库的符号隐藏
- 简单实现Android NDK编译jni调用动态库开发
- android NDK开发 静态/动态注册 jni
- android jni 的编写二 (NDK 开发中动态注册Jni)
- android JNI (NDK)的故事
- android(NDK+JNI)---NDK 编译和使用静态库、动态库
- Android JNI和NDK学习(03)--动态方式实现JNI
- Android JNI和NDK学习(03)--动态方式实现JNI
- 开发so动态库模版(NDK、JNI)
- Jni中执行ndk-build,编译第三方静态库(.a)和动态库(.so)的Android.mk文件写法
- linux下动态库的符号冲突、隐藏和强制优先使用库内符号
- linux下动态库的符号冲突、隐藏和强制优先使用库内符号
- linux下动态库的符号冲突、隐藏和强制优先使用库内符号
- Android--173个项目源码
- git checkout -b 报错
- Java的两种赋值的区别
- C#Winform程序如何发布并自动升级(图解)
- Hibernate中的单向多对一关联
- Android NDK隐藏jni动态库的内部符号表
- java数值范围以及float与double精度丢失问题
- windows笔记-内存映射文件
- spring mvc 1
- Android贝塞尔动画实现QQ,虎牙等平台点赞效果初探
- NoClassDefFoundError org/codehaus/plexus/compile/util/scan/mapping/SuffixMapping
- hive的安装和配置
- AndroidManifest合并原理
- 经决策网站需要改版?!这些内容最好别动!