MIPS64 N64 SIGBUS error

Waldemar Brodkorb wbx at openadk.org
Sun Nov 24 09:51:50 UTC 2013


Hi Developers,

I am trying to find the reason for a SIGBUS error, when
using uClibc (git from yesterday) with Qemu 1.6.1 
(qemu-system-mips64).

My uClibc config is attached. I am cross-compiling from x86_64
Debian. To successfully startup the Linux system, I use a
eglibc based toolchain and system and then using chroot to trigger
the SIGBUS. Using O32 ABI with uClibc works fine. Using N64 ABI
results in a SIGBUS error, but only when using a binary using shared
libraries. A static binary works fine. 

GDB shows following backtrace:
# gdb /hello                                                                   
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later
<http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show
copying"
and "show warranty" for details.
This GDB was configured as "mips64-openadk-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /hello...done.
(gdb) run
Starting program: /hello 
_dl_get_ready_to_run:450: Cool, ldso survived making function calls
_dl_malloc:240: mmapping more memory
_dl_ldsopath_init:156: Lib Loader: (0xfffffffff7fe4000)
/lib/ld64-uClibc.so.0: using path: /lib
_dl_get_ready_to_run:661: calling mprotect on the application
program
_dl_load_elf_shared_library:772: Found TLS header for /lib/libc.so.0
_dl_load_elf_shared_library:799: Relocated TLS initial image from
0xe7ad0 to 0xfff7fdbad0 (size = 0x8)
_dl_get_ready_to_run:1052: Loading: (0xfff7ef4000) /lib/libc.so.0
_dl_get_ready_to_run:1052: Loading: (0xfff7fe4000)
/lib/ld64-uClibc.so.0
_dl_get_ready_to_run:1193: Calling init_tls()!
_dl_malloc:240: mmapping more memory
_dl_get_ready_to_run:1295: Beginning relocation fixups
TLS_TPREL  : , 0x8, 0xffffffffffff9000
TLS_TPREL  : , 0xc, 0xffffffffffff9000
TLS_TPREL  : , 0x0, 0xffffffffffff9000
TLS_TPREL  : , 0x10, 0xffffffffffff9000
TLS_TPREL  : __libc_tsd_RPC_VARS, 0x0, 0xffffffffffff9018
_dl_get_ready_to_run:1325: Calling _dl_allocate_tls_init()!

Program received signal SIGBUS, Bus error.
0x000000fff7f63cfc in _stdio_init () at libc/stdio/_stdio.c:257
257     libc/stdio/_stdio.c: No such file or directory.
(gdb) bt
#0  0x000000fff7f63cfc in _stdio_init () at libc/stdio/_stdio.c:257
#1  0x000000fff7fba700 in __uClibc_init ()
    at libc/misc/internals/__uClibc_main.c:276
#2  0x000000fff7fec9cc in _dl_get_ready_to_run (tpnt=0xfff7ffd2b0, 
    load_addr=<optimized out>, auxvt=0xffffffec58,
envp=0xffffffedb8, 
    argv=<optimized out>) at ldso/ldso/ldso.c:1398
#3  0x000000fff7fed598 in _dl_start (args=1099511623072)
    at ldso/ldso/dl-startup.c:349
#4  0x000000fff7fe592c in _start () from /lib/ld64-uClibc.so.0
Backtrace stopped: frame did not save the PC
(gdb) 

It is this line in the code:
int old_errno = errno;

And after preprocessing:
int old_errno = __libc_errno;

I have NPTL/TLS enabled in my config. So errno seems to be a per-thread
value. When playing a little bit with gdb, breaking in _stdio_init
I see following:
(gdb) run
Starting program: /hello 
_dl_get_ready_to_run:450: Cool, ldso survived making function calls
_dl_malloc:240: mmapping more memory
_dl_ldsopath_init:156: Lib Loader: (0xfffffffff7fe4000)
/lib/ld64-uClibc.so.0: using path: /lib
_dl_get_ready_to_run:661: calling mprotect on the application
program
_dl_load_elf_shared_library:772: Found TLS header for /lib/libc.so.0
_dl_load_elf_shared_library:799: Relocated TLS initial image from
0xe7ad0 to 0xfff7fdbad0 (size = 0x8)
_dl_get_ready_to_run:1053: Loading: (0xfff7ef4000) /lib/libc.so.0
_dl_get_ready_to_run:1053: Loading: (0xfff7fe4000)
/lib/ld64-uClibc.so.0
_dl_get_ready_to_run:1194: Calling init_tls()!
_dl_malloc:240: mmapping more memory
_dl_get_ready_to_run:1296: Beginning relocation fixups
TLS_TPREL  : , 0x8, 0xffffffffffff9000
TLS_TPREL  : , 0xc, 0xffffffffffff9000
TLS_TPREL  : , 0x0, 0xffffffffffff9000
TLS_TPREL  : , 0x10, 0xffffffffffff9000
TLS_TPREL  : __libc_tsd_RPC_VARS, 0x0, 0xffffffffffff9018
_dl_get_ready_to_run:1326: Calling _dl_allocate_tls_init()!

