首页 文章

Android共享库的节大小总和大于共享的lib大小

提问于
浏览
0

在Android中,如果我使用objdump工具分析共享库,我会观察到以下内容:

共享库中节大小的总和小于二进制文件大小 . 这是可以理解的,二进制大小= ELF Headers 大小程序 Headers 大小节大小节 Headers 大小 .

但是对于另一个共享库,节大小的总和大于共享库文件大小本身!这似乎非常令人惊讶 . 有没有这种情况会发生?

使用的命令:捕获截面尺寸:prebuilts / gcc / linux-x86 / arm / arm-eabi-4.6 / arm-eabi / bin / objdump -x

要计算共享库的文件大小:ls -l

1 回答

  • 0

    你只是猜测,但这可能是因为 .bss 部分 .

    .bss 包含程序启动时未显式初始化的所有静态或全局变量 . 因为它们没有初始值,所以二进制文件不需要包含任何实际值 . 该部分就是占位符 . 它将具有元数据(大小,位置,符号偏移),但没有实际数据 .

    当您将程序加载到内存中以运行它时,不需要从文件中实际加载任何内容,但ELF加载程序将在正确的位置保留适当的内存量,并且程序的工作是零 - 初始化该内存(通常是 crt1.o 代码执行此操作) .

    这是一个例子:

    objdump -x /bin/bash
    ....
    Idx Name          Size      VMA               LMA               File off  Algn
    ....
     24 .data         00008360  00000000006db620  00000000006db620  000db620  2**5
                      CONTENTS, ALLOC, LOAD, DATA
     25 .bss          00005a48  00000000006e3980  00000000006e3980  000e3980  2**5
                      ALLOC
     26 .gnu_debuglink 0000000c  0000000000000000  0000000000000000  000e3980  2**0
                      CONTENTS, READONLY
    

    这里有三种不同的部分:

    • .data 是"normal"部分,设置了 CONTENTSALLOCLOAD 标志 .

    • .bss 没有要存储或加载的实际数据,因此它只有 ALLOC .

    • .gnu_debuglink 根本不适用于正在运行的程序;它没有 VMALMA 设置,并且没有设置 ALLOCLOAD 标志,尽管它确实有 CONTENTS (用于链接/调试目的)

相关问题