tried below fix, that is a partial revert of klibc
6fbd8fafdcc793135988733996d72b0298afe934
see git://git.kernel.org/pub/scm/libs/klibc/klibc.git
with belows fix klibc compiles fine on sparc with newer gcc,
but segfaults:
titan:~# strace -vfF /usr/lib/klibc/bin/fstype
execve("/usr/lib/klibc/bin/fstype",
["/usr/lib/klibc/bin/fstype"],
["SHELL=/bin/bash", "TERM=xterm", "SSH_CLIENT=[myip]
39403"...,
"SSH_TTY=/dev/pts/0", "USER=root",
"LS_COLORS=no=00:fi=00:di=01;34:l"...,
"PATH=/usr/local/sbin:/usr/local/"...,
"MAIL=/var/mail/root",
"PWD=/root", "LANG=en_US.UTF-8", "PS1=\\h:\\w\\$
", "HOME=/root",
"SHLVL=2", "LS_OPTIONS=--color=auto",
"LOGNAME=root",
"SSH_CONNECTION=[myip] 3"..., "_=/usr/bin/strace",
"OLDPWD=/"]) = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Process 3636 detached
thanks for looking at it.
--
maks
use our own clzdi on sparc instead the one of libgcc
Signed-off-by: maximilian attems <max at stro.at>
diff --git a/usr/klibc/arch/sparc64/Kbuild b/usr/klibc/arch/sparc64/Kbuild
index 2854f69..f2450a2 100644
--- a/usr/klibc/arch/sparc64/Kbuild
+++ b/usr/klibc/arch/sparc64/Kbuild
@@ -2,7 +2,7 @@
# klibc files for sparc64
#
-klib-y := pipe.o setjmp.o syscall.o sysfork.o
+klib-y := pipe.o setjmp.o syscall.o sysfork.o ../../libgcc/__clzdi2.o
always := crt0.o
targets := crt0.o
diff --git a/usr/klibc/libgcc/__clzdi2.c b/usr/klibc/libgcc/__clzdi2.c
new file mode 100644
index 0000000..13e636c
--- /dev/null
+++ b/usr/klibc/libgcc/__clzdi2.c
@@ -0,0 +1,23 @@
+/*
+ * __clzdi2 - Returns the leading number of 0 bits in the argument
+ */
+
+#include <stdint.h>
+#include <stddef.h>
+
+uint64_t __clzdi2(uint64_t v)
+{
+ uint32_t vhi = (uint32_t) (v >> 32);
+ uint32_t vx;
+ int dp;
+
+ if (vhi) {
+ vx = vhi;
+ dp = 0;
+ } else {
+ vx = (uint32_t) v;
+ dp = 32;
+ }
+
+ return dp + __builtin_clz(vx);
+}
== Mon, Nov 05, 2007 at 02:55:45PM +0100, maximilian attems =[]> titan:~# strace -vfF /usr/lib/klibc/bin/fstype > execve("/usr/lib/klibc/bin/fstype", ["/usr/lib/klibc/bin/fstype"], > ["SHELL=/bin/bash", "TERM=xterm", "SSH_CLIENT=[myip] 39403"..., > "SSH_TTY=/dev/pts/0", "USER=root", > "LS_COLORS=no=00:fi=00:di=01;34:l"..., > "PATH=/usr/local/sbin:/usr/local/"..., "MAIL=/var/mail/root", > "PWD=/root", "LANG=en_US.UTF-8", "PS1=\\h:\\w\\$ ", "HOME=/root", > "SHLVL=2", "LS_OPTIONS=--color=auto", "LOGNAME=root", > "SSH_CONNECTION=[myip] 3"..., "_=/usr/bin/strace", "OLDPWD=/"]) = 0 > --- SIGSEGV (Segmentation fault) @ 0 (0) --- > +++ killed by SIGSEGV +++gdb doesn't work/help? []> +++ b/usr/klibc/libgcc/__clzdi2.c > @@ -0,0 +1,23 @@ > +/* > + * __clzdi2 - Returns the leading number of 0 bits in the argument > + */ > + > +#include <stdint.h> > +#include <stddef.h> > + > +uint64_t __clzdi2(uint64_t v) > +{ > + uint32_t vhi = (uint32_t) (v >> 32);`v' is a data in memory loaded to register to perform shift, thus this operation yields high 32-bits part of `v'> + uint32_t vx; > + int dp; > + > + if (vhi) { > + vx = vhi; > + dp = 0; > + } else { > + vx = (uint32_t) v;`v' is a data in memory, accessed with 32-bits cast, thus operation yields high 32-bits part of `v'.> + dp = 32; > + } > + > + return dp + __builtin_clz(vx); > +}While i didn't see/used any big-endian machine/asm_dump, i just speculate, since noone replied yet. ____