我试图编写将根据它的ELF标头计算Linux核心转储文件大小的C代码。这是必需的,因为我将它传送到STDIN并需要传递它,首先指定它的大小,而不是实际将其写入文件。将整个文件读入内存也不是一种选择。
首先,我正在研究核心转储标题:
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.
接下来,我在循环中读取程序头并获取所有FileSiz字段的总和。 我的假设是(ELF头大小)+(程序头大小)*(程序头数)+(所有段大小的总和)将给我整体文件大小。然而,这种情况并非如此。在我的情况下,我得到大小为729088000字节的实际文件,而上面的数学给了我729054616字节。我错过了什么?
答案 0 :(得分:1)
管理解决问题。可以通过使用具有最大偏移量的程序头并向其添加文件大小来计算总文件大小,因为核心文件仅包含头部和段。
E.g。如果您通过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
答案 1 :(得分:0)
我正在尝试编写将根据其ELF标头计算Linux核心转储文件大小的C代码。
这是不可能的,因为
ELF
标头,每个共享库都会对最终的core
文件大小做出贡献,并且ELF
标题所有中描述,并且可以是10,比可执行文件中的任何.data
大100或1000倍。但是, 可以确定核心大小,如果您已设法停止可执行文件并且可以访问其{{1} }:google userspace coredumper正是这样做的。