Breakpoint 1, _stdio_init () at libc/stdio/_stdio.c:257
257     libc/stdio/_stdio.c: No such file or directory.
(gdb) si
0x000000fff7f63ce0      257     in libc/stdio/_stdio.c
(gdb) disas 0x000000fff7f63ce0,+8
Dump of assembler code from 0xfff7f63ce0 to 0xfff7f63ce8:
=> 0x000000fff7f63ce0 <_stdio_init+36>: move    v0,v1
   0x000000fff7f63ce4 <_stdio_init+40>: ld      v1,-26904(gp)
End of assembler dump.
(gdb) p/x $gp-26904
$1 = 0xfff7fddc58
(gdb) x/g 0xfff7fddc58
0xfff7fddc58:   0xffff900000000008
(gdb) 

Looks wrong or not?
When I manually fix it, it survives:

(gdb) set {unsigned long}0xfff7fddc58=0xffffffffffff9000
(gdb) si
0x000000fff7f63ce4      257     in libc/stdio/_stdio.c
(gdb) si
0x000000fff7f63ce8      257     in libc/stdio/_stdio.c
(gdb) si
0x000000fff7f63cec      257     in libc/stdio/_stdio.c
(gdb) si
0x000000fff7f63cf0      257     in libc/stdio/_stdio.c
(gdb) si
259     in libc/stdio/_stdio.c
(gdb) 

So who does set $gp-26904 to the wrong data?
Can anybody help me to fix this? After that there seems a good
chance to unbreak uClibc N64 support. There is another problem, when
using clone systemcall, but I already have a fix for it.

Thanks for any help,
 Waldemar

-------------- next part --------------
#
# Automatically generated file; DO NOT EDIT.
# uClibc 0.9.34-git C Library Configuration
#
# TARGET_alpha is not set
# TARGET_arm is not set
# TARGET_avr32 is not set
# TARGET_bfin is not set
# TARGET_c6x is not set
# TARGET_cris is not set
# TARGET_e1 is not set
# TARGET_frv is not set
# TARGET_h8300 is not set
# TARGET_hppa is not set
# TARGET_i386 is not set
# TARGET_i960 is not set
# TARGET_ia64 is not set
# TARGET_m68k is not set
# TARGET_metag is not set
# TARGET_microblaze is not set
TARGET_mips=y
# TARGET_nios is not set
# TARGET_nios2 is not set
# TARGET_powerpc is not set
# TARGET_sh is not set
# TARGET_sh64 is not set
# TARGET_sparc is not set
# TARGET_v850 is not set
# TARGET_vax is not set
# TARGET_x86_64 is not set
# TARGET_xtensa is not set

#
# Target Architecture Features and Options
#
TARGET_ARCH="mips"
FORCE_OPTIONS_FOR_ARCH=y
# CONFIG_MIPS_O32_ABI is not set
# CONFIG_MIPS_N32_ABI is not set
CONFIG_MIPS_N64_ABI=y
# CONFIG_MIPS_ISA_1 is not set
# CONFIG_MIPS_ISA_2 is not set
# CONFIG_MIPS_ISA_3 is not set
# CONFIG_MIPS_ISA_4 is not set
# CONFIG_MIPS_ISA_MIPS32 is not set
# CONFIG_MIPS_ISA_MIPS32R2 is not set
CONFIG_MIPS_ISA_MIPS64=y
TARGET_SUBARCH=""

#
# Using ELF file format
#
ARCH_HAS_DEPRECATED_SYSCALLS=y
ARCH_ANY_ENDIAN=y
ARCH_BIG_ENDIAN=y
ARCH_WANTS_BIG_ENDIAN=y
# ARCH_WANTS_LITTLE_ENDIAN is not set
ARCH_HAS_MMU=y
ARCH_USE_MMU=y
UCLIBC_HAS_FLOATS=y
UCLIBC_HAS_FPU=y
DO_C99_MATH=y
# DO_XSI_MATH is not set
UCLIBC_HAS_FENV=y
KERNEL_HEADERS="/home/wbx/n64/target_mips64_uclibc_uclibc/usr/include"
HAVE_DOT_CONFIG=y

