我是使用arm-none-eabi-readelf -h测试。o分析一个目标文件,它给予我
此标头的大小:52(字节)入口点地址:0x 0我去了arm-none-eabi-readelf的源代码,但是我不能弄清楚日期类型有多大,long,int,short。有些答案说有limit.h可以找到一些定义,最后我分析了long是4 B,int 4 B短2B(个人意见)
/* ELF Header */
#define EI_NIDENT 16 /* Size of e_ident[] */
typedef struct elf_internal_ehdr {
unsigned char e_ident[EI_NIDENT]; /* ELF "magic number" */ //16B
bfd_vma e_entry;/* Entry point virtual address */ //unsigned long but 4B
bfd_size_type e_phoff;/* Program header table file offset */ //unsigned long but4B
bfd_size_type e_shoff;/* Section header table file offset */ //unsigned long but4B
unsigned long e_version;/* Identifies object file version */ //unsigned long but4B
unsigned long e_flags;/* Processor-specific flags */ //unsigned long but4B
unsigned short e_type; /* Identifies object file type */ //2B
unsigned short e_machine; /* Specifies required architecture */ //2B
unsigned int e_ehsize; /* ELF header size in bytes */ // 4B
unsigned int e_phentsize; /* Program header table entry size */ // 4B
unsigned int e_phnum; /* Program header table entry count */ // 4B
unsigned int e_shentsize; /* Section header table entry size */ // 4B
unsigned int e_shnum; /* Section header table entry count */ // 4B
unsigned int e_shstrndx; /* Section header string table index */ // 4B
} Elf_Internal_Ehdr;
但total不适合此标题的大小:52(字节)
除了sizeof()(交叉编译器我不知道如何使用它来打印sizof()结果)之外,有没有什么方法可以计算出基本的数据类型有多少字节?
2条答案
按热度按时间5kgi1eie1#
你问错问题了。你问的是在一些未指定的环境中
unsigned long
的大小。但你实际上想知道ELF文件中字段的大小。维基百科上有这些信息。例如,the relevant Wikipedia page表示
e_version
需要32位宽。因此您应该使用uint32_t
来表示e_version
。如果你打算把
memcpy
从一个ELF文件中插入到这个结构中,不要忘记告诉你的编译器不要对这个结构使用任何填充。atmip9wb2#
Linux man page回答了您的问题。
它将类型定义为:
如果您的目标系统是64位,则
ElfN_Addr
和ElfN_Off
是uint64_t
,如果您的目标系统是32位,则uint32_t
是uint32_t
。elf头定义为:
使用标准的
elf.h
头文件(例如https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h)