152 lines
3.1 KiB
C
152 lines
3.1 KiB
C
/* Copyright 2013-2014 IBM Corp.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
* implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#ifndef __ELF_H
|
|
#define __ELF_H
|
|
|
|
#include <stdint.h>
|
|
|
|
/* Generic ELF header */
|
|
struct elf_hdr {
|
|
uint32_t ei_ident;
|
|
#define ELF_IDENT 0x7F454C46
|
|
uint8_t ei_class;
|
|
#define ELF_CLASS_32 1
|
|
#define ELF_CLASS_64 2
|
|
uint8_t ei_data;
|
|
#define ELF_DATA_LSB 1
|
|
#define ELF_DATA_MSB 2
|
|
uint8_t ei_version;
|
|
uint8_t ei_pad[9];
|
|
uint16_t e_type;
|
|
uint16_t e_machine;
|
|
#define ELF_MACH_PPC32 0x14
|
|
#define ELF_MACH_PPC64 0x15
|
|
uint32_t e_version;
|
|
};
|
|
|
|
/* 64-bit ELF header */
|
|
struct elf64_hdr {
|
|
uint32_t ei_ident;
|
|
uint8_t ei_class;
|
|
uint8_t ei_data;
|
|
uint8_t ei_version;
|
|
uint8_t ei_pad[9];
|
|
uint16_t e_type;
|
|
uint16_t e_machine;
|
|
uint32_t e_version;
|
|
uint64_t e_entry;
|
|
uint64_t e_phoff;
|
|
uint64_t e_shoff;
|
|
uint32_t e_flags;
|
|
uint16_t e_ehsize;
|
|
uint16_t e_phentsize;
|
|
uint16_t e_phnum;
|
|
uint16_t e_shentsize;
|
|
uint16_t e_shnum;
|
|
uint16_t e_shstrndx;
|
|
};
|
|
|
|
/* 64-bit ELF program header */
|
|
struct elf64_phdr {
|
|
uint32_t p_type;
|
|
#define ELF_PTYPE_LOAD 1
|
|
uint32_t p_flags;
|
|
#define ELF_PFLAGS_R 0x4
|
|
#define ELF_PFLAGS_W 0x2
|
|
#define ELF_PFLAGS_X 0x1
|
|
uint64_t p_offset;
|
|
uint64_t p_vaddr;
|
|
uint64_t p_paddr;
|
|
uint64_t p_filesz;
|
|
uint64_t p_memsz;
|
|
uint64_t p_align;
|
|
};
|
|
|
|
/* 64-bit ELF section header */
|
|
struct elf64_shdr {
|
|
uint32_t sh_name;
|
|
uint32_t sh_type;
|
|
uint64_t sh_flags;
|
|
#define ELF_SFLAGS_X 0x4
|
|
#define ELF_SFLAGS_A 0x2
|
|
#define ELF_SFLAGS_W 0x1
|
|
uint64_t sh_addr;
|
|
uint64_t sh_offset;
|
|
uint64_t sh_size;
|
|
uint32_t sh_link;
|
|
uint32_t sh_info;
|
|
uint64_t sh_addralign;
|
|
int64_t sh_entsize;
|
|
};
|
|
|
|
/* Some relocation related stuff used in relocate.c */
|
|
struct elf64_dyn {
|
|
int64_t d_tag;
|
|
#define DT_NULL 0
|
|
#define DT_RELA 7
|
|
#define DT_RELASZ 8
|
|
#define DT_RELAENT 9
|
|
#define DT_RELACOUNT 0x6ffffff9
|
|
uint64_t d_val;
|
|
};
|
|
|
|
struct elf64_rela {
|
|
uint64_t r_offset;
|
|
uint64_t r_info;
|
|
#define ELF64_R_TYPE(info) ((info) & 0xffffffffu)
|
|
int64_t r_addend;
|
|
};
|
|
|
|
/* relocs we support */
|
|
#define R_PPC64_RELATIVE 22
|
|
|
|
/* 32-bit ELF header */
|
|
struct elf32_hdr {
|
|
uint32_t ei_ident;
|
|
uint8_t ei_class;
|
|
uint8_t ei_data;
|
|
uint8_t ei_version;
|
|
uint8_t ei_pad[9];
|
|
uint16_t e_type;
|
|
uint16_t e_machine;
|
|
uint32_t e_version;
|
|
uint32_t e_entry;
|
|
uint32_t e_phoff;
|
|
uint32_t e_shoff;
|
|
uint32_t e_flags;
|
|
uint16_t e_ehsize;
|
|
uint16_t e_phentsize;
|
|
uint16_t e_phnum;
|
|
uint16_t e_shentsize;
|
|
uint16_t e_shnum;
|
|
uint16_t e_shstrndx;
|
|
};
|
|
|
|
/* 32-bit ELF program header*/
|
|
struct elf32_phdr {
|
|
uint32_t p_type;
|
|
uint32_t p_offset;
|
|
uint32_t p_vaddr;
|
|
uint32_t p_paddr;
|
|
uint32_t p_filesz;
|
|
uint32_t p_memsz;
|
|
uint32_t p_flags;
|
|
uint32_t p_align;
|
|
};
|
|
|
|
|
|
#endif /* __ELF_H */
|