168349Sobrien
268349Sobrien#------------------------------------------------------------------------------
3234449Sobrien# $File: elf,v 1.54 2011/12/17 17:16:29 christos Exp $
468349Sobrien# elf:  file(1) magic for ELF executables
568349Sobrien#
668349Sobrien# We have to check the byte order flag to see what byte order all the
768349Sobrien# other stuff in the header is in.
868349Sobrien#
968349Sobrien# What're the correct byte orders for the nCUBE and the Fujitsu VPP500?
1068349Sobrien#
11186691Sobrien# Created by: unknown
12186691Sobrien# Modified by (1): Daniel Quinlan <quinlan@yggdrasil.com>
13186691Sobrien# Modified by (2): Peter Tobias <tobias@server.et-inf.fho-emden.de> (core support)
14186691Sobrien# Modified by (3): Christian 'Dr. Disk' Hechelmann <drdisk@ds9.au.s.shuttle.de> (fix of core support)
15186691Sobrien# Modified by (4): <gerardo.cacciari@gmail.com> (VMS Itanium)
16186691Sobrien# Modified by (5): Matthias Urlichs <smurf@debian.org> (Listing of many architectures)
1768349Sobrien0	string		\177ELF		ELF
1868349Sobrien>4	byte		0		invalid class
1968349Sobrien>4	byte		1		32-bit
2068349Sobrien>4	byte		2		64-bit
2168349Sobrien>5	byte		0		invalid byte order
2268349Sobrien>5	byte		1		LSB
23159764Sobrien>>16	leshort		0		no file type,
24186691Sobrien!:strength *2
25186691Sobrien!:mime	application/octet-stream
26159764Sobrien>>16	leshort		1		relocatable,
27186691Sobrien!:mime	application/x-object
28159764Sobrien>>16	leshort		2		executable,
29186691Sobrien!:mime	application/x-executable
30159764Sobrien>>16	leshort		3		shared object,
31186691Sobrien!:mime	application/x-sharedlib
32159764Sobrien>>16	leshort		4		core file
33186691Sobrien!:mime	application/x-coredump
34159764Sobrien# Core file detection is not reliable.
35159764Sobrien#>>>(0x38+0xcc) string	>\0		of '%s'
36159764Sobrien#>>>(0x38+0x10) lelong	>0		(signal %d),
37159764Sobrien>>16	leshort		&0xff00		processor-specific,
38159764Sobrien>>18	leshort		0		no machine,
39159764Sobrien>>18	leshort		1		AT&T WE32100 - invalid byte order,
40159764Sobrien>>18	leshort		2		SPARC - invalid byte order,
41159764Sobrien>>18	leshort		3		Intel 80386,
42159764Sobrien>>18	leshort		4		Motorola
43159764Sobrien>>>36	lelong		&0x01000000	68000 - invalid byte order,
44159764Sobrien>>>36	lelong		&0x00810000	CPU32 - invalid byte order,
45159764Sobrien>>>36	lelong		0		68020 - invalid byte order,
46159764Sobrien>>18	leshort		5		Motorola 88000 - invalid byte order,
47159764Sobrien>>18	leshort		6		Intel 80486,
48159764Sobrien>>18	leshort		7		Intel 80860,
49103373Sobrien# The official e_machine number for MIPS is now #8, regardless of endianness.
50103373Sobrien# The second number (#10) will be deprecated later. For now, we still
51103373Sobrien# say something if #10 is encountered, but only gory details for #8.
52159764Sobrien>>18	leshort		8		MIPS,
53159764Sobrien>>>36	lelong		&0x20		N32
54159764Sobrien>>18	leshort		10		MIPS,
55159764Sobrien>>>36	lelong		&0x20		N32
56159764Sobrien>>18	leshort		8
5769216Sobrien# only for 32-bit
5869216Sobrien>>>4	byte		1
59103373Sobrien>>>>36  lelong&0xf0000000	0x00000000	MIPS-I
60103373Sobrien>>>>36  lelong&0xf0000000	0x10000000	MIPS-II
61103373Sobrien>>>>36  lelong&0xf0000000	0x20000000	MIPS-III
62103373Sobrien>>>>36  lelong&0xf0000000	0x30000000	MIPS-IV
63103373Sobrien>>>>36  lelong&0xf0000000	0x40000000	MIPS-V
64175296Sobrien>>>>36  lelong&0xf0000000	0x50000000	MIPS32
65175296Sobrien>>>>36  lelong&0xf0000000	0x60000000	MIPS64
66175296Sobrien>>>>36  lelong&0xf0000000	0x70000000	MIPS32 rel2
67175296Sobrien>>>>36  lelong&0xf0000000	0x80000000	MIPS64 rel2
6869216Sobrien# only for 64-bit
6969216Sobrien>>>4	byte		2
70103373Sobrien>>>>48  lelong&0xf0000000	0x00000000	MIPS-I
71103373Sobrien>>>>48  lelong&0xf0000000	0x10000000	MIPS-II
72103373Sobrien>>>>48  lelong&0xf0000000	0x20000000	MIPS-III
73103373Sobrien>>>>48  lelong&0xf0000000	0x30000000	MIPS-IV
74103373Sobrien>>>>48  lelong&0xf0000000	0x40000000	MIPS-V
75175296Sobrien>>>>48  lelong&0xf0000000	0x50000000	MIPS32
76175296Sobrien>>>>48  lelong&0xf0000000	0x60000000	MIPS64
77175296Sobrien>>>>48  lelong&0xf0000000	0x70000000	MIPS32 rel2
78175296Sobrien>>>>48  lelong&0xf0000000	0x80000000	MIPS64 rel2
7968349Sobrien>>18	leshort		9		Amdahl - invalid byte order,
80103373Sobrien>>18	leshort		10		MIPS (deprecated),
8168349Sobrien>>18	leshort		11		RS6000 - invalid byte order,
8268349Sobrien>>18	leshort		15		PA-RISC - invalid byte order,
8374784Sobrien>>>50	leshort		0x0214		2.0
8474784Sobrien>>>48	leshort		&0x0008		(LP64),
8568349Sobrien>>18	leshort		16		nCUBE,
8668349Sobrien>>18	leshort		17		Fujitsu VPP500,
87186691Sobrien>>18	leshort		18		SPARC32PLUS - invalid byte order,
8868349Sobrien>>18	leshort		20		PowerPC,
89133359Sobrien>>18	leshort		22		IBM S/390,
9068349Sobrien>>18	leshort		36		NEC V800,
9168349Sobrien>>18	leshort		37		Fujitsu FR20,
9268349Sobrien>>18	leshort		38		TRW RH-32,
9368349Sobrien>>18	leshort		39		Motorola RCE,
9475937Sobrien>>18	leshort		40		ARM,
9568349Sobrien>>18	leshort		41		Alpha,
96133359Sobrien>>18	leshort		0xa390		IBM S/390 (obsolete),
97169942Sobrien>>18	leshort		42		Renesas SH,
9868349Sobrien>>18	leshort		43		SPARC V9 - invalid byte order,
9968349Sobrien>>18	leshort		44		Siemens Tricore Embedded Processor,
10068349Sobrien>>18	leshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
101169942Sobrien>>18	leshort		46		Renesas H8/300,
102169942Sobrien>>18	leshort		47		Renesas H8/300H,
103169942Sobrien>>18	leshort		48		Renesas H8S,
104169942Sobrien>>18	leshort		49		Renesas H8/500,
105159764Sobrien>>18	leshort		50		IA-64,
10668349Sobrien>>18	leshort		51		Stanford MIPS-X,
10768349Sobrien>>18	leshort		52		Motorola Coldfire,
10868349Sobrien>>18	leshort		53		Motorola M68HC12,
109186691Sobrien>>18	leshort		54		Fujitsu MMA,
110186691Sobrien>>18	leshort		55		Siemens PCP,
111186691Sobrien>>18	leshort		56		Sony nCPU,
112186691Sobrien>>18	leshort		57		Denso NDR1,
113186691Sobrien>>18	leshort		58		Start*Core,
114186691Sobrien>>18	leshort		59		Toyota ME16,
115186691Sobrien>>18	leshort		60		ST100,
116186691Sobrien>>18	leshort		61		Tinyj emb.,
117169942Sobrien>>18	leshort		62		x86-64,
118186691Sobrien>>18	leshort		63		Sony DSP,
119186691Sobrien>>18	leshort		66		FX66,
120186691Sobrien>>18	leshort		67		ST9+ 8/16 bit,
121186691Sobrien>>18	leshort		68		ST7 8 bit,
122186691Sobrien>>18	leshort		69		MC68HC16,
123186691Sobrien>>18	leshort		70		MC68HC11,
124186691Sobrien>>18	leshort		71		MC68HC08,
125186691Sobrien>>18	leshort		72		MC68HC05,
126186691Sobrien>>18	leshort		73		SGI SVx,
127186691Sobrien>>18	leshort		74		ST19 8 bit,
12868349Sobrien>>18	leshort		75		Digital VAX,
129186691Sobrien>>18	leshort		76		Axis cris,
130186691Sobrien>>18	leshort		77		Infineon 32-bit embedded,
131186691Sobrien>>18	leshort		78		Element 14 64-bit DSP,
132186691Sobrien>>18	leshort		79		LSI Logic 16-bit DSP,
133186691Sobrien>>18	leshort		80		MMIX,
134186691Sobrien>>18	leshort		81		Harvard machine-independent,
135186691Sobrien>>18	leshort		82		SiTera Prism,
136186691Sobrien>>18	leshort		83		Atmel AVR 8-bit,
137186691Sobrien>>18	leshort		84		Fujitsu FR30,
138186691Sobrien>>18	leshort		85		Mitsubishi D10V,
139186691Sobrien>>18	leshort		86		Mitsubishi D30V,
140186691Sobrien>>18	leshort		87		NEC v850,
141139368Sobrien>>18	leshort		88		Renesas M32R,
142186691Sobrien>>18	leshort		89		Matsushita MN10300,
143186691Sobrien>>18	leshort		90		Matsushita MN10200,
144186691Sobrien>>18	leshort		91		picoJava,
145186691Sobrien>>18	leshort		92		OpenRISC,
146186691Sobrien>>18	leshort		93		ARC Cores Tangent-A5,
147169942Sobrien>>18	leshort		94		Tensilica Xtensa,
148111658Sobrien>>18	leshort		97		NatSemi 32k,
149169962Sobrien>>18	leshort		106		Analog Devices Blackfin,
150191771Sobrien>>18	leshort		113		Altera Nios II,
151191771Sobrien>>18	leshort		0xae		META,
152234449Sobrien>>18	leshort		187		Tilera TILE64,
153234449Sobrien>>18	leshort		188		Tilera TILEPro,
154234449Sobrien>>18	leshort		191		Tilera TILE-Gx,
155191771Sobrien>>18	leshort		0x3426		OpenRISC (obsolete),
156191771Sobrien>>18	leshort		0x8472		OpenRISC (obsolete),
15768349Sobrien>>18	leshort		0x9026		Alpha (unofficial),
15868349Sobrien>>20	lelong		0		invalid version
15968349Sobrien>>20	lelong		1		version 1
16068349Sobrien>>36	lelong		1		MathCoPro/FPU/MAU Required
16168349Sobrien>5	byte		2		MSB
162159764Sobrien>>16	beshort		0		no file type,
163186691Sobrien!:mime	application/octet-stream
164159764Sobrien>>16	beshort		1		relocatable,
165186691Sobrien!:mime	application/x-object
166159764Sobrien>>16	beshort		2		executable,
167186691Sobrien!:mime	application/x-executable
168159764Sobrien>>16	beshort		3		shared object,
169186691Sobrien!:mime	application/x-sharedlib
170159764Sobrien>>16	beshort		4		core file,
171186691Sobrien!:mime	application/x-coredump
172159764Sobrien#>>>(0x38+0xcc) string	>\0		of '%s'
173159764Sobrien#>>>(0x38+0x10) belong	>0		(signal %d),
174159764Sobrien>>16	beshort		&0xff00		processor-specific,
175159764Sobrien>>18	beshort		0		no machine,
176159764Sobrien>>18	beshort		1		AT&T WE32100,
177159764Sobrien>>18	beshort		2		SPARC,
178159764Sobrien>>18	beshort		3		Intel 80386 - invalid byte order,
179159764Sobrien>>18	beshort		4		Motorola
180159764Sobrien>>>36	belong		&0x01000000	68000,
181159764Sobrien>>>36	belong		&0x00810000	CPU32,
182159764Sobrien>>>36	belong		0		68020,
183159764Sobrien>>18	beshort		5		Motorola 88000,
184159764Sobrien>>18	beshort		6		Intel 80486 - invalid byte order,
185159764Sobrien>>18	beshort		7		Intel 80860,
186103373Sobrien# only for MIPS - see comment in little-endian section above.
187159764Sobrien>>18	beshort		8		MIPS,
188159764Sobrien>>>36	belong		&0x20		N32
189159764Sobrien>>18	beshort		10		MIPS,
190159764Sobrien>>>36	belong		&0x20		N32
191159764Sobrien>>18	beshort		8
19268349Sobrien# only for 32-bit
19368349Sobrien>>>4	byte		1
194103373Sobrien>>>>36  belong&0xf0000000	0x00000000	MIPS-I
195103373Sobrien>>>>36  belong&0xf0000000	0x10000000	MIPS-II
196103373Sobrien>>>>36  belong&0xf0000000	0x20000000	MIPS-III
197103373Sobrien>>>>36  belong&0xf0000000	0x30000000	MIPS-IV
198103373Sobrien>>>>36  belong&0xf0000000	0x40000000	MIPS-V
199175296Sobrien>>>>36  belong&0xf0000000	0x50000000	MIPS32
200175296Sobrien>>>>36  belong&0xf0000000	0x60000000	MIPS64
201175296Sobrien>>>>36  belong&0xf0000000	0x70000000	MIPS32 rel2
202175296Sobrien>>>>36  belong&0xf0000000	0x80000000	MIPS64 rel2
20368349Sobrien# only for 64-bit
20468349Sobrien>>>4	byte		2
205103373Sobrien>>>>48	belong&0xf0000000	0x00000000	MIPS-I
206103373Sobrien>>>>48	belong&0xf0000000	0x10000000	MIPS-II
207103373Sobrien>>>>48	belong&0xf0000000	0x20000000	MIPS-III
208103373Sobrien>>>>48	belong&0xf0000000	0x30000000	MIPS-IV
209103373Sobrien>>>>48	belong&0xf0000000	0x40000000	MIPS-V
210175296Sobrien>>>>48	belong&0xf0000000	0x50000000	MIPS32
211175296Sobrien>>>>48	belong&0xf0000000	0x60000000	MIPS64
212175296Sobrien>>>>48	belong&0xf0000000	0x70000000	MIPS32 rel2
213175296Sobrien>>>>48	belong&0xf0000000	0x80000000	MIPS64 rel2
21468349Sobrien>>18	beshort		9		Amdahl,
215103373Sobrien>>18	beshort		10		MIPS (deprecated),
21668349Sobrien>>18	beshort		11		RS6000,
21774784Sobrien>>18	beshort		15		PA-RISC
21874784Sobrien>>>50	beshort		0x0214		2.0
21974784Sobrien>>>48	beshort		&0x0008		(LP64)
22068349Sobrien>>18	beshort		16		nCUBE,
22168349Sobrien>>18	beshort		17		Fujitsu VPP500,
22268349Sobrien>>18	beshort		18		SPARC32PLUS,
223186691Sobrien>>>36	belong&0xffff00	0x000100	V8+ Required,
224186691Sobrien>>>36	belong&0xffff00	0x000200	Sun UltraSPARC1 Extensions Required,
225186691Sobrien>>>36	belong&0xffff00	0x000400	HaL R1 Extensions Required,
226186691Sobrien>>>36	belong&0xffff00	0x000800	Sun UltraSPARC3 Extensions Required,
22768349Sobrien>>18	beshort		20		PowerPC or cisco 4500,
228169962Sobrien>>18	beshort		21		64-bit PowerPC or cisco 7500,
229133359Sobrien>>18	beshort		22		IBM S/390,
230169962Sobrien>>18	beshort		23		Cell SPU,
23168349Sobrien>>18	beshort		24		cisco SVIP,
23268349Sobrien>>18	beshort		25		cisco 7200,
23368349Sobrien>>18	beshort		36		NEC V800 or cisco 12000,
23468349Sobrien>>18	beshort		37		Fujitsu FR20,
23568349Sobrien>>18	beshort		38		TRW RH-32,
23668349Sobrien>>18	beshort		39		Motorola RCE,
23775937Sobrien>>18	beshort		40		ARM,
23868349Sobrien>>18	beshort		41		Alpha,
239169942Sobrien>>18	beshort		42		Renesas SH,
24068349Sobrien>>18	beshort		43		SPARC V9,
241186691Sobrien>>>48	belong&0xffff00	0x000200	Sun UltraSPARC1 Extensions Required,
242186691Sobrien>>>48	belong&0xffff00	0x000400	HaL R1 Extensions Required,
243186691Sobrien>>>48	belong&0xffff00	0x000800	Sun UltraSPARC3 Extensions Required,
244186691Sobrien>>>48	belong&0x3	0		total store ordering,
245186691Sobrien>>>48	belong&0x3	1		partial store ordering,
246186691Sobrien>>>48	belong&0x3	2		relaxed memory ordering,
24768349Sobrien>>18	beshort		44		Siemens Tricore Embedded Processor,
24868349Sobrien>>18	beshort		45		Argonaut RISC Core, Argonaut Technologies Inc.,
249169942Sobrien>>18	beshort		46		Renesas H8/300,
250169942Sobrien>>18	beshort		47		Renesas H8/300H,
251169942Sobrien>>18	beshort		48		Renesas H8S,
252169942Sobrien>>18	beshort		49		Renesas H8/500,
253159764Sobrien>>18	beshort		50		IA-64,
25468349Sobrien>>18	beshort		51		Stanford MIPS-X,
25568349Sobrien>>18	beshort		52		Motorola Coldfire,
25668349Sobrien>>18	beshort		53		Motorola M68HC12,
25780588Sobrien>>18	beshort		73		Cray NV1,
25868349Sobrien>>18	beshort		75		Digital VAX,
259139368Sobrien>>18	beshort		88		Renesas M32R,
260186691Sobrien>>18	leshort		92		OpenRISC,
261186691Sobrien>>18	leshort		0x3426		OpenRISC (obsolete),
262186691Sobrien>>18	leshort		0x8472		OpenRISC (obsolete),
263169942Sobrien>>18	beshort		94		Tensilica Xtensa,
264111658Sobrien>>18	beshort		97		NatSemi 32k,
265234449Sobrien>>18	beshort		187		Tilera TILE64,
266234449Sobrien>>18	beshort		188		Tilera TILEPro,
267234449Sobrien>>18	beshort		191		Tilera TILE-Gx,
268175296Sobrien>>18	beshort		0x18ad		AVR32 (unofficial),
26968349Sobrien>>18	beshort		0x9026		Alpha (unofficial),
270133359Sobrien>>18	beshort		0xa390		IBM S/390 (obsolete),
27168349Sobrien>>20	belong		0		invalid version
27268349Sobrien>>20	belong		1		version 1
27368349Sobrien>>36	belong		1		MathCoPro/FPU/MAU Required
274133359Sobrien# Up to now only 0, 1 and 2 are defined; I've seen a file with 0x83, it seemed
275133359Sobrien# like proper ELF, but extracting the string had bad results.
276133359Sobrien>4      byte            <0x80
277133359Sobrien>>8	string		>\0		(%s)
27880588Sobrien>8	string		\0
27980588Sobrien>>7	byte		0		(SYSV)
28080588Sobrien>>7	byte		1		(HP-UX)
28180588Sobrien>>7	byte		2		(NetBSD)
28280588Sobrien>>7	byte		3		(GNU/Linux)
28380588Sobrien>>7	byte		4		(GNU/Hurd)
28480588Sobrien>>7	byte		5		(86Open)
28580588Sobrien>>7	byte		6		(Solaris)
28680588Sobrien>>7	byte		7		(Monterey)
28780588Sobrien>>7	byte		8		(IRIX)
28880588Sobrien>>7	byte		9		(FreeBSD)
28980588Sobrien>>7	byte		10		(Tru64)
29080588Sobrien>>7	byte		11		(Novell Modesto)
29180588Sobrien>>7	byte		12		(OpenBSD)
292169942Sobrien>8      string          \2
293169942Sobrien>>7     byte            13              (OpenVMS)
29480588Sobrien>>7	byte		97		(ARM)
29580588Sobrien>>7	byte		255		(embedded)
296