diff --git a/glibc-fix-arm32.patch b/glibc-fix-arm32.patch new file mode 100644 index 0000000..241e47f --- /dev/null +++ b/glibc-fix-arm32.patch @@ -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 +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 + + * 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; + } + + diff --git a/glibc.spec b/glibc.spec index b2bfef0..47b992c 100644 --- a/glibc.spec +++ b/glibc.spec @@ -2286,6 +2286,7 @@ rm -f *.filelist* * Wed Jul 12 2017 Carlos O'Donell - 2.25.90-24 - Fix IFUNC crash in early startup for ppc64le static binaries (#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 - 2.25.90-23 - malloc: Tell GCC optimizers about MAX_FAST_SIZE in _int_malloc (#1470060)