This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] m68k: restore handling of R_68K_NONE in elf_machine_lazy_rel()
- From: slyich at gmail dot com
- To: libc-alpha at sourceware dot org
- Cc: Sergei Trofimovich <siarheit at google dot com>, Andreas Schwab <schwab at linux-m68k dot org>, Roland McGrath <roland at hack dot frob dot com>
- Date: Sat, 29 Oct 2016 14:48:01 +0100
- Subject: [PATCH] m68k: restore handling of R_68K_NONE in elf_machine_lazy_rel()
- Authentication-results: sourceware.org; auth=none
From: Sergei Trofimovich <siarheit@google.com>
elf_machine_lazy_rel() used to support _NONE relocation
since it's initial merge:
commit 01f3e03bcd992cc2917f5d228e763ef3d65e67ad
Author: Roland McGrath <roland@gnu.org>
Date: Tue Feb 13 09:26:53 1996 +0000
Then it was (accidentally?) removed in
commit 96e1bff2513873062233a13c7fd1eea57bb8db24
Author: Roland McGrath <roland@gnu.org>
Date: Wed Jul 17 18:00:33 1996 +0000
I've noticed this error when tested ghc-HEAD dynamic executable
in qemu:
ghc-m68k $ LD_DEBUG=reloc bash -x inplace/bin/ghc-stage2 --info
...
5599: relocation processing: .../compiler/stage2/build/libHSghc-8.1-ghc8.1.20161028.so (lazy)
5599: relocation processing: /lib/libncurses.so.6 (lazy)
5599: relocation processing: .../libraries/terminfo/dist-install/build/libHSterminfo-0.4.0.2-ghc8.1.20161028.so (lazy)
5599: relocation processing: .../libraries/haskeline/dist-install/build/libHShaskeline-0.7.2.3-ghc8.1.20161028.so (lazy)
5599: relocation processing: .../inplace/lib/bin/ghc-stage2 (lazy)
.../inplace/lib/bin/ghc-stage2: error while loading shared libraries: unexpected PLT reloc type 0x00
ghc-HEAD used to work in March 2016.
$ m68k-unknown-linux-gnu-objdump -rR inplace/lib/bin/ghc-stage2
DYNAMIC RELOCATION RECORDS
OFFSET TYPE VALUE
00000000 R_68K_NONE *ABS*
00000000 R_68K_NONE *ABS*
...
https://lists.debian.org/debian-68k/2003/02/msg00009.html
suggests it's somewhat known problem in bintuils.
I don't know yet how to force toolchain to binaries with
such relocations.
This change makes ghc-stage2 load and run fine on the following
toolchain version:
gcc-5.4.0
binutils-2.26.1
glibc-2.23
CC: Andreas Schwab <schwab@linux-m68k.org>
CC: Roland McGrath <roland@hack.frob.com>
Signed-off-by: Sergei Trofimovich <siarheit@google.com>
---
sysdeps/m68k/dl-machine.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sysdeps/m68k/dl-machine.h b/sysdeps/m68k/dl-machine.h
index 41c179c..1b6b6a4 100644
--- a/sysdeps/m68k/dl-machine.h
+++ b/sysdeps/m68k/dl-machine.h
@@ -312,6 +312,8 @@ elf_machine_lazy_rel (struct link_map *map,
Elf32_Addr *const reloc_addr = (void *) (l_addr + reloc->r_offset);
if (ELF32_R_TYPE (reloc->r_info) == R_68K_JMP_SLOT)
*reloc_addr += l_addr;
+ else if (ELF32_R_TYPE (reloc->r_info) == R_68K_NONE)
+ return;
else
_dl_reloc_bad_type (map, ELF32_R_TYPE (reloc->r_info), 1);
}
--
2.10.1