C语言 我怎么知道编译器基本数据类型有多大?

r8xiu3jd  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(409)

我是使用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()结果)之外,有没有什么方法可以计算出基本的数据类型有多少字节?

5kgi1eie

5kgi1eie1#

你问错问题了。你问的是在一些未指定的环境中unsigned long的大小。但你实际上想知道ELF文件中字段的大小。维基百科上有这些信息。
例如,the relevant Wikipedia page表示e_version需要32位宽。因此您应该使用uint32_t来表示e_version
如果你打算把memcpy从一个ELF文件中插入到这个结构中,不要忘记告诉你的编译器不要对这个结构使用任何填充。

atmip9wb

atmip9wb2#

Linux man page回答了您的问题。
它将类型定义为:

ElfN_Addr       Unsigned program address, uintN_t
           ElfN_Off        Unsigned file offset, uintN_t
           ElfN_Section    Unsigned section index, uint16_t
           ElfN_Versym     Unsigned version symbol information, uint16_t
           Elf_Byte        unsigned char
           ElfN_Half       uint16_t
           ElfN_Sword      int32_t
           ElfN_Word       uint32_t
           ElfN_Sxword     int64_t
           ElfN_Xword      uint64_t

如果您的目标系统是64位,则ElfN_AddrElfN_Offuint64_t,如果您的目标系统是32位,则uint32_tuint32_t
elf头定义为:

#define EI_NIDENT 16

           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;
           } ElfN_Ehdr;

使用标准的elf.h头文件(例如https://github.com/torvalds/linux/blob/master/include/uapi/linux/elf.h

相关问题