Fix 32-bit ARM builds in presence of new binutils.

This commit is contained in:
Carlos O'Donell 2017-07-12 19:51:11 -04:00
parent 32049f182f
commit 44f4cf77e9
2 changed files with 59 additions and 0 deletions

58
glibc-fix-arm32.patch Normal file
View File

@ -0,0 +1,58 @@
https://www.sourceware.org/ml/libc-alpha/2017-07/msg00518.html
To: libc-alpha at sourceware dot org
From: Jiong Wang <jiong dot wang at foss dot arm dot com>
Subject: [ARM] Fix ld.so crash when built using Binutils 2.29
Hi,
There is bug report that ld.so in GLIBC 2.24 built by Binutils 2.29 will crash
on arm-linux-gnueabihf. This is confirmed, and the details is at:
https://sourceware.org/bugzilla/show_bug.cgi?id=21725.
And I could also reproduce this crash using GLIBC master.
As analyzed in the PR, the old code was with the assumption that assembler
won't set bit0 of thumb function address if it comes from PC-relative
instructions and the calculation can be finished during assembling. This
assumption however does not hold after PR gas/21458.
I think ARM backend in GLIBC should be fix to be more portable so it could
work with various combinations of GLIBC and Binutils.
OK for master and backport to all release branches?
2017-07-12 Jiong Wang <jiong.wang@arm.com>
* sysdeps/arm/dl-machine.h (elf_machine_load_address): Also strip bit 0
of pcrel_address under Thumb mode.
diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h
index 7053ead16ed0e7dac182660f7d88fa21f2b4799a..5b67e3d004818308d9bf93effb13d23a762e160f 100644
--- a/sysdeps/arm/dl-machine.h
+++ b/sysdeps/arm/dl-machine.h
@@ -56,11 +56,19 @@ elf_machine_load_address (void)
extern Elf32_Addr internal_function __dl_start (void *) asm ("_dl_start");
Elf32_Addr got_addr = (Elf32_Addr) &__dl_start;
Elf32_Addr pcrel_addr;
+ asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
#ifdef __thumb__
- /* Clear the low bit of the funciton address. */
+ /* Clear the low bit of the funciton address.
+
+ NOTE: got_addr is from GOT table whose lsb is always set by linker if it's
+ Thumb function address. PCREL_ADDR comes from PC-relative calculation
+ which will finish during assembling. GAS assembler before the fix for
+ PR gas/21458 was not setting the lsb but does after that. Always do the
+ strip for both, so the code works with various combinations of glibc and
+ Binutils. */
got_addr &= ~(Elf32_Addr) 1;
+ pcrel_addr &= ~(Elf32_Addr) 1;
#endif
- asm ("adr %0, _dl_start" : "=r" (pcrel_addr));
return pcrel_addr - got_addr;
}

View File

@ -2286,6 +2286,7 @@ rm -f *.filelist*
* Wed Jul 12 2017 Carlos O'Donell <carlos@redhat.com> - 2.25.90-24 * Wed Jul 12 2017 Carlos O'Donell <carlos@redhat.com> - 2.25.90-24
- Fix IFUNC crash in early startup for ppc64le static binaries (#1467518). - Fix IFUNC crash in early startup for ppc64le static binaries (#1467518).
- Enable building with BIND_NOW on ppc64le (#1467518). - Enable building with BIND_NOW on ppc64le (#1467518).
- Fix 32-bit ARM builds in presence of new binutils.
* Wed Jul 12 2017 Florian Weimer <fweimer@redhat.com> - 2.25.90-23 * Wed Jul 12 2017 Florian Weimer <fweimer@redhat.com> - 2.25.90-23
- malloc: Tell GCC optimizers about MAX_FAST_SIZE in _int_malloc (#1470060) - malloc: Tell GCC optimizers about MAX_FAST_SIZE in _int_malloc (#1470060)