如何计算预期的核心文件大小

How to calculate expected core file size

本文关键字:核心 文件大小 何计算 计算      更新时间:2023-10-16

如何计算核心转储的预期大小?

我有一个来自 arm64 目标的截断核心文件(核心转储)。我可以从gdb-multiarch的输出中找到核心文件(核心转储)的预期大小。

BFD: warning: /home/.../core-m is truncated: expected core file size >= 748728320, found: 518127616

从上面,我可以找到核心转储的预期大小是748728320,其实际大小是518127616。

现在,我想知道gdb-multiarch如何计算核心转储的预期大小。

我可以使用readelf -e找到每个部分的大小,我认为每个部分的大小总和将与核心文件的预期大小相同。所以我得到了总和,但它不等于核心转储的预期大小。

the sum: 748680864
expected size by `gdb-multiarch`: 748728320

我怎样才能正确计算呢?

更新

我只需要知道我可以从readelf -e的输出中找到核心转储的预期大小。readelf -e显示每个段的偏移量和大小。我从截断的核心转储中得到了结果。

Program Headers:
Type           Offset             VirtAddr           PhysAddr
FileSiz            MemSiz              Flags  Align
NOTE           0x000000000000b2f8 0x0000000000000000 0x0000000000000000
0x000000000002b6a0 0x0000000000000000         0x0
LOAD           0x0000000000037000 0x000000556af44000 0x0000000000000000
0x0000000000001000 0x00000000008cc000  R E    0x1000
...
LOAD           0x000000002c831000 0x0000007fca9c5000 0x0000000000000000
0x00000000001da000 0x00000000001da000  RW     0x1000

从上面,我可以找到最后一个段的偏移量和大小。偏移量0x2c831000,如果偏移量0x1da000,则大小。预期的转储大小将为 0x2c831000 + 0x1da000 = 0x2CA0B000(748728320)。这与gdb-multiarch中的一个相同。

仅当readelf可用时,才能使用此方法。而且我仍然无法解释如何计算转储的预期大小。我希望有人给我解释。

我使用以下脚本,似乎工作得很好。 正如注释所解释的,我们只是找到文件中最大的 LOAD 部分末端偏移量。 (请注意,它考虑了稀疏文件。

如果我没记错的话,我从GDB的核心文件加载代码(或一些警告核心文件截断的类似标准工具)中提升了该技术。

#!/bin/bash
trap 'exit 1' ERR  # Abort script on error.
if [[ $# != 1 ]] ; then
echo "$( basename $0 ) <coreFile>"
exit 1
fi
coreFile=$1
# Examine all LOAD sections in the corefile, calculate the file offset of each section's end,
# and find the largest offset.
expectedSize=$( readelf -l ${coreFile} | grep -A 1 LOAD |
while read type offset etc && read fsize etc ; do
echo $(( $offset + $fsize ))
done | sort -n | tail -n 1 )
actualSize=$( du --block-size=1 --apparent-size ${coreFile} | cut -f1 )
physicalSize=$( du --block-size=1 ${coreFile} | cut -f1 )
if [[ ${actualSize} < ${expectedSize} ]] ; then
echo "Physical size ${physicalSize}"
echo "Expected logical size ${expectedSize}"
echo "Actual logical size ${actualSize}"
exit 2
fi