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 file *file, loff_t offset, size_t *size,
  15                               unsigned long limit)
  16{
  17        if ( vsyscall_ehdr ) {
  18                const struct elfhdr *const ehdrp =
  19                        (struct elfhdr *) vsyscall_ehdr;
  20                const struct elf_phdr *const phdrp =
  21                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  22                int i;
  23                Elf32_Off ofs = 0;
  24
  25                for (i = 0; i < ehdrp->e_phnum; ++i) {
  26                        struct elf_phdr phdr = phdrp[i];
  27
  28                        if (phdr.p_type == PT_LOAD) {
  29                                ofs = phdr.p_offset = offset;
  30                                offset += phdr.p_filesz;
  31                        } else {
  32                                phdr.p_offset += ofs;
  33                        }
  34                        phdr.p_paddr = 0; /* match other core phdrs */
  35                        *size += sizeof(phdr);
  36                        if (*size > limit
  37                            || !dump_write(file, &phdr, sizeof(phdr)))
  38                                return 0;
  39                }
  40        }
  41        return 1;
  42}
  43
  44int elf_core_write_extra_data(struct file *file, size_t *size,
  45                              unsigned long limit)
  46{
  47        if ( vsyscall_ehdr ) {
  48                const struct elfhdr *const ehdrp =
  49                        (struct elfhdr *) vsyscall_ehdr;
  50                const struct elf_phdr *const phdrp =
  51                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  52                int i;
  53
  54                for (i = 0; i < ehdrp->e_phnum; ++i) {
  55                        if (phdrp[i].p_type == PT_LOAD) {
  56                                void *addr = (void *) phdrp[i].p_vaddr;
  57                                size_t filesz = phdrp[i].p_filesz;
  58
  59                                *size += filesz;
  60                                if (*size > limit
  61                                    || !dump_write(file, addr, filesz))
  62                                        return 0;
  63                        }
  64                }
  65        }
  66        return 1;
  67}
  68
  69size_t elf_core_extra_data_size(void)
  70{
  71        if ( vsyscall_ehdr ) {
  72                const struct elfhdr *const ehdrp =
  73                        (struct elfhdr *)vsyscall_ehdr;
  74                const struct elf_phdr *const phdrp =
  75                        (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  76                int i;
  77
  78                for (i = 0; i < ehdrp->e_phnum; ++i)
  79                        if (phdrp[i].p_type == PT_LOAD)
  80                                return (size_t) phdrp[i].p_filesz;
  81        }
  82        return 0;
  83}
  84