为啥符号大小的总和远小于“.text”部分的大小?

Posted

技术标签:

【中文标题】为啥符号大小的总和远小于“.text”部分的大小?【英文标题】:Why sum of symbol size much less than ".text" section size?为什么符号大小的总和远小于“.text”部分的大小? 【发布时间】:2020-05-20 03:51:34 【问题描述】:

我在linux中调试一个动态共享库,库的名字是libMNN.so

这是libMNN.so的所有部分的大小size -A ./libMNN.so

section                  size      addr
.note.gnu.build-id         36       512
.hash                    2288       552
.dynsym                  7368      2840
.dynstr                 11637     10208
.gnu.version              614     21846
.gnu.version_r             64     22464
.rela.dyn               78720     22528
.rela.plt                3960    101248
.plt                     2672    105216
.text                  804416    107904
.rodata                 17772    912320
.eh_frame_hdr           21460    930092
.eh_frame               79160    951552
.note.android.ident       152   1030712
.init_array              1400   1097864
.fini_array                16   1099264
.data.rel.ro            33232   1099280
.dynamic                  560   1132512
.got                     1512   1133072
.data                       8   1134592
.bss                      392   1134608
.comment                  100         0
Total                 1067539

我们可以看到“.text”的大小是804416,“.rodata”的大小是17772。

这是通过命令readelf -D -sW ./libMNN.so | awk 'print $4' | awk 's+=$1 END print s'得到的符号大小的总和:

79000

符号大小之和远小于“.text”和“.rodata”,为什么?

libMNN.so可以从https://github.com/alibaba/MNN/releases/download/1.0.0/Android.zip下载

【问题讨论】:

您是否尝试过使用objdump 查看文本部分的实际内容? 【参考方案1】:

LibMNN 不导出静态、内部和内联函数(通过将它们的可见性设置为“隐藏”),因此您看不到它们的符号。由于符号对齐和文字池(存储在 ARM 上的 .text 中),浪费了更多空间。

【讨论】:

以上是关于为啥符号大小的总和远小于“.text”部分的大小?的主要内容,如果未能解决你的问题,请参考以下文章

为啥用户表的大小远小于 PostgreSQL 数据库中其他对象的大小

总和小于 M 的大小为 K 的子集的最大总和

为啥我的 favicon.ico 文件比其各部分的总和大得多?

为啥 boost::asio::read 缓冲区数据大小小于读取大小?

为啥更喜欢二进制补码而不是有符号数的符号和大小?

JVM故障问题排查心得「内存诊断系列」Xmx和Xms的大小是小于Docker容器以及Pod的大小的,为啥还是会出现OOMKilled?