Fix 32-bit ARM builds in presence of new binutils.
This commit is contained in:
parent
32049f182f
commit
44f4cf77e9
58
glibc-fix-arm32.patch
Normal file
58
glibc-fix-arm32.patch
Normal 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user