diff options
| author | David S. Miller <davem@nuts.ninka.net> | 2003-05-02 20:13:59 -0700 |
|---|---|---|
| committer | David S. Miller <davem@nuts.ninka.net> | 2003-05-02 20:13:59 -0700 |
| commit | b5e556575fabe58f485a4610f30dc796b7d962e5 (patch) | |
| tree | 270eae824464e5f5b6f46cbeeedc21c5188411e4 /include | |
| parent | df5432ba285560e807afdf607643a7fadbf3727a (diff) | |
| parent | d9cfe75ae08655329f091a0c59d514ca6f3b46d5 (diff) | |
Merge nuts.ninka.net:/home/davem/src/BK/network-2.5
into nuts.ninka.net:/home/davem/src/BK/net-2.5
Diffstat (limited to 'include')
| -rw-r--r-- | include/asm-i386/elf.h | 55 | ||||
| -rw-r--r-- | include/linux/elf.h | 3 |
2 files changed, 51 insertions, 7 deletions
diff --git a/include/asm-i386/elf.h b/include/asm-i386/elf.h index 637838d7f85a..a87a45df75e2 100644 --- a/include/asm-i386/elf.h +++ b/include/asm-i386/elf.h @@ -101,7 +101,7 @@ typedef struct user_fxsr_struct elf_fpxregset_t; * for more of them, start the x86-specific ones at 32. */ #define AT_SYSINFO 32 -#define AT_SYSINFO_EH_FRAME 33 +#define AT_SYSINFO_EHDR 33 #ifdef __KERNEL__ #define SET_PERSONALITY(ex, ibcs2) set_personality((ibcs2)?PER_SVR4:PER_LINUX) @@ -119,15 +119,56 @@ extern void dump_smp_unlazy_fpu(void); #define ELF_CORE_SYNC dump_smp_unlazy_fpu #endif -/* Offset from the beginning of the page where the .eh_frame information - for the code in the vsyscall page starts. */ -#define EH_FRAME_OFFSET 96 +#define VSYSCALL_BASE (__fix_to_virt(FIX_VSYSCALL)) +#define VSYSCALL_EHDR ((const struct elfhdr *) VSYSCALL_BASE) +#define VSYSCALL_ENTRY ((unsigned long) &__kernel_vsyscall) +extern void __kernel_vsyscall; #define ARCH_DLINFO \ do { \ - NEW_AUX_ENT(AT_SYSINFO, 0xffffe000); \ - NEW_AUX_ENT(AT_SYSINFO_EH_FRAME, \ - 0xffffe000 + EH_FRAME_OFFSET); \ + NEW_AUX_ENT(AT_SYSINFO, VSYSCALL_ENTRY); \ + NEW_AUX_ENT(AT_SYSINFO_EHDR, VSYSCALL_BASE); \ +} while (0) + +/* + * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out + * extra segments containing the vsyscall DSO contents. Dumping its + * contents makes post-mortem fully interpretable later without matching up + * the same kernel and hardware config to see what PC values meant. + * Dumping its extra ELF program headers includes all the other information + * a debugger needs to easily find how the vsyscall DSO was being used. + */ +#define ELF_CORE_EXTRA_PHDRS (VSYSCALL_EHDR->e_phnum) +#define ELF_CORE_WRITE_EXTRA_PHDRS \ +do { \ + const struct elf_phdr *const vsyscall_phdrs = \ + (const struct elf_phdr *) (VSYSCALL_BASE \ + + VSYSCALL_EHDR->e_phoff); \ + int i; \ + Elf32_Off ofs = 0; \ + for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ + struct elf_phdr phdr = vsyscall_phdrs[i]; \ + if (phdr.p_type == PT_LOAD) { \ + ofs = phdr.p_offset = offset; \ + offset += phdr.p_filesz; \ + } \ + else \ + phdr.p_offset += ofs; \ + phdr.p_paddr = 0; /* match other core phdrs */ \ + DUMP_WRITE(&phdr, sizeof(phdr)); \ + } \ +} while (0) +#define ELF_CORE_WRITE_EXTRA_DATA \ +do { \ + const struct elf_phdr *const vsyscall_phdrs = \ + (const struct elf_phdr *) (VSYSCALL_BASE \ + + VSYSCALL_EHDR->e_phoff); \ + int i; \ + for (i = 0; i < VSYSCALL_EHDR->e_phnum; ++i) { \ + if (vsyscall_phdrs[i].p_type == PT_LOAD) \ + DUMP_WRITE((void *) vsyscall_phdrs[i].p_vaddr, \ + vsyscall_phdrs[i].p_filesz); \ + } \ } while (0) #endif diff --git a/include/linux/elf.h b/include/linux/elf.h index 0a7a35e2722b..fb03869f90a8 100644 --- a/include/linux/elf.h +++ b/include/linux/elf.h @@ -29,8 +29,11 @@ typedef __s64 Elf64_Sxword; #define PT_NOTE 4 #define PT_SHLIB 5 #define PT_PHDR 6 +#define PT_LOOS 0x60000000 +#define PT_HIOS 0x6fffffff #define PT_LOPROC 0x70000000 #define PT_HIPROC 0x7fffffff +#define PT_GNU_EH_FRAME 0x6474e550 #define PT_MIPS_REGINFO 0x70000000 /* Flags in the e_flags field of the header */ |
