elfcore.c 1.8 KB

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