xref: /freebsd/usr.sbin/btxld/elfh.c (revision 8918cc95e869ce4a9c7fb15221577444a8c66215)
11de7b4b8SPedro F. Giffuni /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
31de7b4b8SPedro F. Giffuni  *
49c9f4492SRobert Nordier  * Copyright (c) 1998 Robert Nordier
59c9f4492SRobert Nordier  * All rights reserved.
69c9f4492SRobert Nordier  *
79c9f4492SRobert Nordier  * Redistribution and use in source and binary forms, with or without
89c9f4492SRobert Nordier  * modification, are permitted provided that the following conditions
99c9f4492SRobert Nordier  * are met:
109c9f4492SRobert Nordier  * 1. Redistributions of source code must retain the above copyright
119c9f4492SRobert Nordier  *    notice, this list of conditions and the following disclaimer.
129c9f4492SRobert Nordier  * 2. Redistributions in binary form must reproduce the above copyright
139c9f4492SRobert Nordier  *    notice, this list of conditions and the following disclaimer in the
149c9f4492SRobert Nordier  *    documentation and/or other materials provided with the distribution.
159c9f4492SRobert Nordier  *
169c9f4492SRobert Nordier  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
179c9f4492SRobert Nordier  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
189c9f4492SRobert Nordier  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
199c9f4492SRobert Nordier  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
209c9f4492SRobert Nordier  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
219c9f4492SRobert Nordier  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
229c9f4492SRobert Nordier  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
239c9f4492SRobert Nordier  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
249c9f4492SRobert Nordier  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
259c9f4492SRobert Nordier  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
269c9f4492SRobert Nordier  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
279c9f4492SRobert Nordier  */
289c9f4492SRobert Nordier 
29*8918cc95SElyes Haouas #include <sys/param.h>
3049a39408SDavid E. O'Brien #include <sys/endian.h>
31b0ca5f03SMarcel Moolenaar 
329c9f4492SRobert Nordier #include <stddef.h>
339c9f4492SRobert Nordier #include "elfh.h"
349c9f4492SRobert Nordier 
359c9f4492SRobert Nordier #define SET_ME	0xeeeeeeee    /* filled in by btxld */
369c9f4492SRobert Nordier 
379c9f4492SRobert Nordier /*
389c9f4492SRobert Nordier  * ELF header template.
399c9f4492SRobert Nordier  */
409c9f4492SRobert Nordier const struct elfh elfhdr = {
419c9f4492SRobert Nordier     {
429c9f4492SRobert Nordier 	{
439c9f4492SRobert Nordier 	    ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,     /* e_ident */
449c9f4492SRobert Nordier 	    ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0,
459c9f4492SRobert Nordier 	    'F', 'r', 'e', 'e', 'B', 'S', 'D', 0
469c9f4492SRobert Nordier 	},
4749a39408SDavid E. O'Brien 	htole16(ET_EXEC),			    /* e_type */
4849a39408SDavid E. O'Brien 	htole16(EM_386),			    /* e_machine */
4949a39408SDavid E. O'Brien 	htole32(EV_CURRENT),			    /* e_version */
5049a39408SDavid E. O'Brien 	htole32(SET_ME),			    /* e_entry */
5149a39408SDavid E. O'Brien 	htole32(offsetof(struct elfh, p)),	    /* e_phoff */
5249a39408SDavid E. O'Brien 	htole32(offsetof(struct elfh, sh)),	    /* e_shoff */
539c9f4492SRobert Nordier 	0,					    /* e_flags */
5449a39408SDavid E. O'Brien 	htole16(sizeof(elfhdr.e)),		    /* e_ehsize */
5549a39408SDavid E. O'Brien 	htole16(sizeof(elfhdr.p[0])),		    /* e_phentsize */
56*8918cc95SElyes Haouas 	htole16(nitems(elfhdr.p)),		    /* e_phnum */
5749a39408SDavid E. O'Brien 	htole16(sizeof(elfhdr.sh[0])),		    /* e_shentsize */
58*8918cc95SElyes Haouas 	htole16(nitems(elfhdr.sh)),		    /* e_shnum */
5949a39408SDavid E. O'Brien 	htole16(1)				    /* e_shstrndx */
609c9f4492SRobert Nordier     },
619c9f4492SRobert Nordier     {
629c9f4492SRobert Nordier 	{
6349a39408SDavid E. O'Brien 	    htole32(PT_LOAD),			    /* p_type */
6449a39408SDavid E. O'Brien 	    htole32(sizeof(elfhdr)),		    /* p_offset */
6549a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_vaddr */
6649a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_paddr */
6749a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_filesz */
6849a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_memsz */
6949a39408SDavid E. O'Brien 	    htole32(PF_R | PF_X),		    /* p_flags */
7049a39408SDavid E. O'Brien 	    htole32(0x1000)			    /* p_align */
719c9f4492SRobert Nordier 	},
729c9f4492SRobert Nordier 	{
7349a39408SDavid E. O'Brien 	    htole32(PT_LOAD),			    /* p_type */
7449a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_offset */
7549a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_vaddr */
7649a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_paddr */
7749a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_filesz */
7849a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* p_memsz */
7949a39408SDavid E. O'Brien 	    htole32(PF_R | PF_W),		    /* p_flags */
8049a39408SDavid E. O'Brien 	    htole32(0x1000)			    /* p_align */
819c9f4492SRobert Nordier 	}
829c9f4492SRobert Nordier     },
839c9f4492SRobert Nordier     {
849c9f4492SRobert Nordier 	{
8549a39408SDavid E. O'Brien 	    0, htole32(SHT_NULL), 0, 0, 0, 0, htole32(SHN_UNDEF), 0, 0, 0
869c9f4492SRobert Nordier 	},
879c9f4492SRobert Nordier 	{
8849a39408SDavid E. O'Brien 	    htole32(1),				    /* sh_name */
8949a39408SDavid E. O'Brien 	    htole32(SHT_STRTAB), 		    /* sh_type */
909c9f4492SRobert Nordier 	    0,					    /* sh_flags */
919c9f4492SRobert Nordier 	    0,					    /* sh_addr */
9249a39408SDavid E. O'Brien 	    htole32(offsetof(struct elfh, shstrtab)), /* sh_offset */
9349a39408SDavid E. O'Brien 	    htole32(sizeof(elfhdr.shstrtab)),	    /* sh_size */
9449a39408SDavid E. O'Brien 	    htole32(SHN_UNDEF),			    /* sh_link */
959c9f4492SRobert Nordier 	    0,					    /* sh_info */
9649a39408SDavid E. O'Brien 	    htole32(1),				    /* sh_addralign */
979c9f4492SRobert Nordier 	    0					    /* sh_entsize */
989c9f4492SRobert Nordier 	},
999c9f4492SRobert Nordier 	{
10049a39408SDavid E. O'Brien 	    htole32(0xb),			    /* sh_name */
10149a39408SDavid E. O'Brien 	    htole32(SHT_PROGBITS),		    /* sh_type */
10249a39408SDavid E. O'Brien 	    htole32(SHF_EXECINSTR | SHF_ALLOC),	    /* sh_flags */
10349a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_addr */
10449a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_offset */
10549a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_size */
10649a39408SDavid E. O'Brien 	    htole32(SHN_UNDEF),			    /* sh_link */
1079c9f4492SRobert Nordier 	    0,					    /* sh_info */
10849a39408SDavid E. O'Brien 	    htole32(4),				    /* sh_addralign */
1099c9f4492SRobert Nordier 	    0					    /* sh_entsize */
1109c9f4492SRobert Nordier 	},
1119c9f4492SRobert Nordier 	{
11249a39408SDavid E. O'Brien 	    htole32(0x11),			    /* sh_name */
11349a39408SDavid E. O'Brien 	    htole32(SHT_PROGBITS),		    /* sh_type */
11449a39408SDavid E. O'Brien 	    htole32(SHF_ALLOC | SHF_WRITE),	    /* sh_flags */
11549a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_addr */
11649a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_offset */
11749a39408SDavid E. O'Brien 	    htole32(SET_ME),			    /* sh_size */
11849a39408SDavid E. O'Brien 	    htole32(SHN_UNDEF),			    /* sh_link */
1199c9f4492SRobert Nordier 	    0,					    /* sh_info */
12049a39408SDavid E. O'Brien 	    htole32(4),				    /* sh_addralign */
1219c9f4492SRobert Nordier 	    0					    /* sh_entsize */
1229c9f4492SRobert Nordier 	}
1239c9f4492SRobert Nordier     },
1249c9f4492SRobert Nordier     "\0.shstrtab\0.text\0.data" 		    /* shstrtab */
1259c9f4492SRobert Nordier };
126