Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
GCC7 also checks -fsanitize=divide-by-zero, which generates a trap and in sh4, traps in rtld result in link failure. Pull the fix from upstream, although it is not a complete fix, I think: this still generates a trap (SIGILL) rather than the intended SIGFPE. Signed-off-by: Alexey Neyman <stilor@att.net>
- Loading branch information
Showing
2 changed files
with
361 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,296 @@ | ||
commit db3d848e154b00071f4a5e729d5884efad410109 | ||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> | ||
Date: Wed Mar 15 15:44:59 2017 -0300 | ||
|
||
Build divdi3 only for architecture that required it | ||
|
||
As noted in [1], divdi3 object is only exported in a handful ABIs | ||
(i386, m68k, powerpc32, s390-32, and ia64), however it is built | ||
for all current architectures regardless. | ||
|
||
This patch refact the make rules for this object to so only the | ||
aforementioned architectures that actually require it builds it. | ||
|
||
Also, to avoid internal PLT calls to the exported symbol from the | ||
module, glibc uses an internal header (symbol-hacks.h) which is | ||
unrequired (and in fact breaks the build for architectures that | ||
intend to get symbol definitions from libgcc.a). The patch also | ||
changes it to create its own header (divdi3-symbol-hacks.h) and | ||
adjust the architectures that require it accordingly. | ||
|
||
I checked the build/check (with run-built-tests=no) on the | ||
following architectures (which I think must cover all supported | ||
ABI/builds) using GCC 6.3: | ||
|
||
aarch64-linux-gnu | ||
alpha-linux-gnu | ||
arm-linux-gnueabihf | ||
hppa-linux-gnu | ||
ia64-linux-gnu | ||
m68k-linux-gnu | ||
microblaze-linux-gnu | ||
mips64-n32-linux-gnu | ||
mips-linux-gnu | ||
mips64-linux-gnu | ||
nios2-linux-gnu | ||
powerpc-linux-gnu | ||
powerpc-linux-gnu-power4 | ||
powerpc64-linux-gnu | ||
powerpc64le-linux-gnu | ||
s390x-linux-gnu | ||
s390-linux-gnu | ||
sh4-linux-gnu | ||
sh4-linux-gnu-soft | ||
sparc64-linux-gnu | ||
sparcv9-linux-gnu | ||
tilegx-linux-gnu | ||
tilegx-linux-gnu-32 | ||
tilepro-linux-gnu | ||
x86_64-linux-gnu | ||
x86_64-linux-gnu-x32 | ||
i686-linux-gnu | ||
|
||
I only saw one regression on sparcv9-linux-gnu (extra PLT call to | ||
.udiv) which I address in next patch in the set. It also correctly | ||
build SH with GCC 7.0.1 (without any regression from c89721e25d). | ||
|
||
[1] https://sourceware.org/ml/libc-alpha/2017-03/msg00243.html | ||
|
||
* sysdeps/i386/symbol-hacks.h: New file. | ||
* sysdeps/m68k/symbol-hacks.h: New file. | ||
* sysdeps/powerpc/powerpc32/symbol-hacks.h: New file. | ||
* sysdeps/s390/s390-32/symbol-hacks.h: New file. | ||
* sysdeps/unix/sysv/linux/i386/Makefile | ||
[$(subdir) = csu] (sysdep_routines): New rule: divdi3 object. | ||
[$(subdir) = csu] (sysdep-only-routines): Likewise. | ||
[$(subdir) = csu] (CFLAGS-divdi3.c): Likewise. | ||
* sysdeps/unix/sysv/linux/m68k/Makefile | ||
[$(subdir) = csu] (sysdep_routines): Likewise. | ||
[$(subdir) = csu] (sysdep-only-routines): Likewise. | ||
[$(subdir) = csu] (CFLAGS-divdi3.c): Likewise. | ||
* sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile | ||
[$(subdir) = csu] (sysdep_routines): Likewise. | ||
[$(subdir) = csu] (sysdep-only-routines): Likewise. | ||
[$(subdir) = csu] (CFLAGS-divdi3.c): Likewise. | ||
* sysdeps/unix/sysv/linux/s390/s390-32/Makefile | ||
[$(subdir) = csu] (sysdep_routines): Likewise. | ||
[$(subdir) = csu] (sysdep-only-routines): Likewise. | ||
[$(subdir) = csu] (CFLAGS-divdi3.c): Likewise. | ||
* sysdeps/wordsize-32/Makefile: Remove file. | ||
* sysdeps/wordsize-32/symbol-hacks.h: Definitions move to ... | ||
* sysdeps/wordsize-32/divdi3-symbol-hacks.h: ... here. | ||
|
||
diff --git a/sysdeps/i386/symbol-hacks.h b/sysdeps/i386/symbol-hacks.h | ||
new file mode 100644 | ||
index 0000000000..36a13c83f7 | ||
--- /dev/null | ||
+++ b/sysdeps/i386/symbol-hacks.h | ||
@@ -0,0 +1,21 @@ | ||
+/* Hacks needed for symbol manipulation. i386 version. | ||
+ Copyright (C) 2017 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/>. */ | ||
+ | ||
+#include <sysdeps/wordsize-32/divdi3-symbol-hacks.h> | ||
+ | ||
+#include_next "symbol-hacks.h" | ||
diff --git a/sysdeps/m68k/symbol-hacks.h b/sysdeps/m68k/symbol-hacks.h | ||
new file mode 100644 | ||
index 0000000000..e449d29810 | ||
--- /dev/null | ||
+++ b/sysdeps/m68k/symbol-hacks.h | ||
@@ -0,0 +1,21 @@ | ||
+/* Hacks needed for symbol manipulation. m68k version. | ||
+ Copyright (C) 2017 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/>. */ | ||
+ | ||
+#include <sysdeps/wordsize-32/divdi3-symbol-hacks.h> | ||
+ | ||
+#include_next "symbol-hacks.h" | ||
diff --git a/sysdeps/powerpc/powerpc32/symbol-hacks.h b/sysdeps/powerpc/powerpc32/symbol-hacks.h | ||
new file mode 100644 | ||
index 0000000000..dbb3141621 | ||
--- /dev/null | ||
+++ b/sysdeps/powerpc/powerpc32/symbol-hacks.h | ||
@@ -0,0 +1,21 @@ | ||
+/* Hacks needed for symbol manipulation. powerpc version. | ||
+ Copyright (C) 2017 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/>. */ | ||
+ | ||
+#include <sysdeps/wordsize-32/divdi3-symbol-hacks.h> | ||
+ | ||
+#include_next "symbol-hacks.h" | ||
diff --git a/sysdeps/s390/s390-32/symbol-hacks.h b/sysdeps/s390/s390-32/symbol-hacks.h | ||
new file mode 100644 | ||
index 0000000000..585c42365a | ||
--- /dev/null | ||
+++ b/sysdeps/s390/s390-32/symbol-hacks.h | ||
@@ -0,0 +1,21 @@ | ||
+/* Hacks needed for symbol manipulation. s390 version. | ||
+ Copyright (C) 2017 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/>. */ | ||
+ | ||
+#include <sysdeps/wordsize-32/divdi3-symbol-hacks.h> | ||
+ | ||
+#include_next "symbol-hacks.h" | ||
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile | ||
index 6aac0dfe15..4080b8c966 100644 | ||
--- a/sysdeps/unix/sysv/linux/i386/Makefile | ||
+++ b/sysdeps/unix/sysv/linux/i386/Makefile | ||
@@ -26,6 +26,11 @@ endif | ||
|
||
ifeq ($(subdir),csu) | ||
sysdep-dl-routines += sysdep | ||
+ifeq (yes,$(build-shared)) | ||
+sysdep_routines += divdi3 | ||
+shared-only-routines += divdi3 | ||
+CPPFLAGS-divdi3.c = -Din_divdi3_c | ||
+endif | ||
endif | ||
|
||
ifeq ($(subdir),nptl) | ||
diff --git a/sysdeps/unix/sysv/linux/m68k/Makefile b/sysdeps/unix/sysv/linux/m68k/Makefile | ||
index 5c50ce6927..ce1f696a6f 100644 | ||
--- a/sysdeps/unix/sysv/linux/m68k/Makefile | ||
+++ b/sysdeps/unix/sysv/linux/m68k/Makefile | ||
@@ -4,6 +4,11 @@ m68k-syntax-flag = -DMOTOROLA_SYNTAX | ||
|
||
ifeq ($(subdir),csu) | ||
sysdep_routines += m68k-helpers | ||
+ifeq (yes,$(build-shared)) | ||
+sysdep_routines += divdi3 | ||
+shared-only-routines += divdi3 | ||
+CPPFLAGS-divdi3.c = -Din_divdi3_c | ||
+endif | ||
endif | ||
|
||
ifeq ($(subdir),misc) | ||
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile | ||
index 3d6c150582..1f45659ed1 100644 | ||
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile | ||
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/Makefile | ||
@@ -1,2 +1,10 @@ | ||
# See Makeconfig regarding the use of default-abi. | ||
default-abi := 32 | ||
+ | ||
+ifeq ($(subdir),csu) | ||
+ifeq (yes,$(build-shared)) | ||
+sysdep_routines += divdi3 | ||
+shared-only-routines += divdi3 | ||
+CPPFLAGS-divdi3.c = -Din_divdi3_c | ||
+endif | ||
+endif | ||
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/Makefile b/sysdeps/unix/sysv/linux/s390/s390-32/Makefile | ||
index da3b3c76b4..fd8cf92633 100644 | ||
--- a/sysdeps/unix/sysv/linux/s390/s390-32/Makefile | ||
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/Makefile | ||
@@ -21,3 +21,11 @@ endif | ||
ifeq ($(subdir),stdlib) | ||
sysdep_routines += __makecontext_ret | ||
endif | ||
+ | ||
+ifeq ($(subdir),csu) | ||
+ifeq (yes,$(build-shared)) | ||
+sysdep_routines += divdi3 | ||
+shared-only-routines += divdi3 | ||
+CPPFLAGS-divdi3.c = -Din_divdi3_c | ||
+endif | ||
+endif | ||
diff --git a/sysdeps/wordsize-32/Makefile b/sysdeps/wordsize-32/Makefile | ||
deleted file mode 100644 | ||
index 82beac44ed..0000000000 | ||
--- a/sysdeps/wordsize-32/Makefile | ||
+++ /dev/null | ||
@@ -1,7 +0,0 @@ | ||
-ifeq ($(subdir),csu) | ||
-ifeq (yes,$(build-shared)) | ||
-sysdep_routines += divdi3 | ||
-shared-only-routines += divdi3 | ||
-CPPFLAGS-divdi3.c = -Din_divdi3_c | ||
-endif | ||
-endif | ||
diff --git a/sysdeps/wordsize-32/symbol-hacks.h b/sysdeps/wordsize-32/divdi3-symbol-hacks.h | ||
similarity index 89% | ||
rename from sysdeps/wordsize-32/symbol-hacks.h | ||
rename to sysdeps/wordsize-32/divdi3-symbol-hacks.h | ||
index 0aec1e0b97..6c90cb796d 100644 | ||
--- a/sysdeps/wordsize-32/symbol-hacks.h | ||
+++ b/sysdeps/wordsize-32/divdi3-symbol-hacks.h | ||
@@ -1,4 +1,4 @@ | ||
-/* Hacks needed for symbol manipulation. | ||
+/* Hacks needed for divdi3 symbol manipulation. | ||
Copyright (C) 2004-2017 Free Software Foundation, Inc. | ||
This file is part of the GNU C Library. | ||
|
||
@@ -16,13 +16,13 @@ | ||
License along with the GNU C Library; if not, see | ||
<http://www.gnu.org/licenses/>. */ | ||
|
||
-#include_next "symbol-hacks.h" | ||
- | ||
/* A very dirty trick: gcc emits references to __divdi3, __udivdi3, | ||
__moddi3, and __umoddi3. These functions are exported and | ||
therefore we get PLTs. Unnecessarily so. Changing gcc is a big | ||
task which might not be worth it so we play tricks with the | ||
- assembler. */ | ||
+ assembler. | ||
+ Note: in_divdi3_c is only used to avoid symbol alias on divdi3 | ||
+ build itself. */ | ||
#if !defined __ASSEMBLER__ && !defined in_divdi3_c && IS_IN (libc) && defined SHARED | ||
asm ("__divdi3 = __divdi3_internal"); | ||
asm ("__udivdi3 = __udivdi3_internal"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
commit bdc543e338281da051b3dc06eae96c330a485ce6 | ||
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org> | ||
Date: Thu Mar 16 09:15:57 2017 -0300 | ||
|
||
sparc: Fix .udiv plt on libc | ||
|
||
With the removal of divdi3 object from sparcv9-linux-gnu build, its | ||
definition came from libgcc and its functions internall calls .udiv. | ||
Since glibc also exports these symbols for compatibility reasons, it | ||
will end up creating PLT calls internally in libc.so. | ||
|
||
To avoid it, this patch uses the linker option --wrap to replace all | ||
the internal libc.so .udiv calls to the wrapper __wrap_.udiv. Along | ||
with strong alias in the udiv implementations, it makes linker do | ||
local calls. | ||
|
||
Checked on sparcv9-linux-gnu. | ||
|
||
* sysdeps/sparc/sparc32/Makefile (libc.so-gnulib): New rule. | ||
* sysdeps/sparc/sparc32/sparcv8/udiv.S (.udiv): Make a strong_alias | ||
to __wrap_.udiv. | ||
* sysdeps/sparc/sparc32/sparcv9/udiv.S (.udiv): Likewise. | ||
* sysdeps/sparc/sparc32/udiv.S (.udiv): Likewise. | ||
|
||
diff --git a/sysdeps/sparc/sparc32/Makefile b/sysdeps/sparc/sparc32/Makefile | ||
index da205898cf..14d6e03c6f 100644 | ||
--- a/sysdeps/sparc/sparc32/Makefile | ||
+++ b/sysdeps/sparc/sparc32/Makefile | ||
@@ -47,3 +47,9 @@ $(divrem:%=$(sysdep_dir)/sparc/sparc32/%.S): $(sysdep_dir)/sparc/sparc32/divrem. | ||
mv -f $@-tmp $@ | ||
|
||
sysdep-realclean := $(sysdep-realclean) $(divrem:%=sysdeps/sparc/sparc32/%.S) | ||
+ | ||
+# libgcc __divdi3 and __moddi3 uses .udiv and since it is also exported by | ||
+# libc.so linker will create PLTs for the symbol. To avoid it we strong alias | ||
+# the exported libc one to __wrap_.udiv and use linker option --wrap to make any | ||
+# call to .udiv to call the wrapper symbol. | ||
+libc.so-gnulib += -Wl,--wrap=.udiv | ||
diff --git a/sysdeps/sparc/sparc32/sparcv8/udiv.S b/sysdeps/sparc/sparc32/sparcv8/udiv.S | ||
index d71954351e..e9cab4e4ef 100644 | ||
--- a/sysdeps/sparc/sparc32/sparcv8/udiv.S | ||
+++ b/sysdeps/sparc/sparc32/sparcv8/udiv.S | ||
@@ -13,3 +13,4 @@ ENTRY(.udiv) | ||
udiv %o0, %o1, %o0 | ||
|
||
END(.udiv) | ||
+strong_alias (.udiv, __wrap_.udiv) | ||
diff --git a/sysdeps/sparc/sparc32/sparcv9/udiv.S b/sysdeps/sparc/sparc32/sparcv9/udiv.S | ||
index de79899756..368f85ede2 100644 | ||
--- a/sysdeps/sparc/sparc32/sparcv9/udiv.S | ||
+++ b/sysdeps/sparc/sparc32/sparcv9/udiv.S | ||
@@ -15,3 +15,4 @@ ENTRY(.udiv) | ||
udiv %o0, %o1, %o0 | ||
|
||
END(.udiv) | ||
+strong_alias (.udiv, __wrap_.udiv) | ||
diff --git a/sysdeps/sparc/sparc32/udiv.S b/sysdeps/sparc/sparc32/udiv.S | ||
index 8dfff66158..ade0afdf40 100644 | ||
--- a/sysdeps/sparc/sparc32/udiv.S | ||
+++ b/sysdeps/sparc/sparc32/udiv.S | ||
@@ -344,3 +344,4 @@ LOC(got_result): | ||
mov %o2, %o0 | ||
|
||
END(.udiv) | ||
+strong_alias (.udiv, __wrap_.udiv) |