148905Srnordier/* 248905Srnordier * Copyright (c) 1999 Global Technology Associates, Inc. 348905Srnordier * All rights reserved. 448905Srnordier * 548905Srnordier * Redistribution and use in source and binary forms, with or without 648905Srnordier * modification, are permitted provided that the following conditions 748905Srnordier * are met: 848905Srnordier * 1. Redistributions of source code must retain the above copyright 948905Srnordier * notice, this list of conditions and the following disclaimer. 1048905Srnordier * 2. Redistributions in binary form must reproduce the above copyright 1148905Srnordier * notice, this list of conditions and the following disclaimer in the 1248905Srnordier * documentation and/or other materials provided with the distribution. 1348905Srnordier * 1448905Srnordier * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS``AS IS'' AND 1548905Srnordier * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1648905Srnordier * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 1748905Srnordier * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS 1848905Srnordier * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, 1948905Srnordier * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT 2048905Srnordier * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 2148905Srnordier * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2248905Srnordier * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 2348905Srnordier * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 2448905Srnordier * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2548905Srnordier * 2650479Speter * $FreeBSD$ 2748905Srnordier */ 2848905Srnordier 29130927Sobrien#include <sys/endian.h> 3048905Srnordier#include <stddef.h> 3148905Srnordier#include "elfhdr.h" 3248905Srnordier 3348905Srnordier#define KGZ_FIX_NSIZE 0 /* Run-time fixup */ 3448905Srnordier 3548905Srnordier/* 3648905Srnordier * Relocatable header template. 3748905Srnordier */ 3848905Srnordierconst struct kgz_elfhdr elfhdr = { 3948905Srnordier /* ELF header */ 4048905Srnordier { 4148905Srnordier { 4248905Srnordier ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3, /* e_ident */ 4348905Srnordier ELFCLASS32, ELFDATA2LSB, EV_CURRENT, 0, 4448905Srnordier 'F', 'r', 'e', 'e', 'B', 'S', 'D', 0 4548905Srnordier }, 46130927Sobrien htole16(ET_EXEC), /* e_type */ 47130927Sobrien htole16(EM_386), /* e_machine */ 48130927Sobrien htole32(EV_CURRENT), /* e_version */ 4948905Srnordier 0, /* e_entry */ 5048905Srnordier 0, /* e_phoff */ 51130927Sobrien htole32(offsetof(struct kgz_elfhdr, sh)), /* e_shoff */ 5248905Srnordier 0, /* e_flags */ 53130927Sobrien htole16(sizeof(Elf32_Ehdr)), /* e_ehsize */ 5448905Srnordier 0, /* e_phentsize */ 5548905Srnordier 0, /* e_phnum */ 56130927Sobrien htole16(sizeof(Elf32_Shdr)), /* e_shentsize */ 57130927Sobrien htole16(KGZ_SHNUM), /* e_shnum */ 58130927Sobrien htole16(KGZ_SH_SHSTRTAB) /* e_shstrndx */ 5948905Srnordier }, 6048905Srnordier /* Section header */ 6148905Srnordier { 6248905Srnordier { 6348905Srnordier 0, /* sh_name */ 64130927Sobrien htole32(SHT_NULL), /* sh_type */ 6548905Srnordier 0, /* sh_flags */ 6648905Srnordier 0, /* sh_addr */ 6748905Srnordier 0, /* sh_offset */ 6848905Srnordier 0, /* sh_size */ 69130927Sobrien htole32(SHN_UNDEF), /* sh_link */ 7048905Srnordier 0, /* sh_info */ 7148905Srnordier 0, /* sh_addralign */ 7248905Srnordier 0 /* sh_entsize */ 7348905Srnordier }, 7448905Srnordier { 75130927Sobrien htole32(offsetof(struct kgz_shstrtab, symtab)), /* sh_name */ 76130927Sobrien htole32(SHT_SYMTAB), /* sh_type */ 7748905Srnordier 0, /* sh_flags */ 7848905Srnordier 0, /* sh_addr */ 79130927Sobrien htole32(offsetof(struct kgz_elfhdr, st)), /* sh_offset */ 80130927Sobrien htole32(sizeof(Elf32_Sym) * KGZ_STNUM), /* sh_size */ 81130927Sobrien htole32(KGZ_SH_STRTAB), /* sh_link */ 82130927Sobrien htole32(1), /* sh_info */ 83130927Sobrien htole32(4), /* sh_addralign */ 84130927Sobrien htole32(sizeof(Elf32_Sym)) /* sh_entsize */ 8548905Srnordier }, 8648905Srnordier { 87130927Sobrien htole32(offsetof(struct kgz_shstrtab, shstrtab)), /* sh_name */ 88130927Sobrien htole32(SHT_STRTAB), /* sh_type */ 8948905Srnordier 0, /* sh_flags */ 9048905Srnordier 0, /* sh_addr */ 91130927Sobrien htole32(offsetof(struct kgz_elfhdr, shstrtab)), /* sh_offset */ 92130927Sobrien htole32(sizeof(struct kgz_shstrtab)), /* sh_size */ 93130927Sobrien htole32(SHN_UNDEF), /* sh_link */ 9448905Srnordier 0, /* sh_info */ 95130927Sobrien htole32(1), /* sh_addralign */ 9648905Srnordier 0 /* sh_entsize */ 9748905Srnordier }, 9848905Srnordier { 99130927Sobrien htole32(offsetof(struct kgz_shstrtab, strtab)), /* sh_name */ 100130927Sobrien htole32(SHT_STRTAB), /* sh_type */ 10148905Srnordier 0, /* sh_flags */ 10248905Srnordier 0, /* sh_addr */ 103130927Sobrien htole32(offsetof(struct kgz_elfhdr, strtab)), /* sh_offset */ 104130927Sobrien htole32(sizeof(struct kgz_strtab)), /* sh_size */ 105130927Sobrien htole32(SHN_UNDEF), /* sh_link */ 10648905Srnordier 0, /* sh_info */ 107130927Sobrien htole32(1), /* sh_addralign */ 10848905Srnordier 0 /* sh_entsize */ 10948905Srnordier }, 11048905Srnordier { 111130927Sobrien htole32(offsetof(struct kgz_shstrtab, data)), /* sh_name */ 112130927Sobrien htole32(SHT_PROGBITS), /* sh_type */ 113130927Sobrien htole32(SHF_ALLOC | SHF_WRITE), /* sh_flags */ 11448905Srnordier 0, /* sh_addr */ 115130927Sobrien htole32(sizeof(struct kgz_elfhdr)), /* sh_offset */ 116130927Sobrien htole32(sizeof(struct kgz_hdr) + KGZ_FIX_NSIZE), /* sh_size */ 117130927Sobrien htole32(SHN_UNDEF), /* sh_link */ 11848905Srnordier 0, /* sh_info */ 119130927Sobrien htole32(4), /* sh_addralign */ 12048905Srnordier 0 /* sh_entsize */ 12148905Srnordier } 12248905Srnordier }, 12348905Srnordier /* Symbol table */ 12448905Srnordier { 12548905Srnordier { 12648905Srnordier 0, /* st_name */ 12748905Srnordier 0, /* st_value */ 12848905Srnordier 0, /* st_size */ 12948905Srnordier 0, /* st_info */ 13048905Srnordier 0, /* st_other */ 131130927Sobrien htole16(SHN_UNDEF) /* st_shndx */ 13248905Srnordier }, 13348905Srnordier { 134130927Sobrien htole32(offsetof(struct kgz_strtab, kgz)), /* st_name */ 13548905Srnordier 0, /* st_value */ 136130927Sobrien htole32(sizeof(struct kgz_hdr)), /* st_size */ 13748905Srnordier ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT), /* st_info */ 13848905Srnordier 0, /* st_other */ 139130927Sobrien htole16(KGZ_SH_DATA) /* st_shndx */ 14048905Srnordier }, 14148905Srnordier { 142130927Sobrien htole32(offsetof(struct kgz_strtab, kgz_ndata)), /* st_name */ 143130927Sobrien htole32(sizeof(struct kgz_hdr)), /* st_value */ 144130927Sobrien htole32(KGZ_FIX_NSIZE), /* st_size */ 14548905Srnordier ELF32_ST_INFO(STB_GLOBAL, STT_OBJECT), /* st_info */ 14648905Srnordier 0, /* st_other */ 147130927Sobrien htole16(KGZ_SH_DATA) /* st_shndx */ 14848905Srnordier } 14948905Srnordier }, 15048905Srnordier /* Section header string table */ 15148905Srnordier { 15248905Srnordier KGZ_SHSTR_ZERO, /* zero */ 15348905Srnordier KGZ_SHSTR_SYMTAB, /* symtab */ 15448905Srnordier KGZ_SHSTR_SHSTRTAB, /* shstrtab */ 15548905Srnordier KGZ_SHSTR_STRTAB, /* strtab */ 15648905Srnordier KGZ_SHSTR_DATA /* data */ 15748905Srnordier }, 15848905Srnordier /* String table */ 15948905Srnordier { 16048905Srnordier KGZ_STR_ZERO, /* zero */ 16148905Srnordier KGZ_STR_KGZ, /* kgz */ 16248905Srnordier KGZ_STR_KGZ_NDATA /* kgz_ndata */ 16348905Srnordier } 16448905Srnordier}; 165