1 /*---------------------------------------------------------------------------*
2   Project:  TwlSDK - bin2obj
3   File:     elf.h
4 
5   Copyright 2005-2008 Nintendo. All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law. They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Date:: 2008-09-18#$
14   $Rev: 8573 $
15   $Author: okubata_ryoma $
16  *---------------------------------------------------------------------------*/
17 #ifndef	ELF_H__
18 #define	ELF_H__
19 
20 //
21 // ELF HEADER
22 //
23 #define	EI_NIDENT	16
24 
25 typedef struct
26 {
27     u8      e_ident[EI_NIDENT];
28     u16     e_type;
29     u16     e_machine;
30     u32     e_version;
31     u32     e_entry;
32     u32     e_phoff;                   // Offset to ProgramHeader table
33     u32     e_shoff;                   // Offset to SectionHeader table
34     u32     e_flags;
35     u16     e_ehsize;                  // Size of ElfHeader
36     u16     e_phentsize;               // ProgramHeader table size
37     u16     e_phnum;                   // Number of ProgramHeaders
38     u16     e_shentsize;               // SectionHeader table size
39     u16     e_shnum;                   // Number of SectionHeaders
40     u16     e_shstrndx;                // Index number for Section name table
41 }
42 ELF32_ElfHeader;
43 
44 // e_ident
45 #define	ELFMAG0			0x7f
46 #define	ELFMAG1			'E'
47 #define	ELFMAG2			'L'
48 #define	ELFMAG3			'F'
49 #define ELFCLASS32		1
50 
51 #define ELFDATA2UNDEF		0
52 #define ELFDATA2LSB		1      // Little-endian
53 #define ELFDATA2MSB		2      // Big-endian
54 
55 // e_type
56 #define	ET_REL			1
57 // e_machine
58 #define	EM_PPC			20     // PowerPC
59 #define	EM_ARM			40     // ARM
60 // e_version
61 #define	EV_CURRENT		1
62 
63 //
64 // SECTION HEADER
65 //
66 typedef struct
67 {
68     u32     sh_name;                   // Section name table starting index
69     u32     sh_type;                   // Section type  SHT_*
70     u32     sh_flags;
71     u32     sh_addr;
72     u32     sh_offset;
73     u32     sh_size;
74     u32     sh_link;
75     u32     sh_info;
76     u32     sh_addralign;
77     u32     sh_entsize;
78 }
79 ELF32_SectionHeader;
80 
81 // sh_type
82 #define	SHT_NULL		0
83 #define	SHT_PROGBITS		1
84 #define	SHT_SYMTAB		2
85 #define	SHT_STRTAB		3
86 
87 #define	SHF_NULL		0x0
88 #define	SHF_WRITE		0x1
89 #define	SHF_ALLOC		0x2
90 
91 //
92 // SYMBOL TABLE
93 //
94 typedef struct
95 {
96     u32     st_name;                   // Symbol name starting index
97     u32     st_value;                  // Symbol value (lvalue)
98     u32     st_size;                   // Size of Symbol itself (object size, etc)
99     u8      st_info;                   // Concatenate STB_* and STT_*
100     u8      st_other;                  // Currently fixed at 0
101     u16     st_shndx;
102 }
103 ELF32_Symbol;
104 
105 #define	ELF32_ST_BIND(i)	((i)>>4)
106 #define	ELF32_ST_TYPE(i)	((i)&0xf)
107 #define	ELF32_ST_INFO(b,t)	(((b)<<4)+((t)&0xf))
108 
109 #define	STB_LOCAL		0
110 #define	STB_GLOBAL		1
111 #define	STB_WEAK		2
112 #define	STB_WEAK_CW		14     // For CodeWarrior
113 
114 #define	STT_NOTYPE		0
115 #define	STT_OBJECT		1
116 #define	STT_FUNC		2
117 #define	STT_SECTION		3
118 #define	STT_FILE		4
119 
120 // ARCHIVE Format
121 #define ARMAG_STRING		"!<arch>\n"
122 #define ARMAG_SIZE		(sizeof(ARMAG_STRING)-1)
123 #define ARFMAG_STRING		"`\n"
124 #define ARFMAG_SIZE		(sizeof(ARFMAG_STRING)-1)
125 
126 #define AR_NAME_SIZE		16
127 #define AR_DATE_SIZE		12
128 #define AR_UID_SIZE		6
129 #define AR_GID_SIZE		6
130 #define AR_MODE_SIZE		8
131 #define AR_SIZE_SIZE		10
132 #define AR_FMAG_SIZE		2
133 
134 typedef struct
135 {
136     char    ar_name[AR_NAME_SIZE];
137     char    ar_date[AR_DATE_SIZE];
138     char    ar_uid[AR_UID_SIZE];
139     char    ar_gid[AR_GID_SIZE];
140     char    ar_mode[AR_MODE_SIZE];
141     char    ar_size[AR_SIZE_SIZE];
142     char    ar_fmag[AR_FMAG_SIZE];
143 }
144 ARCHIVE_MemberHeader;
145 
146 #endif //ELF_H__
147