From 05240e13668422c4f9118f2cde953ec875d0d68f Mon Sep 17 00:00:00 2001 From: Khem Raj Date: Tue, 14 Jan 2020 01:37:22 -0800 Subject: [PATCH] Add MIPS gnu hash support Upstream-Status: Pending Signed-off-by: Khem Raj --- src/arch-mips.c | 1 + src/prelink.c | 1 + src/prelink.h | 5 +++++ 3 files changed, 7 insertions(+) --- a/src/arch-mips.c +++ b/src/arch-mips.c @@ -324,6 +324,7 @@ mips_adjust_dyn (DSO *dso, int n, GElf_D case DT_MIPS_BASE_ADDRESS: case DT_MIPS_RLD_MAP: case DT_MIPS_OPTIONS: + case DT_MIPS_XHASH: if (dyn->d_un.d_ptr >= start) dyn->d_un.d_ptr += adjust; return 1; --- a/src/prelink.c +++ b/src/prelink.c @@ -425,6 +425,7 @@ prelink_prepare (DSO *dso) { case SHT_HASH: case SHT_GNU_HASH: + case SHT_MIPS_XHASH: case SHT_DYNSYM: case SHT_REL: case SHT_RELA: --- a/src/prelink.h +++ b/src/prelink.h @@ -114,6 +114,11 @@ typedef uint8_t Elf64_Byte; #define SHT_MIPS_ABIFLAGS 0x7000002a #endif +#ifndef SHT_MIPS_XHASH +#define DT_MIPS_XHASH 0x70000036 +#define SHT_MIPS_XHASH 0x7000002b +#endif + #ifndef RSS_UNDEF #define RSS_UNDEF 0 #endif --- a/src/dso.c +++ b/src/dso.c @@ -109,6 +109,11 @@ read_dynamic (DSO *dso) dso->info_DT_GNU_HASH = dyn.d_un.d_val; dso->info_set_mask |= (1ULL << DT_GNU_HASH_BIT); } + else if (dyn.d_tag == DT_MIPS_XHASH) + { + dso->info_DT_GNU_HASH = dyn.d_un.d_val; + dso->info_set_mask |= (1ULL << DT_GNU_HASH_BIT); + } else if (dyn.d_tag == DT_TLSDESC_PLT) { dso->info_DT_TLSDESC_PLT = dyn.d_un.d_val; @@ -1463,6 +1468,7 @@ adjust_dso (DSO *dso, GElf_Addr start, G break; case SHT_HASH: case SHT_GNU_HASH: + case SHT_MIPS_XHASH: case SHT_NOBITS: case SHT_STRTAB: break; --- a/src/space.c +++ b/src/space.c @@ -61,6 +61,7 @@ print_sections (DSO *dso, GElf_Ehdr *ehd { SHT_GNU_versym, "VERSYM" }, { SHT_GNU_LIBLIST, "LIBLIST" }, { SHT_GNU_HASH, "GNU_HASH" }, + { SHT_MIPS_XHASH, "MIPS_XHASH" }, { 0, NULL } }; @@ -183,6 +184,7 @@ readonly_is_movable (DSO *dso, GElf_Ehdr { case SHT_HASH: case SHT_GNU_HASH: + case SHT_MIPS_XHASH: case SHT_DYNSYM: case SHT_REL: case SHT_RELA: @@ -558,6 +560,7 @@ find_readonly_space (DSO *dso, GElf_Shdr { case SHT_HASH: case SHT_GNU_HASH: + case SHT_MIPS_XHASH: case SHT_DYNSYM: case SHT_STRTAB: case SHT_GNU_verdef: --- a/src/exec.c +++ b/src/exec.c @@ -65,7 +65,11 @@ update_dynamic_tags (DSO *dso, GElf_Shdr || (dynamic_info_is_set (dso, DT_GNU_HASH_BIT) && dso->info_DT_GNU_HASH == old_shdr[j].sh_addr && old_shdr[j].sh_type == SHT_GNU_HASH - && set_dynamic (dso, DT_GNU_HASH, shdr[i].sh_addr, 1))) + && set_dynamic (dso, DT_GNU_HASH, shdr[i].sh_addr, 1)) + || (dynamic_info_is_set (dso, DT_GNU_HASH_BIT) + && dso->info_DT_GNU_HASH == old_shdr[j].sh_addr + && old_shdr[j].sh_type == SHT_MIPS_XHASH + && set_dynamic (dso, DT_MIPS_XHASH, shdr[i].sh_addr, 1))) return 1; }