1 // SPDX-License-Identifier: GPL-2.0
3 #include <linux/coredump.h>
10 Elf32_Half
elf_core_extra_phdrs(void)
12 return vsyscall_ehdr
? (((struct elfhdr
*)vsyscall_ehdr
)->e_phnum
) : 0;
15 int elf_core_write_extra_phdrs(struct coredump_params
*cprm
, loff_t offset
)
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
);
25 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
) {
26 struct elf_phdr phdr
= phdrp
[i
];
28 if (phdr
.p_type
== PT_LOAD
) {
29 ofs
= phdr
.p_offset
= offset
;
30 offset
+= phdr
.p_filesz
;
34 phdr
.p_paddr
= 0; /* match other core phdrs */
35 if (!dump_emit(cprm
, &phdr
, sizeof(phdr
)))
42 int elf_core_write_extra_data(struct coredump_params
*cprm
)
44 if ( vsyscall_ehdr
) {
45 const struct elfhdr
*const ehdrp
=
46 (struct elfhdr
*) vsyscall_ehdr
;
47 const struct elf_phdr
*const phdrp
=
48 (const struct elf_phdr
*) (vsyscall_ehdr
+ ehdrp
->e_phoff
);
51 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
) {
52 if (phdrp
[i
].p_type
== PT_LOAD
) {
53 void *addr
= (void *) phdrp
[i
].p_vaddr
;
54 size_t filesz
= phdrp
[i
].p_filesz
;
55 if (!dump_emit(cprm
, addr
, filesz
))
63 size_t elf_core_extra_data_size(void)
65 if ( vsyscall_ehdr
) {
66 const struct elfhdr
*const ehdrp
=
67 (struct elfhdr
*)vsyscall_ehdr
;
68 const struct elf_phdr
*const phdrp
=
69 (const struct elf_phdr
*) (vsyscall_ehdr
+ ehdrp
->e_phoff
);
72 for (i
= 0; i
< ehdrp
->e_phnum
; ++i
)
73 if (phdrp
[i
].p_type
== PT_LOAD
)
74 return (size_t) phdrp
[i
].p_filesz
;