#include <stdint.h>
+typedef uint16_t Elf32_Half;
typedef uint32_t Elf32_Addr;
+typedef uint32_t Elf32_Off;
typedef uint32_t Elf32_Word;
+typedef uint32_t Elf32_Xword; // < not strictly correct... but meh
typedef int32_t Elf32_Sword;
#define ELFCLASS32 1
*/
struct sElf32_Ehdr {
uint8_t e_ident[16]; //!< Identifier Bytes
- uint16_t filetype; //!< File Type
- Uint16 machine; //!< Machine / Arch
- Uint32 version; //!< Version (File?)
- Uint32 entrypoint; //!< Entry Point
- Uint32 phoff; //!< Program Header Offset
- Uint32 shoff; //!< Section Header Offset
- Uint32 flags; //!< Flags
- Uint16 headersize; //!< Header Size
- Uint16 phentsize; //!< Program Header Entry Size
- Uint16 phentcount; //!< Program Header Entry Count
- Uint16 shentsize; //!< Section Header Entry Size
- Uint16 shentcount; //!< Section Header Entry Count
- Uint16 shstrindex; //!< Section Header String Table Index
+ Elf32_Half e_filetype; //!< File Type
+ Elf32_Half e_machine; //!< Machine / Arch
+ Elf32_Word e_version; //!< Version (File?)
+ Elf32_Addr e_entry; //!< Entry Point
+ Elf32_Off e_phoff; //!< Program Header Offset
+ Elf32_Word e_shoff; //!< Section Header Offset
+ Elf32_Word e_flags; //!< Flags
+ Elf32_Half e_headersize; //!< Header Size
+ Elf32_Half e_phentsize; //!< Program Header Entry Size
+ Elf32_Half e_phnum; //!< Program Header Entry Count
+ Elf32_Half e_shentsize; //!< Section Header Entry Size
+ Elf32_Half e_shentcount; //!< Section Header Entry Count
+ Elf32_Half e_shstrindex; //!< Section Header String Table Index
};
/**
SHT_HIUSER = 0xffffffff
};
+#if 0
#define SHF_WRITE 0x1
#define SHF_ALLOC 0x2
#define SHF_EXECINSTR 0x4
Uint32 addralign;
Uint32 entsize;
}; //sizeof = 40
+#endif
struct elf_sym_s {
- Uint32 nameOfs;
- Uint32 value; //Address
- Uint32 size;
- Uint8 info;
- Uint8 other;
- Uint16 shndx;
+ Elf32_Word st_name;
+ Elf32_Addr st_value; //Address
+ Elf32_Word st_size;
+ uint8_t st_info;
+ uint8_t st_other;
+ Elf32_Half st_shndx;
};
#define STN_UNDEF 0 // Undefined Symbol
+#define ELF32_ST_BIND(i) ((i)>>4)
+#define ELF32_ST_TYPE(i) ((i)&0xF)
+
+enum {
+ STB_LOCAL,
+ STB_GLOBAL,
+ STB_WEAK,
+};
+
enum {
PT_NULL, //0
PT_LOAD, //1
PT_HIPROC = 0x7fffffff
};
+#define PF_X 1
+#define PF_W 2
+#define PF_R 4
+
struct sElf32_Phdr {
- Uint32 Type;
- Uint32 Offset;
- Elf32_Addr VAddr;
- Elf32_Addr PAddr;
- Uint32 FileSize;
- Uint32 MemSize;
- Uint32 Flags;
- Uint32 Align;
+ Elf32_Word p_type;
+ Elf32_Off p_offset;
+ Elf32_Addr p_vaddr;
+ Elf32_Addr p_paddr;
+ Elf32_Word p_filesz;
+ Elf32_Word p_memsz;
+ Elf32_Word p_flags;
+ Elf32_Word p_align;
};
struct elf32_rel_s {
- Uint32 r_offset;
- Uint32 r_info;
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
};
struct elf32_rela_s {
- Uint32 r_offset;
- Uint32 r_info;
+ Elf32_Addr r_offset;
+ Elf32_Word r_info;
Elf32_Sword r_addend;
};
// 'T' means the thumb bit
// 'B(S)' Origin of a symbol
enum {
- R_ARM_NONE, // No action
- R_ARM_PC24, // ((S + A) | T) - P
- R_ARM_ABS32, // (S + A) | T
- R_ARM_REL32, // ((S + A) | T) - P
- R_ARM_LDR_PC_G0, // S + A - P
- R_ARM_ABS16, // S + A
- R_ARM_ABS12, // S + A
- R_ARM_THM_ABS5, // S + A
- R_ARM_ABS8, // S + A
- R_ARM_SBREL32, // ((S + A) | T) - B(S)
- R_ARM_THM_CALL, // ((S + A) | T) - P
- R_ARM_THM_PC8, // S + A - Pa,
- R_ARM_BREL_ADJ, // ΔB(S) + A
- R_ARM_TLS_DESC, // --
- R_ARM_THM_SWI8, // (Reserved)
- R_ARM_XPC25, // (Reserved)
- R_ARM_THM_XPC22, // (Reserved)
- R_ARM_TLS_DTPMOD32, // Module[S]
- R_ARM_TLS_DTPOFF32, // S + A - TLS
- R_ARM_TLS_TPOFF32, // S + A - tp
- R_ARM_COPY, // Misc
- R_ARM_GLOB_DAT, // (S + A) | T
- R_ARM_JUMP_SLOT, // (S + A) | T
- R_ARM_RELATIVE, // B(S) + A (extra?)
+ R_ARM_NONE, // 0 No action
+ R_ARM_PC24, // 1 ((S + A) | T) - P
+ R_ARM_ABS32, // 2 (S + A) | T
+ R_ARM_REL32, // 3 ((S + A) | T) - P
+ R_ARM_LDR_PC_G0, // 4 S + A - P
+ R_ARM_ABS16, // 5 S + A
+ R_ARM_ABS12, // 6 S + A
+ R_ARM_THM_ABS5, // 7 S + A
+ R_ARM_ABS8, // 8 S + A
+ R_ARM_SBREL32, // 9 ((S + A) | T) - B(S)
+ R_ARM_THM_CALL, // 10 ((S + A) | T) - P
+ R_ARM_THM_PC8, // 11 S + A - Pa,
+ R_ARM_BREL_ADJ, // 12 ΔB(S) + A
+ R_ARM_TLS_DESC, // 13 --
+ R_ARM_THM_SWI8, // 14 (Reserved)
+ R_ARM_XPC25, // 15 (Reserved)
+ R_ARM_THM_XPC22, // 16 (Reserved)
+ R_ARM_TLS_DTPMOD32, // 17 Module[S]
+ R_ARM_TLS_DTPOFF32, // 18 S + A - TLS
+ R_ARM_TLS_TPOFF32, // 19 S + A - tp
+ R_ARM_COPY, // 20 Misc
+ R_ARM_GLOB_DAT, // 21 (S + A) | T
+ R_ARM_JUMP_SLOT, // 22 (S + A) | T
+ R_ARM_RELATIVE, // 23 B(S) + A (extra?)
// ... More defined (IHI0044)
};
#define ELF32_R_INFO(s,t) (((s)<<8)+((t)&0xFF)) // Takes a type and symbol index and returns an info value
struct elf32_dyn_s {
- Uint16 d_tag;
- Uint32 d_val; //Also d_ptr
+ Elf32_Half d_tag;
+ Elf32_Word d_val; //Also d_ptr
};
enum {