diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | sysdeps/s390/linkmap.h | 4 | ||||
-rw-r--r-- | sysdeps/s390/s390-32/dl-machine.h | 6 | ||||
-rw-r--r-- | sysdeps/s390/s390-64/dl-machine.h | 6 |
4 files changed, 16 insertions, 10 deletions
@@ -1,3 +1,13 @@ +2016-07-06 Stefan Liebler <stli@linux.vnet.ibm.com> + + * sysdeps/s390/linkmap.h (struct link_map_machine): + Remove member gotplt and add member jmprel. + * sysdeps/s390/s390-32/dl-machine.h + (elf_machine_runtime_setup): Setup member jmprel with DT_JMPREL + instead of gotplt with &got[3]. + (elf_machine_lazy_rel): Calculate address with reloc and jmprel. + * sysdeps/s390/s390-64/dl-machine.h: Likewise. + 2016-07-06 John David Anglin <danglin@gcc.gnu.org> * sysdeps/hppa/fpu/libm-test-ulps: Regenerate. diff --git a/sysdeps/s390/linkmap.h b/sysdeps/s390/linkmap.h index fc1fba3..283615b 100644 --- a/sysdeps/s390/linkmap.h +++ b/sysdeps/s390/linkmap.h @@ -2,12 +2,12 @@ struct link_map_machine { Elf64_Addr plt; /* Address of .plt + 0x2e */ - Elf64_Addr gotplt; /* Address of .got + 0x18 */ + const Elf64_Rela *jmprel; /* Address of first JMP_SLOT reloc */ }; #else struct link_map_machine { Elf32_Addr plt; /* Address of .plt + 0x2c */ - Elf32_Addr gotplt; /* Address of .got + 0x0c */ + const Elf32_Rela *jmprel; /* Address of first JMP_SLOT reloc */ }; #endif diff --git a/sysdeps/s390/s390-32/dl-machine.h b/sysdeps/s390/s390-32/dl-machine.h index ec0ae4a..0a58897 100644 --- a/sysdeps/s390/s390-32/dl-machine.h +++ b/sysdeps/s390/s390-32/dl-machine.h @@ -109,7 +109,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) if (got[1]) { l->l_mach.plt = got[1] + l->l_addr; - l->l_mach.gotplt = (Elf32_Addr) &got[3]; + l->l_mach.jmprel = (const Elf32_Rela *) D_PTR (l, l_info[DT_JMPREL]); } got[1] = (Elf32_Addr) l; /* Identify this shared object. */ @@ -506,9 +506,7 @@ elf_machine_lazy_rel (struct link_map *map, if (__builtin_expect (map->l_mach.plt, 0) == 0) *reloc_addr += l_addr; else - *reloc_addr = - map->l_mach.plt - + (((Elf32_Addr) reloc_addr) - map->l_mach.gotplt) * 8; + *reloc_addr = map->l_mach.plt + (reloc - map->l_mach.jmprel) * 32; } else if (__glibc_likely (r_type == R_390_IRELATIVE)) { diff --git a/sysdeps/s390/s390-64/dl-machine.h b/sysdeps/s390/s390-64/dl-machine.h index 9ee7c92..6e5ee1e 100644 --- a/sysdeps/s390/s390-64/dl-machine.h +++ b/sysdeps/s390/s390-64/dl-machine.h @@ -98,7 +98,7 @@ elf_machine_runtime_setup (struct link_map *l, int lazy, int profile) if (got[1]) { l->l_mach.plt = got[1] + l->l_addr; - l->l_mach.gotplt = (Elf64_Addr) &got[3]; + l->l_mach.jmprel = (const Elf64_Rela *) D_PTR (l, l_info[DT_JMPREL]); } got[1] = (Elf64_Addr) l; /* Identify this shared object. */ @@ -460,9 +460,7 @@ elf_machine_lazy_rel (struct link_map *map, if (__builtin_expect (map->l_mach.plt, 0) == 0) *reloc_addr += l_addr; else - *reloc_addr = - map->l_mach.plt - + (((Elf64_Addr) reloc_addr) - map->l_mach.gotplt) * 4; + *reloc_addr = map->l_mach.plt + (reloc - map->l_mach.jmprel) * 32; } else if (__glibc_likely (r_type == R_390_IRELATIVE)) { |