1*53ee8cc1Swenshuai.xi /* elf-fdpic.h: FDPIC ELF load map 2*53ee8cc1Swenshuai.xi * 3*53ee8cc1Swenshuai.xi * Copyright (C) 2003 Red Hat, Inc. All Rights Reserved. 4*53ee8cc1Swenshuai.xi * Written by David Howells (dhowells@redhat.com) 5*53ee8cc1Swenshuai.xi * 6*53ee8cc1Swenshuai.xi * This program is free software; you can redistribute it and/or 7*53ee8cc1Swenshuai.xi * modify it under the terms of the GNU General Public License 8*53ee8cc1Swenshuai.xi * as published by the Free Software Foundation; either version 9*53ee8cc1Swenshuai.xi * 2 of the License, or (at your option) any later version. 10*53ee8cc1Swenshuai.xi */ 11*53ee8cc1Swenshuai.xi 12*53ee8cc1Swenshuai.xi #ifndef _LINUX_ELF_FDPIC_H 13*53ee8cc1Swenshuai.xi #define _LINUX_ELF_FDPIC_H 14*53ee8cc1Swenshuai.xi 15*53ee8cc1Swenshuai.xi #include <linux/elf.h> 16*53ee8cc1Swenshuai.xi 17*53ee8cc1Swenshuai.xi #define PT_GNU_STACK (PT_LOOS + 0x474e551) 18*53ee8cc1Swenshuai.xi 19*53ee8cc1Swenshuai.xi /* segment mappings for ELF FDPIC libraries/executables/interpreters */ 20*53ee8cc1Swenshuai.xi struct elf32_fdpic_loadseg { 21*53ee8cc1Swenshuai.xi Elf32_Addr addr; /* core address to which mapped */ 22*53ee8cc1Swenshuai.xi Elf32_Addr p_vaddr; /* VMA recorded in file */ 23*53ee8cc1Swenshuai.xi Elf32_Word p_memsz; /* allocation size recorded in file */ 24*53ee8cc1Swenshuai.xi }; 25*53ee8cc1Swenshuai.xi 26*53ee8cc1Swenshuai.xi struct elf32_fdpic_loadmap { 27*53ee8cc1Swenshuai.xi Elf32_Half version; /* version of these structures, just in case... */ 28*53ee8cc1Swenshuai.xi Elf32_Half nsegs; /* number of segments */ 29*53ee8cc1Swenshuai.xi struct elf32_fdpic_loadseg segs[]; 30*53ee8cc1Swenshuai.xi }; 31*53ee8cc1Swenshuai.xi 32*53ee8cc1Swenshuai.xi #define ELF32_FDPIC_LOADMAP_VERSION 0x0000 33*53ee8cc1Swenshuai.xi 34*53ee8cc1Swenshuai.xi /* 35*53ee8cc1Swenshuai.xi * binfmt binary parameters structure 36*53ee8cc1Swenshuai.xi */ 37*53ee8cc1Swenshuai.xi struct elf_fdpic_params { 38*53ee8cc1Swenshuai.xi struct elfhdr hdr; /* ref copy of ELF header */ 39*53ee8cc1Swenshuai.xi struct elf_phdr *phdrs; /* ref copy of PT_PHDR table */ 40*53ee8cc1Swenshuai.xi struct elf32_fdpic_loadmap *loadmap; /* loadmap to be passed to userspace */ 41*53ee8cc1Swenshuai.xi unsigned long elfhdr_addr; /* mapped ELF header user address */ 42*53ee8cc1Swenshuai.xi unsigned long ph_addr; /* mapped PT_PHDR user address */ 43*53ee8cc1Swenshuai.xi unsigned long map_addr; /* mapped loadmap user address */ 44*53ee8cc1Swenshuai.xi unsigned long entry_addr; /* mapped entry user address */ 45*53ee8cc1Swenshuai.xi unsigned long stack_size; /* stack size requested (PT_GNU_STACK) */ 46*53ee8cc1Swenshuai.xi unsigned long dynamic_addr; /* mapped PT_DYNAMIC user address */ 47*53ee8cc1Swenshuai.xi unsigned long load_addr; /* user address at which to map binary */ 48*53ee8cc1Swenshuai.xi unsigned long flags; 49*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_ARRANGEMENT 0x0000000f /* PT_LOAD arrangement flags */ 50*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_INDEPENDENT 0x00000000 /* PT_LOADs can be put anywhere */ 51*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_HONOURVADDR 0x00000001 /* PT_LOAD.vaddr must be honoured */ 52*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_CONSTDISP 0x00000002 /* PT_LOADs require constant 53*53ee8cc1Swenshuai.xi * displacement */ 54*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_CONTIGUOUS 0x00000003 /* PT_LOADs should be contiguous */ 55*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_EXEC_STACK 0x00000010 /* T if stack to be executable */ 56*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_NOEXEC_STACK 0x00000020 /* T if stack not to be executable */ 57*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_EXECUTABLE 0x00000040 /* T if this object is the executable */ 58*53ee8cc1Swenshuai.xi #define ELF_FDPIC_FLAG_PRESENT 0x80000000 /* T if this object is present */ 59*53ee8cc1Swenshuai.xi }; 60*53ee8cc1Swenshuai.xi 61*53ee8cc1Swenshuai.xi #ifdef CONFIG_MMU 62*53ee8cc1Swenshuai.xi extern void elf_fdpic_arch_lay_out_mm(struct elf_fdpic_params *exec_params, 63*53ee8cc1Swenshuai.xi struct elf_fdpic_params *interp_params, 64*53ee8cc1Swenshuai.xi unsigned long *start_stack, 65*53ee8cc1Swenshuai.xi unsigned long *start_brk); 66*53ee8cc1Swenshuai.xi #endif 67*53ee8cc1Swenshuai.xi 68*53ee8cc1Swenshuai.xi #endif /* _LINUX_ELF_FDPIC_H */ 69