Bug 24916 - [MIPS] Highest EI_ABIVERSION value not raised to ABSOLUTE ABI
Summary: [MIPS] Highest EI_ABIVERSION value not raised to ABSOLUTE ABI
Status: RESOLVED FIXED
Alias: None
Product: glibc
Classification: Unclassified
Component: dynamic-link (show other bugs)
Version: 2.28
: P2 normal
Target Milestone: 2.31
Assignee: Not yet assigned to anyone
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2019-08-19 14:58 UTC by Mihailo Stojanovic
Modified: 2019-10-04 21:41 UTC (History)
1 user (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:
fweimer: security-


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Mihailo Stojanovic 2019-08-19 14:58:48 UTC
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
Comment 1 Sourceware Commits 2019-08-23 16:48:32 UTC
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.
Comment 2 Joseph Myers 2019-08-23 16:49:21 UTC
Fixed for 2.31.