elf.h结构体是否为紧凑打包?若否,有无可移植紧凑化方法?
ELF结构体对齐与可移植性问题
文件格式定义的所有数据结构遵循对应类别的「自然」大小与对齐规则。必要时,数据结构会包含显式填充以确保4字节对象按4字节对齐、强制结构体大小为4的倍数等。
但由于对齐方式由具体实现定义,因此假设结构体始终是紧凑打包的绝非良好实践。比如下面这段伪代码,在部分系统或编译器环境下可能会失效:
unsigned char e_ident[EI_NIDENT]; // 假设 sizeof(unsigned char) == sizeof(uint8_t) Elf32_Ehdr *ehdr; // 先读取 e_ident fread(e_ident, EI_NIDENT, 1, file_ptr); // 现在读取 ELF 头部 if(e_ident[EI_CLASS] == ELFCLASS32){ ehdr = malloc(sizeof(Elf32_Ehdr)); memcpy(ehdr->e_ident, e_ident, EI_NIDENT); fread(&(ehdr->e_type), sizeof(uint8_t), sizeof(Elf32_Ehdr) - (size_t)EI_NIDENT, file_ptr); }
如果上述做法不可行,有没有可移植的方法确保 elf.h 中的结构体是紧凑打包的?注:我使用的是 musl libc 中的 elf.h。
内容的提问来源于stack exchange,提问作者I.F.F. dos Santos
相关产品推荐
相关产品推荐

