Linux动态库(.so)符号表
来源:互联网 发布:安东尼本内特体测数据 编辑:程序博客网 时间:2024/05/21 07:47
最近编译libbinder.so发现system/lib/libbinder.so只有358K,但单独编译生成的obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so有5M多,原因是前者做了strip命令操作。
1.动态链接库的符号表
动态链接库(shared object library)在linux里以.so结尾,是elf(Executable and Linkable Format)文件的一种,有两个符号表:“.symtab”和“.dynsym”。
- .symtab:
- 包含大量的信息(包括全局符号global symbols)
- .dynsym:
- 只保留“.symtab”中的全局符号
故“.dynsym”可看作“.symtab”的子集。故命令strip会去掉elf文件中“.symtab”,但不会去掉“.dynsym”。
2.为什么要strip?
这和ELF有关,ELF文件包含allocable/non-allocable ELF section。
- allocable:
- ELF包含一些sections(如code/data)是在运行时需要的,这些section被称为allocable。
- non-allocable:
- 其他一些sections仅仅是linker/debuger等工具需要但运行时不需要,被称为non-allocable。
当Linker构建ELF文件时,把allocable/non-allocable分开存放,当OS加载ELF时,仅仅allocable数据被映射到内存,non-allocable的数据仍静静地呆在文件中不被处理。所以strip命令的作用就是移除non-allocable sections。
具体请参考动态链接库和符号.
3.如何查看符号表?
- 未被strip的so库:
- 执行nm libbinder.so即可(默认查看.symtab符号表)。
- 被strip的so库:
- 由于.symtab符号表被移出,需要加上-D参数,如nm -Do libbinder.so。否则使用nm时提示no symbol。
Android中编译binder库后生成目录有:
system/lib/libbinder.so:只有几百K
obj/SHARED_LIBRARIES/libbinder_intermediates/LINKED/libbinder.so:有几M。
文章结构:
- 动态链接库的符号表
- 为什么要strip
- 如何查看符号表
0 0
- Linux动态库(.so)符号表
- linux 下 动态链接库 so 之间的符号冲突
- linux动态链接库(***.so)
- Linux+C+动态库(*.so文件)
- linux 查看 *.a *.so 符号表(zt)
- linux 查看 *.a *.so 符号表(zt)
- linux 查看 *.a *.so 符号表(zt)
- Linux 动态库 so 使用
- 动态库*.so制作-linux
- Linux查看动态库so
- linux调用.so动态库
- 链接linux 动态so库
- Linux 动态加载动态库(.so)
- Linux下静态库与动态库(.a、.so)
- Linux 动态库(.so)、静态库(.a)
- Linux动态库(.so)搜索路径(转载)
- Linux 调用动态库(.SO文件)总结
- Linux 调用动态库(.SO文件)总结
- NSStringEncoding GBK 转 UTF-8
- 数据类型各自的范围
- 安卓使用MediaRecorder实现录制视频
- 单系统登录机制原理与实现
- GitHub 上排名前 100 的 Android 开源库介绍
- Linux动态库(.so)符号表
- 文件操作函数在VFS层的实现
- IDEA下使用tomcat部署web项目
- 学校课程项目汇报:基于ubuntu的apache云服务器搭建
- AndroidStudio安装调试时自动唤醒设备
- Dubbo+Zookeeper+Spring (1)
- 小程序踩坑(不断更新)
- 一张1949年的老照片中的人物:谭平山,章伯钧,沈钧儒
- union 复习