如何找到带有标题信息的 ELF 文件/图像的大小?

fas*_*sil 5 linux filesize elf

我需要找到精灵图像的大小进行一些计算。我已经尝试在 linux 上使用 readelf 实用程序,它提供有关标题和部分的信息。我需要拥有精灵的确切文件大小(总体上)。

我如何从头信息中找到ELF的大小或者有没有其他方法可以在不阅读完整图像的情况下找到一个精灵的大小。

jmc*_*r9t 6

对于 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 文件时使用的详细信息。


Bas*_*ard -3

您可以使用stat函数系列 ( stat(), lstat(), fstat()) 来获取任何文件的大小(使用成员st_size的成员stat)。您需要更具体的东西吗?


如果您确实想使用 ELF 结构,请使用包含该结构的 elf.h 标头:

typedef struct {
         unsigned char  e_ident[EI_NIDENT];
         uint16_t       e_type;
         uint16_t       e_machine;
         uint32_t       e_version;
         ElfN_Addr      e_entry;
         ElfN_Off       e_phoff;
         ElfN_Off       e_shoff;
         uint32_t       e_flags;
         uint16_t       e_ehsize;
         uint16_t       e_phentsize;
         uint16_t       e_phnum;
         uint16_t       e_shentsize;
         uint16_t       e_shnum;
         uint16_t       e_shstrndx;
 } Elf32_Ehdr;
Run Code Online (Sandbox Code Playgroud)

它是 ELF32 文件的标头(对于 64 位文件,将 32 替换为 64)。 e_ehsize是文件的大小(以字节为单位)。


我将逐字复制作为编辑建议发布的评论:

这个答案是不正确的。e_ehsize 只是 elf 标头的大小,而不是 elf 文件的大小。