mirror of
https://github.com/crosstool-ng/crosstool-ng.git
synced 2024-12-23 14:42:26 +00:00
57426168ad
Signed-off-by: Alexey Neyman <stilor@att.net>
66 lines
2.6 KiB
Diff
66 lines
2.6 KiB
Diff
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)
|