--- prelink/src/prelink.h.jj 2006-06-20 15:12:16.000000000 +0200 +++ prelink/src/prelink.h 2006-06-27 21:50:11.000000000 +0200 @@ -44,6 +44,11 @@ #define SHT_GNU_LIBLIST 0x6ffffff7 #endif +#ifndef DT_GNU_HASH +#define DT_GNU_HASH 0x6ffffef5 +#define SHT_GNU_HASH 0x6ffffff6 +#endif + struct prelink_entry; struct prelink_info; struct PLArch; @@ -75,6 +80,7 @@ typedef struct GElf_Addr info_DT_GNU_PRELINKED; GElf_Addr info_DT_CHECKSUM; GElf_Addr info_DT_VERNEED, info_DT_VERDEF, info_DT_VERSYM; + GElf_Addr info_DT_GNU_HASH; #define DT_GNU_PRELINKED_BIT 50 #define DT_CHECKSUM_BIT 51 #define DT_VERNEED_BIT 52 @@ -83,6 +89,7 @@ typedef struct #define DT_FILTER_BIT 55 #define DT_AUXILIARY_BIT 56 #define DT_LOPROC_BIT 57 +#define DT_GNU_HASH_BIT 58 uint64_t info_set_mask; int fd, fdro; int lastscn, dynamic; --- prelink/src/prelink.c.jj 2005-06-10 17:09:06.000000000 +0200 +++ prelink/src/prelink.c 2006-06-27 21:53:20.000000000 +0200 @@ -1,4 +1,4 @@ -/* Copyright (C) 2001, 2002, 2003, 2004, 2005 Red Hat, Inc. +/* Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Red Hat, Inc. Written by Jakub Jelinek , 2001. This program is free software; you can redistribute it and/or modify @@ -424,6 +424,7 @@ prelink_prepare (DSO *dso) switch (dso->shdr[i].sh_type) { case SHT_HASH: + case SHT_GNU_HASH: case SHT_DYNSYM: case SHT_REL: case SHT_RELA: --- prelink/src/dso.c.jj 2006-06-21 11:46:34.000000000 +0200 +++ prelink/src/dso.c 2006-06-27 21:51:01.000000000 +0200 @@ -102,6 +102,11 @@ read_dynamic (DSO *dso) dso->info_set_mask |= (1ULL << DT_AUXILIARY_BIT); else if (dyn.d_tag == DT_LOPROC) dso->info_set_mask |= (1ULL << DT_LOPROC_BIT); + else if (dyn.d_tag == DT_GNU_HASH) + { + dso->info_DT_GNU_HASH = dyn.d_un.d_val; + dso->info_set_mask |= (1ULL << DT_GNU_HASH_BIT); + } } if (ndx < maxndx) break; @@ -1361,6 +1366,7 @@ adjust_dso (DSO *dso, GElf_Addr start, G return 1; break; case SHT_HASH: + case SHT_GNU_HASH: case SHT_NOBITS: case SHT_STRTAB: break; --- prelink/src/exec.c.jj 2006-05-22 16:33:43.000000000 +0200 +++ prelink/src/exec.c 2006-06-27 21:52:39.000000000 +0200 @@ -61,7 +61,11 @@ update_dynamic_tags (DSO *dso, GElf_Shdr || (dynamic_info_is_set (dso, DT_VERSYM_BIT) && dso->info_DT_VERSYM == old_shdr[j].sh_addr && old_shdr[j].sh_type == SHT_GNU_versym - && set_dynamic (dso, DT_VERSYM, shdr[i].sh_addr, 1))) + && set_dynamic (dso, DT_VERSYM, 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_GNU_HASH + && set_dynamic (dso, DT_GNU_HASH, shdr[i].sh_addr, 1))) return 1; } --- prelink/src/space.c.jj 2006-05-22 16:27:00.000000000 +0200 +++ prelink/src/space.c 2006-06-27 21:48:06.000000000 +0200 @@ -60,6 +60,7 @@ print_sections (DSO *dso, GElf_Ehdr *ehd { SHT_GNU_verneed, "VERNEED" }, { SHT_GNU_versym, "VERSYM" }, { SHT_GNU_LIBLIST, "LIBLIST" }, + { SHT_GNU_HASH, "GNU_HASH" }, { 0, NULL } }; @@ -181,6 +182,7 @@ readonly_is_movable (DSO *dso, GElf_Ehdr switch (shdr[k].sh_type) { case SHT_HASH: + case SHT_GNU_HASH: case SHT_DYNSYM: case SHT_REL: case SHT_RELA: @@ -527,6 +529,7 @@ find_readonly_space (DSO *dso, GElf_Shdr switch (shdr[j].sh_type) { case SHT_HASH: + case SHT_GNU_HASH: case SHT_DYNSYM: case SHT_STRTAB: case SHT_GNU_verdef: