C语言 为什么Linux共享库在内存中可能比在磁盘上更大?

kpbwa7wx  于 2023-10-16  发布在  Linux
关注(0)|答案(2)|浏览(101)

我开始在Linux中编写更多的代码,并试图更好地感受与windows非常不同的环境/API。无论如何,我正在尝试共享库。所以(相对于windows.dll),注意到当一个共享对象加载到内存中时,它比磁盘上的要大7752字节?我希望磁盘上的图像与内存中的图像相匹配,或者下面的演示代码中有错误?
godbolt的示例显示了以下输出:

Program returned: 0
Program stdout
Loaded: linux-vdso.so.1
Loaded: /lib/x86_64-linux-gnu/libc.so.6
---------------------MEMORY-------------------------
libc.so.6 size: 2037344 bytes
7fb5733e4000  7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00   .ELF............
7fb5733e4010  03 00 3e 00 01 00 00 00 c0 41 02 00 00 00 00 00   ..>......A......
7fb5733e4020  40 00 00 00 00 00 00 00 18 e7 1e 00 00 00 00 00   @...............
...
7fb5735d5630  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
7fb5735d5640  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
7fb5735d5650  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................
---------------------DISK-------------------------
libc.so.6 size: 2029592 bytes
7fb5731f2010  7f 45 4c 46 02 01 01 03 00 00 00 00 00 00 00 00   .ELF............
7fb5731f2020  03 00 3e 00 01 00 00 00 c0 41 02 00 00 00 00 00   ..>......A......
7fb5731f2030  40 00 00 00 00 00 00 00 18 e7 1e 00 00 00 00 00   @...............
...
7fb5733e17f8  00 00 00 00 00 00 00 00 c8 e2 1e 00 00 00 00 00   ................
7fb5733e1808  4b 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00   K...............
7fb5733e1818  01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   ................

问题

我很好奇为什么共享库的大小在磁盘和内存之间存在差异?

cwxwcias

cwxwcias1#

作为一个变体,它可以使用相当大的. blog部分(未初始化的静态和全局变量)。
例如函数

void foo(char * dst, size_t len)
{
    static char table[4096];
    static int initialized;

    if (!initialized)
    {
        for (size_t i = 0; i < sizeof table; i++)
            table[i] = rand();
        initialized = 0;
    }

    for (size_t i = 0; i < length; i++)
        dst[i] &= table[i % sizeof(table)];
}
5jdjgkvh

5jdjgkvh2#

为什么Linux共享库在内存中可能比在磁盘上更大?
共享对象基本上是一个有多个入口点而不是一个入口点的程序。因此,它有一个.text段,一个.data段和一个. xml段,与程序本身完全相同。当动态加载器加载它时,它从它所来自的文件中复制.text段和.data(初始化数据),但. data(未初始化数据)直接来自一个零填充段,该段在存储库的文件中没有表示。
由于这个原因,具有较大的未初始化全局数据段(具有较大的. xml段)的库在加载时可能比它从中加载的原始文件更大。
这也使得程序的大小通常大于它存储的文件。你没意识到吗?:)

相关问题