| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 | 
#------------------------------------------------------------------------------# $File: freebsd,v 1.9 2022/01/19 12:44:13 christos Exp $# freebsd:  file(1) magic for FreeBSD objects## All new-style FreeBSD magic numbers are in host byte order (i.e.,# little-endian on x86).## XXX - this comes from the file "freebsd" in a recent FreeBSD version of# "file"; it, and the NetBSD stuff in "netbsd", appear to use different# schemes for distinguishing between executable images, shared libraries,# and object files.## FreeBSD says:##    Regardless of whether it's pure, demand-paged, or none of the#    above:##	if the entry point is < 4096, then it's a shared library if#	the "has run-time loader information" bit is set, and is#	position-independent if the "is position-independent" bit#	is set;##	if the entry point is >= 4096 (or >4095, same thing), then it's#	an executable, and is dynamically-linked if the "has run-time#	loader information" bit is set.## On x86, NetBSD says:##    If it's neither pure nor demand-paged:##	if it has the "has run-time loader information" bit set, it's#	a dynamically-linked executable;##	if it doesn't have that bit set, then:##	    if it has the "is position-independent" bit set, it's#	    position-independent;##	    if the entry point is non-zero, it's an executable, otherwise#	    it's an object file.##    If it's pure:##	if it has the "has run-time loader information" bit set, it's#	a dynamically-linked executable, otherwise it's just an#	executable.##    If it's demand-paged:##	if it has the "has run-time loader information" bit set,#	then:##	    if the entry point is < 4096, it's a shared library;##	    if the entry point is = 4096 or > 4096 (i.e., >= 4096),#	    it's a dynamically-linked executable);##	if it doesn't have the "has run-time loader information" bit#	set, then it's just an executable.## (On non-x86, NetBSD does much the same thing, except that it uses# 8192 on 68K - except for "68k4k", which is presumably "68K with 4K# pages - SPARC, and MIPS, presumably because Sun-3's and Sun-4's# had 8K pages; dunno about MIPS.)## I suspect the two will differ only in perverse and uninteresting cases# ("shared" libraries that aren't demand-paged and whose pages probably# won't actually be shared, executables with entry points <4096).## I leave it to those more familiar with FreeBSD and NetBSD to figure out# what the right answer is (although using ">4095", FreeBSD-style, is# probably better than separately checking for "=4096" and ">4096",# NetBSD-style).  (The old "netbsd" file analyzed FreeBSD demand paged# executables using the NetBSD technique.)#0	lelong&0377777777	041400407	FreeBSD/i386>20	lelong			<4096>>3	byte&0xC0		&0x80		shared library>>3	byte&0xC0		0x40		PIC object>>3	byte&0xC0		0x00		object>20	lelong			>4095>>3	byte&0x80		0x80		dynamically linked executable>>3	byte&0x80		0x00		executable>16	lelong			>0		not stripped0	lelong&0377777777	041400410	FreeBSD/i386 pure>20	lelong			<4096>>3	byte&0xC0		&0x80		shared library>>3	byte&0xC0		0x40		PIC object>>3	byte&0xC0		0x00		object>20	lelong			>4095>>3	byte&0x80		0x80		dynamically linked executable>>3	byte&0x80		0x00		executable>16	lelong			>0		not stripped0	lelong&0377777777	041400413	FreeBSD/i386 demand paged>20	lelong			<4096>>3	byte&0xC0		&0x80		shared library>>3	byte&0xC0		0x40		PIC object>>3	byte&0xC0		0x00		object>20	lelong			>4095>>3	byte&0x80		0x80		dynamically linked executable>>3	byte&0x80		0x00		executable>16	lelong			>0		not stripped0	lelong&0377777777	041400314	FreeBSD/i386 compact demand paged>20	lelong			<4096>>3	byte&0xC0		&0x80		shared library>>3	byte&0xC0		0x40		PIC object>>3	byte&0xC0		0x00		object>20	lelong			>4095>>3	byte&0x80		0x80		dynamically linked executable>>3	byte&0x80		0x00		executable>16	lelong			>0		not stripped# XXX gross hack to identify core files# cores start with a struct tss; we take advantage of the following:# byte 7:     highest byte of the kernel stack pointer, always 0xfe#      8/9:   kernel (ring 0) ss value, always 0x0010#      10 - 27: ring 1 and 2 ss/esp, unused, thus always 0#      28:    low order byte of the current PTD entry, always 0 since the#             PTD is page-aligned#7	string	\357\020\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0	FreeBSD/i386 a.out core file>1039	string	>\0	from '%s'# /var/run/ld.so.hints# What are you laughing about?0	lelong			011421044151	ld.so hints file (Little Endian>4	lelong			>0		\b, version %d)>4	belong			<1		\b)0	belong			011421044151	ld.so hints file (Big Endian>4	belong			>0		\b, version %d)>4	belong			<1		\b)## Files generated by FreeBSD scrshot(1)/vidcontrol(1) utilities#0	string	SCRSHOT_	scrshot(1) screenshot,>8	byte	x		version %d,>9	byte	2		%d bytes in header,>>10	byte	x		%d chars wide by>>11	byte	x		%d chars high## FreeBSD kernel minidumps#0	string	minidump\040FreeBSD/	FreeBSD kernel minidump# powerpc uses 32-byte magic, followed by 32-byte mmu kind, then version>17	string	powerpc>>17	string	>\0			for %s,>>>32	string	>\0			%s,>>>>64	byte	0			big endian,>>>>>64	belong	x			version %d>>>>64	default	x			little endian,>>>>>64	lelong	x			version %d# all other architectures use 24-byte magic, followed by version>17	default	x>>17	string	>\0			for %s,>>>24	byte	0			big endian,>>>>24	belong	x			version %d>>>24	default	x			little endian,>>>>24	lelong	x			version %d
 |