#
# General Library Settings
#
DOPIC=y
ARCH_HAS_UCONTEXT=y
HAVE_SHARED=y
# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
LDSO_LDD_SUPPORT=y
LDSO_CACHE_SUPPORT=y
# LDSO_PRELOAD_ENV_SUPPORT is not set
# LDSO_PRELOAD_FILE_SUPPORT is not set
LDSO_BASE_FILENAME="ld.so"
# LDSO_STANDALONE_SUPPORT is not set
# LDSO_PRELINK_SUPPORT is not set
# UCLIBC_STATIC_LDCONFIG is not set
LDSO_RUNPATH=y
LDSO_SAFE_RUNPATH=y
LDSO_SEARCH_INTERP_PATH=y
LDSO_LD_LIBRARY_PATH=y
# LDSO_NO_CLEANUP is not set
UCLIBC_CTOR_DTOR=y
# LDSO_GNU_HASH_SUPPORT is not set
# HAS_NO_THREADS is not set
# LINUXTHREADS_OLD is not set
# LINUXTHREADS_NEW is not set
UCLIBC_HAS_THREADS_NATIVE=y
UCLIBC_HAS_THREADS=y
UCLIBC_HAS_TLS=y
PTHREADS_DEBUG_SUPPORT=y
UCLIBC_HAS_SYSLOG=y
UCLIBC_HAS_LFS=y
# MALLOC is not set
# MALLOC_SIMPLE is not set
MALLOC_STANDARD=y
MALLOC_GLIBC_COMPAT=y
UCLIBC_HAS_OBSTACK=y
UCLIBC_DYNAMIC_ATEXIT=y
COMPAT_ATEXIT=y
# UCLIBC_SUSV2_LEGACY is not set
UCLIBC_SUSV3_LEGACY=y
# UCLIBC_HAS_CONTEXT_FUNCS is not set
# UCLIBC_SUSV3_LEGACY_MACROS is not set
UCLIBC_SUSV4_LEGACY=y
# UCLIBC_STRICT_HEADERS is not set
# UCLIBC_HAS_STUBS is not set
UCLIBC_HAS_SHADOW=y
UCLIBC_HAS_PROGRAM_INVOCATION_NAME=y
UCLIBC_HAS___PROGNAME=y
UCLIBC_HAS_PTY=y
ASSUME_DEVPTS=y
UNIX98PTY_ONLY=y
UCLIBC_HAS_GETPT=y
UCLIBC_HAS_LIBUTIL=y
UCLIBC_HAS_TM_EXTENSIONS=y
UCLIBC_HAS_TZ_CACHING=y
UCLIBC_HAS_TZ_FILE=y
UCLIBC_HAS_TZ_FILE_READ_MANY=y
UCLIBC_TZ_FILE_PATH="/etc/TZ"
UCLIBC_FALLBACK_TO_ETC_LOCALTIME=y

#
# Advanced Library Settings
#
UCLIBC_PWD_BUFFER_SIZE=256
UCLIBC_GRP_BUFFER_SIZE=256

#
# Support various families of functions
#
UCLIBC_LINUX_MODULE_26=y
# UCLIBC_LINUX_MODULE_24 is not set
UCLIBC_LINUX_SPECIFIC=y
UCLIBC_HAS_GNU_ERROR=y
UCLIBC_BSD_SPECIFIC=y
UCLIBC_HAS_BSD_ERR=y
# UCLIBC_HAS_OBSOLETE_BSD_SIGNAL is not set
# UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL is not set
# UCLIBC_NTP_LEGACY is not set
# UCLIBC_SV4_DEPRECATED is not set
UCLIBC_HAS_REALTIME=y
UCLIBC_HAS_ADVANCED_REALTIME=y
UCLIBC_HAS_EPOLL=y
# UCLIBC_HAS_XATTR is not set
# UCLIBC_HAS_PROFILING is not set
UCLIBC_HAS_CRYPT_IMPL=y
# UCLIBC_HAS_SHA256_CRYPT_IMPL is not set
# UCLIBC_HAS_SHA512_CRYPT_IMPL is not set
UCLIBC_HAS_CRYPT=y
UCLIBC_HAS_NETWORK_SUPPORT=y
UCLIBC_HAS_SOCKET=y
UCLIBC_HAS_IPV4=y
UCLIBC_HAS_IPV6=y
UCLIBC_HAS_RPC=y
UCLIBC_HAS_FULL_RPC=y
UCLIBC_HAS_REENTRANT_RPC=y
UCLIBC_USE_NETLINK=y
UCLIBC_SUPPORT_AI_ADDRCONFIG=y
UCLIBC_HAS_BSD_RES_CLOSE=y
UCLIBC_HAS_COMPAT_RES_STATE=y
# UCLIBC_HAS_EXTRA_COMPAT_RES_STATE is not set
UCLIBC_HAS_RESOLVER_SUPPORT=y
UCLIBC_HAS_LIBRESOLV_STUB=y
UCLIBC_HAS_LIBNSL_STUB=y

