根据头信息计算ELF文件的大小

Computing the size of an ELF file based on the header information

我知道可以根据 information found in the header(即 e_shoff + (e_shentsize * e_shnum))计算 ELF 文件的大小(即它结束的位置),假设有节头table("SHT"),SHT是ELF的最后一部分。

但是,加载二进制文件不需要 SHT,我想知道如果缺少 SHT(例如,剥离的二进制文件)是否可以计算相同的信息。我们可以利用程序头或其他偏移量以编程方式计算大小吗?

Can we leverage the program header or other offsets?

启动二进制文件 运行 所需的信息包含在程序头中(使用 readelf -Wl a.out 查看那里有什么)。

您可以通过找到 phdr->p_offset + phdr->p_filesz 的最大值来计算 最小 所需的二进制文件大小。如果您以该大小截断文件,它应该可以继续工作(或至少加载并达到 main)。

但是该文件可能包含任意数量的额外不可加载部分,因此如果您计算的大小小于磁盘上的文件大小,请不要感到惊讶。

是否需要这些额外的部分完全取决于可执行文件——它可能具有 opens argv[0]seeks 到某个偏移量的代码,并且 reads 来自那里的数据(在这种情况下,应用程序将在截断后停止工作)。

P.S.

assuming that ...the SHT is the last part of the ELF.

该假设不一定正确,当然也不需要文件成为正确的 ELF 文件。