linux/arch/x86/um/elfcore.c
<<
>>
Prefs
   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
   9Elf32_Half elf_core_extra_phdrs(void)
  10{
  11        return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0;
  12}
  13
  14int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
  15{
  16        if ( vsyscall_ehdr ) {
  17                const struct elfhdr *const ehdrp =
  18                        (struct elfhdr *) vsyscall_ehdr;
  19                const struct elf_phdr *const phdrp =
  20                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  21                int i;
  22                Elf32_Off ofs = 0;
  23
  24                for (i = 0; i < ehdrp->e_phnum; ++i) {
  25                        struct elf_phdr phdr = phdrp[i];
  26
  27                        if (phdr.p_type == PT_LOAD) {
  28                                ofs = phdr.p_offset = offset;
  29                                offset += phdr.p_filesz;
  30                        } else {
  31                                phdr.p_offset += ofs;
  32                        }
  33                        phdr.p_paddr = 0; /* match other core phdrs */
  34                        if (!dump_emit(cprm, &phdr, sizeof(phdr)))
  35                                return 0;
  36                }
  37        }
  38        return 1;
  39}
  40
  41int elf_core_write_extra_data(struct coredump_params *cprm)
  42{
  43        if ( vsyscall_ehdr ) {
  44                const struct elfhdr *const ehdrp =
  45                        (struct elfhdr *) vsyscall_ehdr;
  46                const struct elf_phdr *const phdrp =
  47                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  48                int i;
  49
  50                for (i = 0; i < ehdrp->e_phnum; ++i) {
  51                        if (phdrp[i].p_type == PT_LOAD) {
  52                                void *addr = (void *) phdrp[i].p_vaddr;
  53                                size_t filesz = phdrp[i].p_filesz;
  54                                if (!dump_emit(cprm, addr, filesz))
  55                                        return 0;
  56                        }
  57                }
  58        }
  59        return 1;
  60}
  61
  62size_t elf_core_extra_data_size(void)
  63{
  64        if ( vsyscall_ehdr ) {
  65                const struct elfhdr *const ehdrp =
  66                        (struct elfhdr *)vsyscall_ehdr;
  67                const struct elf_phdr *const phdrp =
  68                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  69                int i;
  70
  71                for (i = 0; i < ehdrp->e_phnum; ++i)
  72                        if (phdrp[i].p_type == PT_LOAD)
  73                                return (size_t) phdrp[i].p_filesz;
  74        }
  75        return 0;
  76}
  77