elf.h (3fa04ecd72780da31ba8b329e148179bc24a9c7d) | elf.h (1fcccbac89f5bbc5e41aa72086960059fce372da) |
---|---|
1#ifndef _ASM_IA64_ELF_H 2#define _ASM_IA64_ELF_H 3 4/* 5 * ELF-specific definitions. 6 * 7 * Copyright (C) 1998-1999, 2002-2004 Hewlett-Packard Co 8 * David Mosberger-Tang <davidm@hpl.hp.com> --- 205 unchanged lines hidden (view full) --- 214/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ 215#define ARCH_DLINFO \ 216do { \ 217 extern char __kernel_syscall_via_epc[]; \ 218 NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc); \ 219 NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \ 220} while (0) 221 | 1#ifndef _ASM_IA64_ELF_H 2#define _ASM_IA64_ELF_H 3 4/* 5 * ELF-specific definitions. 6 * 7 * Copyright (C) 1998-1999, 2002-2004 Hewlett-Packard Co 8 * David Mosberger-Tang <davidm@hpl.hp.com> --- 205 unchanged lines hidden (view full) --- 214/* update AT_VECTOR_SIZE_ARCH if the number of NEW_AUX_ENT entries changes */ 215#define ARCH_DLINFO \ 216do { \ 217 extern char __kernel_syscall_via_epc[]; \ 218 NEW_AUX_ENT(AT_SYSINFO, (unsigned long) __kernel_syscall_via_epc); \ 219 NEW_AUX_ENT(AT_SYSINFO_EHDR, (unsigned long) GATE_EHDR); \ 220} while (0) 221 |
222 | |
223/* | 222/* |
224 * These macros parameterize elf_core_dump in fs/binfmt_elf.c to write out 225 * extra segments containing the gate DSO contents. Dumping its 226 * contents makes post-mortem fully interpretable later without matching up 227 * the same kernel and hardware config to see what PC values meant. 228 * Dumping its extra ELF program headers includes all the other information 229 * a debugger needs to easily find how the gate DSO was being used. 230 */ 231#define ELF_CORE_EXTRA_PHDRS (GATE_EHDR->e_phnum) 232#define ELF_CORE_WRITE_EXTRA_PHDRS \ 233do { \ 234 const struct elf_phdr *const gate_phdrs = \ 235 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); \ 236 int i; \ 237 Elf64_Off ofs = 0; \ 238 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { \ 239 struct elf_phdr phdr = gate_phdrs[i]; \ 240 if (phdr.p_type == PT_LOAD) { \ 241 phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz); \ 242 phdr.p_filesz = phdr.p_memsz; \ 243 if (ofs == 0) { \ 244 ofs = phdr.p_offset = offset; \ 245 offset += phdr.p_filesz; \ 246 } \ 247 else \ 248 phdr.p_offset = ofs; \ 249 } \ 250 else \ 251 phdr.p_offset += ofs; \ 252 phdr.p_paddr = 0; /* match other core phdrs */ \ 253 DUMP_WRITE(&phdr, sizeof(phdr)); \ 254 } \ 255} while (0) 256#define ELF_CORE_WRITE_EXTRA_DATA \ 257do { \ 258 const struct elf_phdr *const gate_phdrs = \ 259 (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff); \ 260 int i; \ 261 for (i = 0; i < GATE_EHDR->e_phnum; ++i) { \ 262 if (gate_phdrs[i].p_type == PT_LOAD) { \ 263 DUMP_WRITE((void *) gate_phdrs[i].p_vaddr, \ 264 PAGE_ALIGN(gate_phdrs[i].p_memsz)); \ 265 break; \ 266 } \ 267 } \ 268} while (0) 269 270/* | |
271 * format for entries in the Global Offset Table 272 */ 273struct got_entry { 274 uint64_t val; 275}; 276 277/* 278 * Layout of the Function Descriptor 279 */ 280struct fdesc { 281 uint64_t ip; 282 uint64_t gp; 283}; 284 285#endif /* _ASM_IA64_ELF_H */ | 223 * format for entries in the Global Offset Table 224 */ 225struct got_entry { 226 uint64_t val; 227}; 228 229/* 230 * Layout of the Function Descriptor 231 */ 232struct fdesc { 233 uint64_t ip; 234 uint64_t gp; 235}; 236 237#endif /* _ASM_IA64_ELF_H */ |