diff mbox series

[v3,MIPS] Raise highest supported EI_ABIVERSION value [BZ #24916]

Message ID 1566312011-4112-1-git-send-email-mihailo.stojanovic@rt-rk.com
State New
Headers show
Series [v3,MIPS] Raise highest supported EI_ABIVERSION value [BZ #24916] | expand

Commit Message

Mihailo Stojanovic Aug. 20, 2019, 2:40 p.m. UTC
Hello everyone,

As suggested by Joseph here [1], this bumps the highest valid ABIVERSION
value to ABSOLUTE ABI, which was overlooked in [2].

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.

Cheers,
Mihailo

[1] https://sourceware.org/ml/libc-alpha/2019-07/msg00548.html
[2] https://sourceware.org/ml/libc-alpha/2018-07/msg00131.html

    [BZ #24916]
    * sysdeps/mips/Makefile: New test.
    * sysdeps/mips/tst-undefined-weak-lib.S: Ditto.
    * sysdeps/mips/tst-undefined-weak.c: Ditto.
    * sysdeps/unix/sysv/linux/mips/ldsodefs.h: Increment highest valid
      ABIVERSION value.
---
 sysdeps/mips/Makefile                   |  8 +++++++
 sysdeps/mips/tst-undefined-weak-lib.S   | 41 +++++++++++++++++++++++++++++++++
 sysdeps/mips/tst-undefined-weak.c       | 28 ++++++++++++++++++++++
 sysdeps/unix/sysv/linux/mips/ldsodefs.h |  2 +-
 4 files changed, 78 insertions(+), 1 deletion(-)
 create mode 100644 sysdeps/mips/tst-undefined-weak-lib.S
 create mode 100644 sysdeps/mips/tst-undefined-weak.c

Comments

Joseph Myers Aug. 20, 2019, 3:27 p.m. UTC | #1
On Tue, 20 Aug 2019, Mihailo Stojanovic wrote:

> Hello everyone,
> 
> As suggested by Joseph here [1], this bumps the highest valid ABIVERSION
> value to ABSOLUTE ABI, which was overlooked in [2].
> 
> 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.

Could you give details of how this was tested - did you test for all three 
ABIs?  (That's information that generally belongs in the proposed commit 
message.)

> +CFLAGS-tst-undefined-weak.c: -O0

That's not how you set CFLAGS for a target.  So presumably you don't need 
-O0 at all?

> +#ifdef  _ABIO32

I think the convention is to do

#include <sgidefs.h>

#if _MIPS_SIM == _ABIO32

rather than #ifdef on _ABI* macros.
diff mbox series

Patch

diff --git a/sysdeps/mips/Makefile b/sysdeps/mips/Makefile
index 7ac6fa5..eb52966 100644
--- a/sysdeps/mips/Makefile
+++ b/sysdeps/mips/Makefile
@@ -82,3 +82,11 @@  $(objpfx)tst-mode-switch-2: $(shared-thread-library)
 endif
 endif
 endif
+
+ifeq ($(subdir),elf)
+tests += tst-undefined-weak
+modules-names += tst-undefined-weak-lib
+
+CFLAGS-tst-undefined-weak.c: -O0
+$(objpfx)tst-undefined-weak: $(objpfx)tst-undefined-weak-lib.so
+endif
diff --git a/sysdeps/mips/tst-undefined-weak-lib.S b/sysdeps/mips/tst-undefined-weak-lib.S
new file mode 100644
index 0000000..c6eebac
--- /dev/null
+++ b/sysdeps/mips/tst-undefined-weak-lib.S
@@ -0,0 +1,41 @@ 
+/* Undefined weak symbol loading shared module.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+    .text
+    .globl	x
+    .set	nomips16
+    .set	nomicromips
+    .ent	x
+    .type	x, @function
+x:
+    .set noreorder
+#ifdef  _ABIO32
+    .cpload  $25
+    jr  $31
+    lb  $2,%got(a)($28)
+#else
+    .cpsetup  $25,$24,x
+    lb  $2,%got_disp(a)($28)
+    jr  $31
+    .cpreturn
+#endif
+    .set reorder
+    .end	x
+    .size	x, .-x
+    .weak	a
+    .hidden	a
diff --git a/sysdeps/mips/tst-undefined-weak.c b/sysdeps/mips/tst-undefined-weak.c
new file mode 100644
index 0000000..1231da6
--- /dev/null
+++ b/sysdeps/mips/tst-undefined-weak.c
@@ -0,0 +1,28 @@ 
+/* Undefined weak symbol loading main executable.
+   Copyright (C) 2019 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+int *x (void);
+
+int
+do_test (void)
+{
+  x ();
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/unix/sysv/linux/mips/ldsodefs.h b/sysdeps/unix/sysv/linux/mips/ldsodefs.h
index 8dde855..28257f8 100644
--- a/sysdeps/unix/sysv/linux/mips/ldsodefs.h
+++ b/sysdeps/unix/sysv/linux/mips/ldsodefs.h
@@ -34,7 +34,7 @@  extern void _dl_static_init (struct link_map *map);
 #undef VALID_ELF_ABIVERSION
 #define VALID_ELF_ABIVERSION(osabi,ver)			\
   (ver == 0						\
-   || (osabi == ELFOSABI_SYSV && ver < 4)		\
+   || (osabi == ELFOSABI_SYSV && ver < 5)		\
    || (osabi == ELFOSABI_GNU && ver < LIBC_ABI_MAX))
 
 #endif /* ldsodefs.h */