Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
elfcore.c
Go to the documentation of this file.
1 #include <linux/elf.h>
2 #include <linux/coredump.h>
3 #include <linux/fs.h>
4 #include <linux/mm.h>
5 
6 #include <asm/elf.h>
7 
8 
10 {
11  return GATE_EHDR->e_phnum;
12 }
13 
14 int elf_core_write_extra_phdrs(struct file *file, loff_t offset, size_t *size,
15  unsigned long limit)
16 {
17  const struct elf_phdr *const gate_phdrs =
18  (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff);
19  int i;
20  Elf64_Off ofs = 0;
21 
22  for (i = 0; i < GATE_EHDR->e_phnum; ++i) {
23  struct elf_phdr phdr = gate_phdrs[i];
24 
25  if (phdr.p_type == PT_LOAD) {
26  phdr.p_memsz = PAGE_ALIGN(phdr.p_memsz);
27  phdr.p_filesz = phdr.p_memsz;
28  if (ofs == 0) {
29  ofs = phdr.p_offset = offset;
30  offset += phdr.p_filesz;
31  } else {
32  phdr.p_offset = ofs;
33  }
34  } else {
35  phdr.p_offset += ofs;
36  }
37  phdr.p_paddr = 0; /* match other core phdrs */
38  *size += sizeof(phdr);
39  if (*size > limit || !dump_write(file, &phdr, sizeof(phdr)))
40  return 0;
41  }
42  return 1;
43 }
44 
45 int elf_core_write_extra_data(struct file *file, size_t *size,
46  unsigned long limit)
47 {
48  const struct elf_phdr *const gate_phdrs =
49  (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff);
50  int i;
51 
52  for (i = 0; i < GATE_EHDR->e_phnum; ++i) {
53  if (gate_phdrs[i].p_type == PT_LOAD) {
54  void *addr = (void *)gate_phdrs[i].p_vaddr;
55  size_t memsz = PAGE_ALIGN(gate_phdrs[i].p_memsz);
56 
57  *size += memsz;
58  if (*size > limit || !dump_write(file, addr, memsz))
59  return 0;
60  break;
61  }
62  }
63  return 1;
64 }
65 
67 {
68  const struct elf_phdr *const gate_phdrs =
69  (const struct elf_phdr *) (GATE_ADDR + GATE_EHDR->e_phoff);
70  int i;
71  size_t size = 0;
72 
73  for (i = 0; i < GATE_EHDR->e_phnum; ++i) {
74  if (gate_phdrs[i].p_type == PT_LOAD) {
75  size += PAGE_ALIGN(gate_phdrs[i].p_memsz);
76  break;
77  }
78  }
79  return size;
80 }