Linux动态库(.so)符号表 您所在的位置:网站首页 静态函数库的名字叫什么 Linux动态库(.so)符号表

Linux动态库(.so)符号表

2023-08-09 21:05| 来源: 网络整理| 查看: 265

       最近编译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如何查看符号表



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有