1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/elfcore.h>
4 #include <linux/coredump.h>
11 Elf32_Half
elf_core_extra_phdrs(struct coredump_params
*cprm
)
13 return vsyscall_ehdr
? (((struct elfhdr
*)vsyscall_ehdr
)->e_phnum
) : 0;
16 int elf_core_write_extra_phdrs(struct coredump_params
*cprm
, loff_t offset
)
18 if ( vsyscall_ehdr
) {
19 const struct elfhdr
*const ehdrp
=
20 (struct elfhdr
*) vsyscall_ehdr
;
21 const struct elf_phdr
*const phdrp
=
22 (const struct elf_phdr
*) (vsyscall_ehdr
+ ehdrp
->e_phoff
);
26 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
) {
27 struct elf_phdr phdr
= phdrp
[i
];
29 if (phdr
.p_type
== PT_LOAD
) {
30 ofs
= phdr
.p_offset
= offset
;
31 offset
+= phdr
.p_filesz
;
35 phdr
.p_paddr
= 0; /* match other core phdrs */
36 if (!dump_emit(cprm
, &phdr
, sizeof(phdr
)))
43 int elf_core_write_extra_data(struct coredump_params
*cprm
)
45 if ( vsyscall_ehdr
) {
46 const struct elfhdr
*const ehdrp
=
47 (struct elfhdr
*) vsyscall_ehdr
;
48 const struct elf_phdr
*const phdrp
=
49 (const struct elf_phdr
*) (vsyscall_ehdr
+ ehdrp
->e_phoff
);
52 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
) {
53 if (phdrp
[i
].p_type
== PT_LOAD
) {
54 void *addr
= (void *) phdrp
[i
].p_vaddr
;
55 size_t filesz
= phdrp
[i
].p_filesz
;
56 if (!dump_emit(cprm
, addr
, filesz
))
64 size_t elf_core_extra_data_size(struct coredump_params
*cprm
)
66 if ( vsyscall_ehdr
) {
67 const struct elfhdr
*const ehdrp
=
68 (struct elfhdr
*)vsyscall_ehdr
;
69 const struct elf_phdr
*const phdrp
=
70 (const struct elf_phdr
*) (vsyscall_ehdr
+ ehdrp
->e_phoff
);
73 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
)
74 if (phdrp
[i
].p_type
== PT_LOAD
)
75 return (size_t) phdrp
[i
].p_filesz
;