elfcore.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include <linux/elf.h>
  3. #include <linux/coredump.h>
  4. #include <linux/fs.h>
  5. #include <linux/mm.h>
  6. #include <asm/elf.h>
  7. Elf32_Half elf_core_extra_phdrs(void)
  8. {
  9. return vsyscall_ehdr ? (((struct elfhdr *)vsyscall_ehdr)->e_phnum) : 0;
  10. }
  11. int elf_core_write_extra_phdrs(struct coredump_params *cprm, loff_t offset)
  12. {
  13. if ( vsyscall_ehdr ) {
  14. const struct elfhdr *const ehdrp =
  15. (struct elfhdr *) vsyscall_ehdr;
  16. const struct elf_phdr *const phdrp =
  17. (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  18. int i;
  19. Elf32_Off ofs = 0;
  20. for (i = 0; i < ehdrp->e_phnum; ++i) {
  21. struct elf_phdr phdr = phdrp[i];
  22. if (phdr.p_type == PT_LOAD) {
  23. ofs = phdr.p_offset = offset;
  24. offset += phdr.p_filesz;
  25. } else {
  26. phdr.p_offset += ofs;
  27. }
  28. phdr.p_paddr = 0; /* match other core phdrs */
  29. if (!dump_emit(cprm, &phdr, sizeof(phdr)))
  30. return 0;
  31. }
  32. }
  33. return 1;
  34. }
  35. int elf_core_write_extra_data(struct coredump_params *cprm)
  36. {
  37. if ( vsyscall_ehdr ) {
  38. const struct elfhdr *const ehdrp =
  39. (struct elfhdr *) vsyscall_ehdr;
  40. const struct elf_phdr *const phdrp =
  41. (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  42. int i;
  43. for (i = 0; i < ehdrp->e_phnum; ++i) {
  44. if (phdrp[i].p_type == PT_LOAD) {
  45. void *addr = (void *) phdrp[i].p_vaddr;
  46. size_t filesz = phdrp[i].p_filesz;
  47. if (!dump_emit(cprm, addr, filesz))
  48. return 0;
  49. }
  50. }
  51. }
  52. return 1;
  53. }
  54. size_t elf_core_extra_data_size(void)
  55. {
  56. if ( vsyscall_ehdr ) {
  57. const struct elfhdr *const ehdrp =
  58. (struct elfhdr *)vsyscall_ehdr;
  59. const struct elf_phdr *const phdrp =
  60. (const struct elf_phdr *) (vsyscall_ehdr + ehdrp->e_phoff);
  61. int i;
  62. for (i = 0; i < ehdrp->e_phnum; ++i)
  63. if (phdrp[i].p_type == PT_LOAD)
  64. return (size_t) phdrp[i].p_filesz;
  65. }
  66. return 0;
  67. }