在Android中,如果我使用objdump工具分析共享库,我会观察到以下内容:
共享库中节大小的总和小于二进制文件大小 . 这是可以理解的,二进制大小= ELF Headers 大小程序 Headers 大小节大小节 Headers 大小 .
但是对于另一个共享库,节大小的总和大于共享库文件大小本身!这似乎非常令人惊讶 . 有没有这种情况会发生?
使用的命令:捕获截面尺寸:prebuilts / gcc / linux-x86 / arm / arm-eabi-4.6 / arm-eabi / bin / objdump -x
要计算共享库的文件大小:ls -l
1 回答
你只是猜测,但这可能是因为
.bss
部分 ..bss
包含程序启动时未显式初始化的所有静态或全局变量 . 因为它们没有初始值,所以二进制文件不需要包含任何实际值 . 该部分就是占位符 . 它将具有元数据(大小,位置,符号偏移),但没有实际数据 .当您将程序加载到内存中以运行它时,不需要从文件中实际加载任何内容,但ELF加载程序将在正确的位置保留适当的内存量,并且程序的工作是零 - 初始化该内存(通常是
crt1.o
代码执行此操作) .这是一个例子:
这里有三种不同的部分:
.data
是"normal"部分,设置了CONTENTS
,ALLOC
和LOAD
标志 ..bss
没有要存储或加载的实际数据,因此它只有ALLOC
..gnu_debuglink
根本不适用于正在运行的程序;它没有VMA
或LMA
设置,并且没有设置ALLOC
或LOAD
标志,尽管它确实有CONTENTS
(用于链接/调试目的)