#
# String and Stdio Support
#
UCLIBC_HAS_STRING_GENERIC_OPT=y
UCLIBC_HAS_STRING_ARCH_OPT=y
UCLIBC_HAS_CTYPE_TABLES=y
UCLIBC_HAS_CTYPE_SIGNED=y
# UCLIBC_HAS_CTYPE_UNSAFE is not set
UCLIBC_HAS_CTYPE_CHECKED=y
# UCLIBC_HAS_CTYPE_ENFORCED is not set
UCLIBC_HAS_WCHAR=y
# UCLIBC_HAS_LOCALE is not set
UCLIBC_HAS_HEXADECIMAL_FLOATS=y
UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
# UCLIBC_HAS_STDIO_BUFSIZ_256 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_512 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_1024 is not set
# UCLIBC_HAS_STDIO_BUFSIZ_2048 is not set
UCLIBC_HAS_STDIO_BUFSIZ_4096=y
# UCLIBC_HAS_STDIO_BUFSIZ_8192 is not set
UCLIBC_HAS_STDIO_BUILTIN_BUFFER_NONE=y
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_4 is not set
# UCLIBC_HAS_STDIO_BUILTIN_BUFFER_8 is not set
# UCLIBC_HAS_STDIO_SHUTDOWN_ON_ABORT is not set
UCLIBC_HAS_STDIO_GETC_MACRO=y
UCLIBC_HAS_STDIO_PUTC_MACRO=y
UCLIBC_HAS_STDIO_AUTO_RW_TRANSITION=y
# UCLIBC_HAS_FOPEN_LARGEFILE_MODE is not set
UCLIBC_HAS_FOPEN_EXCLUSIVE_MODE=y
# UCLIBC_HAS_FOPEN_CLOSEEXEC_MODE is not set
UCLIBC_HAS_GLIBC_CUSTOM_STREAMS=y
UCLIBC_HAS_PRINTF_M_SPEC=y
UCLIBC_HAS_ERRNO_MESSAGES=y
# UCLIBC_HAS_SYS_ERRLIST is not set
UCLIBC_HAS_SIGNUM_MESSAGES=y
# UCLIBC_HAS_SYS_SIGLIST is not set
UCLIBC_HAS_GNU_GETOPT=y
UCLIBC_HAS_STDIO_FUTEXES=y
UCLIBC_HAS_GNU_GETSUBOPT=y

#
# Big and Tall
#
UCLIBC_HAS_REGEX=y
# UCLIBC_HAS_REGEX_OLD is not set
UCLIBC_HAS_FNMATCH=y
# UCLIBC_HAS_FNMATCH_OLD is not set
UCLIBC_HAS_WORDEXP=y
UCLIBC_HAS_NFTW=y
UCLIBC_HAS_FTW=y
UCLIBC_HAS_FTS=y
UCLIBC_HAS_GLOB=y
UCLIBC_HAS_GNU_GLOB=y
# UCLIBC_HAS_UTMPX is not set

#
# Library Installation Options
#
RUNTIME_PREFIX="/"
DEVEL_PREFIX="/usr/"
MULTILIB_DIR="lib"
HARDWIRED_ABSPATH=y

#
# Security options
#
# UCLIBC_BUILD_PIE is not set
UCLIBC_HAS_ARC4RANDOM=y
# ARC4RANDOM_USES_NODEV is not set
# UCLIBC_HAS_SSP is not set
UCLIBC_BUILD_RELRO=y
# UCLIBC_BUILD_NOW is not set
UCLIBC_BUILD_NOEXECSTACK=y

#
# Development/debugging options
#
CROSS_COMPILER_PREFIX=""
UCLIBC_EXTRA_CFLAGS=""
DODEBUG=y
# DOASSERTS is not set
SUPPORT_LD_DEBUG=y
SUPPORT_LD_DEBUG_EARLY=y
# UCLIBC_MALLOC_DEBUGGING is not set
# UCLIBC_HAS_BACKTRACE is not set
WARNINGS="-Wall"
EXTRA_WARNINGS=y
# DOMULTI is not set
# UCLIBC_MJN3_ONLY is not set


More information about the uClibc mailing list