gpt4 book ai didi

linux - 从 header 计算 linux 核心文件大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:47:41 28 4
gpt4 key购买 nike

我正在尝试编写 C 代码来计算基于 ELF header 的 Linux 核心转储文件大小。这是必需的,因为我将它通过管道传输到 STDIN 并需要传递它,首先指定它的大小,而不是实际将它写入文件。将整个文件读入内存也不是一种选择。

首先,我正在查看核心转储 header :

ELF Header:
Magic: 7f 45 4c 46 02 02 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, big endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: CORE (Core file)
Machine: MIPS R3000
Version: 0x1
Entry point address: 0x0
Start of program headers: 64 (bytes into file)
Start of section headers: 0 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 257
Size of section headers: 0 (bytes)
Number of section headers: 0
Section header string table index: 0

There are no sections in this file.

There are no sections to group in this file.

接下来,我将循环读取程序 header 并计算所有 FileSiz 字段的总和。我的假设是 (ELF header size) + (Program header size)*(Number of program headers) + (Sum of all segment sizes) 将给我整体文件大小。然而,这种情况并非如此。在我的例子中,我得到了大小为 729088000 字节的实际文件,而上面的数学给出了 729054616 字节。我错过了什么?

最佳答案

设法解决问题。总文件大小可以通过获取具有最大偏移量的程序头并向其添加文件大小来计算,因为核心文件仅由头和段组成。

例如如果你阅读了 readelf 的程序头,并查看了最后的条目:

  LOAD           0x00000000287d0000 0x000000557d5c0000 0x0000000000000000
0x0000000002730000 0x0000000002730000 RW 10000
LOAD 0x000000002af00000 0x000000557fcf0000 0x0000000000000000
0x0000000000010000 0x0000000000010000 10000
LOAD 0x000000002af10000 0x000000557fd00000 0x0000000000000000
0x00000000007f0000 0x00000000007f0000 RWE 10000
LOAD 0x000000002b710000 0x000000ffffe70000 0x0000000000000000
0x0000000000040000 0x0000000000040000 RW 10000

然后文件大小或核心转储实际上将是 0x2b710000 + 0x40000

关于linux - 从 header 计算 linux 核心文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35253286/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com