0001-Add-MIPS-gnu-hash-support.patch 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. From 05240e13668422c4f9118f2cde953ec875d0d68f Mon Sep 17 00:00:00 2001
  2. From: Khem Raj <raj.khem@gmail.com>
  3. Date: Tue, 14 Jan 2020 01:37:22 -0800
  4. Subject: [PATCH] Add MIPS gnu hash support
  5. Upstream-Status: Pending
  6. Signed-off-by: Khem Raj <raj.khem@gmail.com>
  7. ---
  8. src/arch-mips.c | 1 +
  9. src/prelink.c | 1 +
  10. src/prelink.h | 5 +++++
  11. 3 files changed, 7 insertions(+)
  12. --- a/src/arch-mips.c
  13. +++ b/src/arch-mips.c
  14. @@ -324,6 +324,7 @@ mips_adjust_dyn (DSO *dso, int n, GElf_D
  15. case DT_MIPS_BASE_ADDRESS:
  16. case DT_MIPS_RLD_MAP:
  17. case DT_MIPS_OPTIONS:
  18. + case DT_MIPS_XHASH:
  19. if (dyn->d_un.d_ptr >= start)
  20. dyn->d_un.d_ptr += adjust;
  21. return 1;
  22. --- a/src/prelink.c
  23. +++ b/src/prelink.c
  24. @@ -425,6 +425,7 @@ prelink_prepare (DSO *dso)
  25. {
  26. case SHT_HASH:
  27. case SHT_GNU_HASH:
  28. + case SHT_MIPS_XHASH:
  29. case SHT_DYNSYM:
  30. case SHT_REL:
  31. case SHT_RELA:
  32. --- a/src/prelink.h
  33. +++ b/src/prelink.h
  34. @@ -114,6 +114,11 @@ typedef uint8_t Elf64_Byte;
  35. #define SHT_MIPS_ABIFLAGS 0x7000002a
  36. #endif
  37. +#ifndef SHT_MIPS_XHASH
  38. +#define DT_MIPS_XHASH 0x70000036
  39. +#define SHT_MIPS_XHASH 0x7000002b
  40. +#endif
  41. +
  42. #ifndef RSS_UNDEF
  43. #define RSS_UNDEF 0
  44. #endif
  45. --- a/src/dso.c
  46. +++ b/src/dso.c
  47. @@ -109,6 +109,11 @@ read_dynamic (DSO *dso)
  48. dso->info_DT_GNU_HASH = dyn.d_un.d_val;
  49. dso->info_set_mask |= (1ULL << DT_GNU_HASH_BIT);
  50. }
  51. + else if (dyn.d_tag == DT_MIPS_XHASH)
  52. + {
  53. + dso->info_DT_GNU_HASH = dyn.d_un.d_val;
  54. + dso->info_set_mask |= (1ULL << DT_GNU_HASH_BIT);
  55. + }
  56. else if (dyn.d_tag == DT_TLSDESC_PLT)
  57. {
  58. dso->info_DT_TLSDESC_PLT = dyn.d_un.d_val;
  59. @@ -1463,6 +1468,7 @@ adjust_dso (DSO *dso, GElf_Addr start, G
  60. break;
  61. case SHT_HASH:
  62. case SHT_GNU_HASH:
  63. + case SHT_MIPS_XHASH:
  64. case SHT_NOBITS:
  65. case SHT_STRTAB:
  66. break;
  67. --- a/src/space.c
  68. +++ b/src/space.c
  69. @@ -61,6 +61,7 @@ print_sections (DSO *dso, GElf_Ehdr *ehd
  70. { SHT_GNU_versym, "VERSYM" },
  71. { SHT_GNU_LIBLIST, "LIBLIST" },
  72. { SHT_GNU_HASH, "GNU_HASH" },
  73. + { SHT_MIPS_XHASH, "MIPS_XHASH" },
  74. { 0, NULL }
  75. };
  76. @@ -183,6 +184,7 @@ readonly_is_movable (DSO *dso, GElf_Ehdr
  77. {
  78. case SHT_HASH:
  79. case SHT_GNU_HASH:
  80. + case SHT_MIPS_XHASH:
  81. case SHT_DYNSYM:
  82. case SHT_REL:
  83. case SHT_RELA:
  84. @@ -558,6 +560,7 @@ find_readonly_space (DSO *dso, GElf_Shdr
  85. {
  86. case SHT_HASH:
  87. case SHT_GNU_HASH:
  88. + case SHT_MIPS_XHASH:
  89. case SHT_DYNSYM:
  90. case SHT_STRTAB:
  91. case SHT_GNU_verdef:
  92. --- a/src/exec.c
  93. +++ b/src/exec.c
  94. @@ -65,7 +65,11 @@ update_dynamic_tags (DSO *dso, GElf_Shdr
  95. || (dynamic_info_is_set (dso, DT_GNU_HASH_BIT)
  96. && dso->info_DT_GNU_HASH == old_shdr[j].sh_addr
  97. && old_shdr[j].sh_type == SHT_GNU_HASH
  98. - && set_dynamic (dso, DT_GNU_HASH, shdr[i].sh_addr, 1)))
  99. + && set_dynamic (dso, DT_GNU_HASH, shdr[i].sh_addr, 1))
  100. + || (dynamic_info_is_set (dso, DT_GNU_HASH_BIT)
  101. + && dso->info_DT_GNU_HASH == old_shdr[j].sh_addr
  102. + && old_shdr[j].sh_type == SHT_MIPS_XHASH
  103. + && set_dynamic (dso, DT_MIPS_XHASH, shdr[i].sh_addr, 1)))
  104. return 1;
  105. }