根据头信息计算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
)。
但是该文件可能包含任意数量的额外不可加载部分,因此如果您计算的大小小于磁盘上的文件大小,请不要感到惊讶。
是否需要这些额外的部分完全取决于可执行文件——它可能具有 open
s argv[0]
、seek
s 到某个偏移量的代码,并且 read
s 来自那里的数据(在这种情况下,应用程序将在截断后停止工作)。
P.S.
assuming that ...the SHT is the last part of the ELF.
该假设不一定正确,当然也不需要文件成为正确的 ELF
文件。
我知道可以根据 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
)。
但是该文件可能包含任意数量的额外不可加载部分,因此如果您计算的大小小于磁盘上的文件大小,请不要感到惊讶。
是否需要这些额外的部分完全取决于可执行文件——它可能具有 open
s argv[0]
、seek
s 到某个偏移量的代码,并且 read
s 来自那里的数据(在这种情况下,应用程序将在截断后停止工作)。
P.S.
assuming that ...the SHT is the last part of the ELF.
该假设不一定正确,当然也不需要文件成为正确的 ELF
文件。