The highest possible EI_ABIVERSION value for MIPS was not raised with the introduction of absolute symbols handling. This causes a discrepancy with the static linker. If a shared object has its EI_ABIVERSION set to ABSOLUTE_ABI, dynamic linker will fail with the "ABI version invalid" error. The bug can be reproduced on o32 with this $ cat libtest.s .text .globl x .set nomips16 .set nomicromips .ent x .type x, @function x: .set noreorder .cpload $25 jr $31 lb $2,%got(a)($28) .set reorder .end x .size x, .-x .weak a .hidden a $ cat test.c int *x (void); int do_test (void) { x (); return 0; } $ gcc -shared -fPIC libtest.s -o libtest.so $ gcc test.c libtest.so -o test $ ./test $ ./test: error while loading shared libraries: libtest.so: ELF file ABI version invalid
The master branch has been updated by Joseph Myers <jsm28@sourceware.org>: https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=edd8d70b91e1ccef549a7c668499596cc4d56ad1 commit edd8d70b91e1ccef549a7c668499596cc4d56ad1 Author: Mihailo Stojanovic <mihailo.stojanovic@rt-rk.com> Date: Fri Aug 23 16:47:27 2019 +0000 [MIPS] Raise highest supported EI_ABIVERSION value [BZ #24916] This bumps the highest valid EI_ABIVERSION value to ABSOLUTE ABI. New testcase loads the symbol from the GOT with the "lb" instruction so that the EI_ABIVERSION header field of the shared object is set to ABSOLUTE (it doesn't actually check the value of the symbol), and makes sure that the main executable is executed without "ABI version invalid" error. Tested for all three ABIs (o32, n32, n64) using both static linker which handles undefined weak symbols correctly [1] (and sets the EI_ABIVERSION of the test module) and the one that doesn't (EI_ABIVERSION left as 0). [1] https://sourceware.org/ml/binutils/2018-07/msg00268.html [BZ #24916] * sysdeps/mips/Makefile [$(subdir) = elf] (tests): Add tst-undefined-weak. [$(subdir) = elf] (modules-names): Add tst-undefined-weak-lib. [$(subdir) = elf] ($(objpfx)tst-undefined-weak): Add dependency. * sysdeps/mips/tst-undefined-weak-lib.S: New file. * sysdeps/mips/tst-undefined-weak.c: Likewise. * sysdeps/unix/sysv/linux/mips/ldsodefs.h (VALID_ELF_ABIVERSION): Increment highest valid ABIVERSION value.
Fixed for 2.31.