elfh.c revision 39092
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 * 2639092Srnordier * $Id:$ 2739092Srnordier */ 2839092Srnordier 2939092Srnordier#include <stddef.h> 3039092Srnordier#include "elfh.h" 3139092Srnordier 3239092Srnordier#define SET_ME 0xeeeeeeee /* filled in by btxld */ 3339092Srnordier 3439092Srnordier/* 3539092Srnordier * ELF header template. 3639092Srnordier */ 3739092Srnordierconst struct elfh elfhdr = { 3839092Srnordier { 3939092Srnordier { 4039092Srnordier ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */ 4139092Srnordier ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0, 4239092Srnordier 'F', 'r', 'e', 'e', 'B', 'S', 'D', 0 4339092Srnordier }, 4439092Srnordier ET_EXEC, /* e_type */ 4539092Srnordier EM_386, /* e_machine */ 4639092Srnordier EV_CURRENT, /* e_version */ 4739092Srnordier SET_ME, /* e_entry */ 4839092Srnordier offsetof(struct elfh, p), /* e_phoff */ 4939092Srnordier offsetof(struct elfh, sh), /* e_shoff */ 5039092Srnordier 0, /* e_flags */ 5139092Srnordier sizeof(elfhdr.e), /* e_ehsize */ 5239092Srnordier sizeof(elfhdr.p[0]), /* e_phentsize */ 5339092Srnordier sizeof(elfhdr.p) / sizeof(elfhdr.p[0]), /* e_phnum */ 5439092Srnordier sizeof(elfhdr.sh[0]), /* e_shentsize */ 5539092Srnordier sizeof(elfhdr.sh) / sizeof(elfhdr.sh[0]), /* e_shnum */ 5639092Srnordier 1 /* e_shstrndx */ 5739092Srnordier }, 5839092Srnordier { 5939092Srnordier { 6039092Srnordier PT_LOAD, /* p_type */ 6139092Srnordier sizeof(elfhdr), /* p_offset */ 6239092Srnordier SET_ME, /* p_vaddr */ 6339092Srnordier SET_ME, /* p_paddr */ 6439092Srnordier SET_ME, /* p_filesz */ 6539092Srnordier SET_ME, /* p_memsz */ 6639092Srnordier PF_R | PF_X, /* p_flags */ 6739092Srnordier 0x1000 /* p_align */ 6839092Srnordier }, 6939092Srnordier { 7039092Srnordier PT_LOAD, /* p_type */ 7139092Srnordier SET_ME, /* p_offset */ 7239092Srnordier SET_ME, /* p_vaddr */ 7339092Srnordier SET_ME, /* p_paddr */ 7439092Srnordier SET_ME, /* p_filesz */ 7539092Srnordier SET_ME, /* p_memsz */ 7639092Srnordier PF_R | PF_W, /* p_flags */ 7739092Srnordier 0x1000 /* p_align */ 7839092Srnordier } 7939092Srnordier }, 8039092Srnordier { 8139092Srnordier { 8239092Srnordier 0, SHT_NULL, 0, 0, 0, 0, SHN_UNDEF, 0, 0, 0 8339092Srnordier }, 8439092Srnordier { 8539092Srnordier 1, /* sh_name */ 8639092Srnordier SHT_STRTAB, /* sh_type */ 8739092Srnordier 0, /* sh_flags */ 8839092Srnordier 0, /* sh_addr */ 8939092Srnordier offsetof(struct elfh, shstrtab), /* sh_offset */ 9039092Srnordier sizeof(elfhdr.shstrtab), /* sh_size */ 9139092Srnordier SHN_UNDEF, /* sh_link */ 9239092Srnordier 0, /* sh_info */ 9339092Srnordier 1, /* sh_addralign */ 9439092Srnordier 0 /* sh_entsize */ 9539092Srnordier }, 9639092Srnordier { 9739092Srnordier 0xb, /* sh_name */ 9839092Srnordier SHT_PROGBITS, /* sh_type */ 9939092Srnordier SHF_EXECINSTR | SHF_ALLOC, /* sh_flags */ 10039092Srnordier SET_ME, /* sh_addr */ 10139092Srnordier SET_ME, /* sh_offset */ 10239092Srnordier SET_ME, /* sh_size */ 10339092Srnordier SHN_UNDEF, /* sh_link */ 10439092Srnordier 0, /* sh_info */ 10539092Srnordier 4, /* sh_addralign */ 10639092Srnordier 0 /* sh_entsize */ 10739092Srnordier }, 10839092Srnordier { 10939092Srnordier 0x11, /* sh_name */ 11039092Srnordier SHT_PROGBITS, /* sh_type */ 11139092Srnordier SHF_ALLOC | SHF_WRITE, /* sh_flags */ 11239092Srnordier SET_ME, /* sh_addr */ 11339092Srnordier SET_ME, /* sh_offset */ 11439092Srnordier SET_ME, /* sh_size */ 11539092Srnordier SHN_UNDEF, /* sh_link */ 11639092Srnordier 0, /* sh_info */ 11739092Srnordier 4, /* sh_addralign */ 11839092Srnordier 0 /* sh_entsize */ 11939092Srnordier } 12039092Srnordier }, 12139092Srnordier "\0.shstrtab\0.text\0.data" /* shstrtab */ 12239092Srnordier}; 123