139092Srnordier/*
239092Srnordier * Copyright (c) 1998 Robert Nordier
339092Srnordier * All rights reserved.
439092Srnordier *
539092Srnordier * Redistribution and use in source and binary forms, with or without
639092Srnordier * modification, are permitted provided that the following conditions
739092Srnordier * are met:
839092Srnordier * 1. Redistributions of source code must retain the above copyright
939092Srnordier *    notice, this list of conditions and the following disclaimer.
1039092Srnordier * 2. Redistributions in binary form must reproduce the above copyright
1139092Srnordier *    notice, this list of conditions and the following disclaimer in the
1239092Srnordier *    documentation and/or other materials provided with the distribution.
1339092Srnordier *
1439092Srnordier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND
1539092Srnordier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1639092Srnordier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1739092Srnordier * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS
1839092Srnordier * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
1939092Srnordier * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
2039092Srnordier * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
2139092Srnordier * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
2239092Srnordier * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
2339092Srnordier * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
2439092Srnordier * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2539092Srnordier *
2650479Speter * $FreeBSD: releng/10.3/usr.sbin/btxld/elfh.c 130927 2004-06-22 17:05:39Z obrien $
2739092Srnordier */
2839092Srnordier
2955416Smarcel#include <sys/types.h>
30130927Sobrien#include <sys/endian.h>
3155416Smarcel
3239092Srnordier#include <stddef.h>
3339092Srnordier#include "elfh.h"
3439092Srnordier
3539092Srnordier#define SET_ME	0xeeeeeeee    /* filled in by btxld */
3639092Srnordier
3739092Srnordier/*
3839092Srnordier * ELF header template.
3939092Srnordier */
4039092Srnordierconst struct elfh elfhdr = {
4139092Srnordier    {
4239092Srnordier	{
4339092Srnordier	    ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3,     /* e_ident */
4439092Srnordier	    ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0,
4539092Srnordier	    'F', 'r', 'e', 'e', 'B', 'S', 'D', 0
4639092Srnordier	},
47130927Sobrien	htole16(ET_EXEC),			    /* e_type */
48130927Sobrien	htole16(EM_386),			    /* e_machine */
49130927Sobrien	htole32(EV_CURRENT),			    /* e_version */
50130927Sobrien	htole32(SET_ME),			    /* e_entry */
51130927Sobrien	htole32(offsetof(struct elfh, p)),	    /* e_phoff */
52130927Sobrien	htole32(offsetof(struct elfh, sh)),	    /* e_shoff */
5339092Srnordier	0,					    /* e_flags */
54130927Sobrien	htole16(sizeof(elfhdr.e)),		    /* e_ehsize */
55130927Sobrien	htole16(sizeof(elfhdr.p[0])),		    /* e_phentsize */
56130927Sobrien	htole16(sizeof(elfhdr.p) / sizeof(elfhdr.p[0])), /* e_phnum */
57130927Sobrien	htole16(sizeof(elfhdr.sh[0])),		    /* e_shentsize */
58130927Sobrien	htole16(sizeof(elfhdr.sh) / sizeof(elfhdr.sh[0])), /* e_shnum */
59130927Sobrien	htole16(1)				    /* e_shstrndx */
6039092Srnordier    },
6139092Srnordier    {
6239092Srnordier	{
63130927Sobrien	    htole32(PT_LOAD),			    /* p_type */
64130927Sobrien	    htole32(sizeof(elfhdr)),		    /* p_offset */
65130927Sobrien	    htole32(SET_ME),			    /* p_vaddr */
66130927Sobrien	    htole32(SET_ME),			    /* p_paddr */
67130927Sobrien	    htole32(SET_ME),			    /* p_filesz */
68130927Sobrien	    htole32(SET_ME),			    /* p_memsz */
69130927Sobrien	    htole32(PF_R | PF_X),		    /* p_flags */
70130927Sobrien	    htole32(0x1000)			    /* p_align */
7139092Srnordier	},
7239092Srnordier	{
73130927Sobrien	    htole32(PT_LOAD),			    /* p_type */
74130927Sobrien	    htole32(SET_ME),			    /* p_offset */
75130927Sobrien	    htole32(SET_ME),			    /* p_vaddr */
76130927Sobrien	    htole32(SET_ME),			    /* p_paddr */
77130927Sobrien	    htole32(SET_ME),			    /* p_filesz */
78130927Sobrien	    htole32(SET_ME),			    /* p_memsz */
79130927Sobrien	    htole32(PF_R | PF_W),		    /* p_flags */
80130927Sobrien	    htole32(0x1000)			    /* p_align */
8139092Srnordier	}
8239092Srnordier    },
8339092Srnordier    {
8439092Srnordier	{
85130927Sobrien	    0, htole32(SHT_NULL), 0, 0, 0, 0, htole32(SHN_UNDEF), 0, 0, 0
8639092Srnordier	},
8739092Srnordier	{
88130927Sobrien	    htole32(1),				    /* sh_name */
89130927Sobrien	    htole32(SHT_STRTAB), 		    /* sh_type */
9039092Srnordier	    0,					    /* sh_flags */
9139092Srnordier	    0,					    /* sh_addr */
92130927Sobrien	    htole32(offsetof(struct elfh, shstrtab)), /* sh_offset */
93130927Sobrien	    htole32(sizeof(elfhdr.shstrtab)),	    /* sh_size */
94130927Sobrien	    htole32(SHN_UNDEF),			    /* sh_link */
9539092Srnordier	    0,					    /* sh_info */
96130927Sobrien	    htole32(1),				    /* sh_addralign */
9739092Srnordier	    0					    /* sh_entsize */
9839092Srnordier	},
9939092Srnordier	{
100130927Sobrien	    htole32(0xb),			    /* sh_name */
101130927Sobrien	    htole32(SHT_PROGBITS),		    /* sh_type */
102130927Sobrien	    htole32(SHF_EXECINSTR | SHF_ALLOC),	    /* sh_flags */
103130927Sobrien	    htole32(SET_ME),			    /* sh_addr */
104130927Sobrien	    htole32(SET_ME),			    /* sh_offset */
105130927Sobrien	    htole32(SET_ME),			    /* sh_size */
106130927Sobrien	    htole32(SHN_UNDEF),			    /* sh_link */
10739092Srnordier	    0,					    /* sh_info */
108130927Sobrien	    htole32(4),				    /* sh_addralign */
10939092Srnordier	    0					    /* sh_entsize */
11039092Srnordier	},
11139092Srnordier	{
112130927Sobrien	    htole32(0x11),			    /* sh_name */
113130927Sobrien	    htole32(SHT_PROGBITS),		    /* sh_type */
114130927Sobrien	    htole32(SHF_ALLOC | SHF_WRITE),	    /* sh_flags */
115130927Sobrien	    htole32(SET_ME),			    /* sh_addr */
116130927Sobrien	    htole32(SET_ME),			    /* sh_offset */
117130927Sobrien	    htole32(SET_ME),			    /* sh_size */
118130927Sobrien	    htole32(SHN_UNDEF),			    /* sh_link */
11939092Srnordier	    0,					    /* sh_info */
120130927Sobrien	    htole32(4),				    /* sh_addralign */
12139092Srnordier	    0					    /* sh_entsize */
12239092Srnordier	}
12339092Srnordier    },
12439092Srnordier    "\0.shstrtab\0.text\0.data" 		    /* shstrtab */
12539092Srnordier};
126