如何找到带有标题信息的 ELF 文件/图像的大小?
我需要找到精灵图像的大小进行一些计算。我尝试过在 Linux 上使用 readelf 实用程序,它提供了有关标题和部分的信息。我需要知道精灵的确切文件大小(总体而言)。
如何从标题信息中找到 ELF 的大小,或者是否有其他方法可以在不读取完整图像的情况下找到 elf 的大小。
I need to find the size of an elf image for some computation. I have tried with the readelf utility on linux which gives the informations about the headers and section. I need to have the exact file size of the elf(on the whole).
How do I find the size of the ELF from the header information or Is there any other means to find the size of an elf without reading the full image.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
您可以使用
stat
函数系列 (stat()
,lstat()
,fstat()
)来获取任何文件的大小(使用stat
成员的st_size
成员)。您需要更具体的东西吗?
如果您确实想使用 ELF 结构,请使用包含该结构的 elf.h 标头:
它是 ELF32 文件的标头(对于 64 位文件,将 32 替换为 64)。
e_ehsize
是文件的大小(以字节为单位)。我将逐字复制作为编辑建议发布的评论:
You can use the
stat
functions family (stat()
,lstat()
,fstat()
) to get the size of any file (using thest_size
member of thestat
member).Do you need something more specific?
If you really want to use the ELF structure, use the elf.h header which contains that structure:
It's the header of an ELF32 file (replace 32 with 64 for a 64-bit file).
e_ehsize
is the size of the file in bytes.I'll copy verbatim the comment that was posted as an edit suggestion:
对于 ELF 文件来说,具体问题的答案有点棘手。
下面将使用标头计算 ELF 文件中“描述性”信息的大小: e_ehsize + (e_phnum * e_phentsize) + (e_shnum * e_shentsize)
以上基于 ELF 文档。
添加到上述总和中的下一个部分是文件中节条目的大小。直观上,我们希望使用文件中每个部分的 sh_size 来计算 - 其中的 e_shnum 。然而,由于对齐问题,这不会产生正确的答案。如果您使用 sh_offset 值的有序列表,您可以计算节条目占用的确切字节数(我发现一些奇怪的对齐方式,其中使用 sh_addralign 并不像您希望的那样有用);对于最后一个节条目,请使用文件头的 e_shoff,因为节头表位于最后。这对我检查过的夫妇有效。
libelf 中的 update.c 包含更新 elf 文件时使用的详细信息。
The answer to the specific question is a little tricky for ELF files.
The following will compute the size of the "descriptive" information in an ELF file using the header: e_ehsize + (e_phnum * e_phentsize) + (e_shnum * e_shentsize)
The above is based on the ELF documentation.
The next piece to add to the above sum is the size in the file of the section entries. Intuitively we would like to compute this using sh_size for each of the sections in the file -- e_shnum of them. HOWEVER, this doesn't yield the correct answer due to alignment issues. If you use an ordered list of sh_offset values you can compute the exact number of bytes that the section entry occupies (I found some strange alignments where using sh_addralign isn't as useful as you would like); for the last section entry use the file header's e_shoff since the section header table is last. This worked for the couple I checked.
update.c in libelf has the details it uses when updating an elf file.
示例:
假设节头表(SHT)是 ELF 的最后一部分。通常是这种情况,但最后一部分也可能是 ELF 的最后一部分。应该检查这一点,但本例中没有检查。
这是一个 C 语言的工作实现,使用
gcc elfsize.c -o elfsize
进行编译:Example:
This assumes that the section header table (SHT) is the last part of the ELF. This is usually the case but it could also be that the last section is the last part of the ELF. This should be checked for, but is not in this example.
Here is a working implementation in C, compile with
gcc elfsize.c -o elfsize
:也许 gelf 可能有用。
具体来说这些功能:
Perhaps gelf could be useful.
specifically these functions:
您是否尝试过使用 gnu“readelf”实用程序?
http://sourceware.org/binutils/docs/binutils/readelf.html
Have you tried using the gnu "readelf" utility?
http://sourceware.org/binutils/docs/binutils/readelf.html
您所要做的就是将最后一个部分的文件偏移量及其大小相加。
elfHeader 使用的值:
sectionHeader 使用的值:
All you have to do is to sum the last section's file offset and its size.
elfHeader used values:
sectionHeader used values: