uclibc segfault in ldso

Nigel Kukard nkukard at lbsd.net
Wed Mar 26 13:22:41 UTC 2008


Hi Guys,

I'm trying to trace a segfault in ldso when running a PIE compiled
binary under uclibc.

I added rpm to buildroot, it builds with PIE but segfaults when running
under uclibc.


GNU gdb 6.6
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you
are
welcome to change it and/or distribute copies of it under certain
conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for
details.
This GDB was configured as "i586-linux-uclibc"...
Using host libthread_db library "/lib/libthread_db.so.1".
(gdb) run
Starting program: /bin/rpm 
argc=1 argv=0xbfc4a164 envp=0xbfc4a16c
ELF header=0xb7f70000
First Dynamic section entry=0xb7f7befc
Scanning DYNAMIC section
Done scanning DYNAMIC section
About to do library loader relocations
Done relocating ldso; we can now use globals and make function calls!
_dl_get_ready_to_run:169: Cool, ldso survived making function calls
_dl_get_ready_to_run:261: Position Independent Executable:
app_tpnt->loadaddr=0x80000000
_dl_malloc:892: mmapping more memory
_dl_get_ready_to_run:340: Lib Loader: (0xb7f70000) /lib/ld-uClibc.so.0
_dl_get_ready_to_run:286: calling mprotect on the application program

Program received signal SIGSEGV, Segmentation fault.
0xb7f74835 in _dl_get_ready_to_run (tpnt=0xbfc49da0,
load_addr=3086417920, auxvt=0xbfc49d28, envp=0xbfc4a16c,
argv=0xbfc4a164) at ldso/ldso/ldso.c:577
577     ldso/ldso/ldso.c: No such file or directory.
        in ldso/ldso/ldso.c
(gdb) 



I further tacked this into ldso/ldso.c ....
_dl_loaded_modules = 0xb7f93028
Segmentation fault

This happens on this line ...
                                                                                                                                                    
        for (this_dpnt = (ElfW(Dyn) *) tcurr->dynamic_addr; this_dpnt->d_tag; this_dpnt++) {                                                                           
            if (this_dpnt->d_tag == DT_NEEDED) {   


Only appears to happen with PIE binaries.

Happens when tcurr->libname == "binary_name", looks like it doesn't pick
up the deps and is seg faulting by accessing a memory address out of
range?


Here is a ldd...
_dl_get_ready_to_run:602: _dl_loaded_modules = 0xb7f71028
checking sub-depends for '/usr/lib/librpm-4.4.so'
checking sub-depends for '/usr/lib/librpmdb-4.4.so'
checking sub-depends for '/usr/lib/librpmio-4.4.so'
checking sub-depends for '/usr/lib/libpopt.so.0'
checking sub-depends for '/usr/lib/libelf.so.0'
checking sub-depends for '/usr/lib/libbeecrypt.so.6'
checking sub-depends for '/usr/lib/libneon.so.25'
checking sub-depends for '/usr/lib/libexpat.so.1'
checking sub-depends for '/lib/libm.so.0'
checking sub-depends for '/lib/libdl.so.0'
checking sub-depends for '/usr/lib/libz.so.1'
checking sub-depends for '/lib/libpthread.so.0'
checking sub-depends for '/lib/libc.so.0'
	librpm-4.4.so => /usr/lib/librpm-4.4.so (0x00000000)
	librpmdb-4.4.so => /usr/lib/librpmdb-4.4.so (0x00000000)
	librpmio-4.4.so => /usr/lib/librpmio-4.4.so (0x00000000)
	libpopt.so.0 => /usr/lib/libpopt.so.0 (0x00000000)
	libelf.so.0 => /usr/lib/libelf.so.0 (0x00000000)
	libbeecrypt.so.6 => /usr/lib/libbeecrypt.so.6 (0x00000000)
	libneon.so.25 => /usr/lib/libneon.so.25 (0x00000000)
	libexpat.so.1 => /usr/lib/libexpat.so.1 (0x00000000)
	libm.so.0 => /lib/libm.so.0 (0x00000000)
	libdl.so.0 => /lib/libdl.so.0 (0x00000000)
	libz.so.1 => /usr/lib/libz.so.1 (0x00000000)
	libpthread.so.0 => /lib/libpthread.so.0 (0x00000000)
	libc.so.0 => /lib/libc.so.0 (0x00000000)
	/lib/ld-uClibc.so.0 => /lib/ld-uClibc.so.0 (0x00000000)


Am I doing something wrong, is there someone that can help me with whats
going on so I can debug it further, find the cause and fix it?

non-PIE seems to work fine.

Kind Regards
Nigel
-------------- next part --------------
#
# Automatically generated make config: don't edit
# Wed Mar 26 07:33:28 2008
#
# TARGET_alpha is not set
# TARGET_arm is not set
# TARGET_avr32 is not set
# TARGET_bfin 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=y
# TARGET_i960 is not set
# TARGET_ia64 is not set
# TARGET_m68k is not set
# TARGET_microblaze is not set
# TARGET_mips is not set
# 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 Architecture Features and Options
#
TARGET_ARCH="i386"
FORCE_OPTIONS_FOR_ARCH=y
CONFIG_GENERIC_386=y
# CONFIG_386 is not set
# CONFIG_486 is not set
# CONFIG_586 is not set
# CONFIG_586MMX is not set
# CONFIG_686 is not set
# CONFIG_PENTIUMII is not set
# CONFIG_PENTIUMIII is not set
# CONFIG_PENTIUM4 is not set
# CONFIG_K6 is not set
# CONFIG_K7 is not set
# CONFIG_ELAN is not set
# CONFIG_CRUSOE is not set
# CONFIG_WINCHIPC6 is not set
# CONFIG_WINCHIP2 is not set
# CONFIG_CYRIXIII is not set
# CONFIG_NEHEMIAH is not set
TARGET_SUBARCH=""

#
# Using ELF file format
#
ARCH_LITTLE_ENDIAN=y

#
# Using Little Endian
#
ARCH_HAS_MMU=y
ARCH_USE_MMU=y
UCLIBC_HAS_FLOATS=y
UCLIBC_HAS_FPU=y
DO_C99_MATH=y
KERNEL_HEADERS="/mnt/build/test/buildroot/svn/toolchain_build_i586/linux/include"
HAVE_DOT_CONFIG=y

#
# General Library Settings
#
# HAVE_NO_PIC is not set
DOPIC=y
# HAVE_NO_SHARED is not set
# ARCH_HAS_NO_LDSO is not set
HAVE_SHARED=y
# FORCE_SHAREABLE_TEXT_SEGMENTS is not set
LDSO_LDD_SUPPORT=y
LDSO_CACHE_SUPPORT=y
# LDSO_PRELOAD_FILE_SUPPORT is not set
LDSO_BASE_FILENAME="ld.so"
# UCLIBC_STATIC_LDCONFIG is not set
# LDSO_RUNPATH is not set
UCLIBC_CTOR_DTOR=y
# HAS_NO_THREADS is not set
UCLIBC_HAS_THREADS=y
PTHREADS_DEBUG_SUPPORT=y
# LINUXTHREADS_OLD is not set
UCLIBC_HAS_LFS=y
# MALLOC is not set
# MALLOC_SIMPLE is not set
MALLOC_STANDARD=y
MALLOC_GLIBC_COMPAT=y
UCLIBC_DYNAMIC_ATEXIT=y
# COMPAT_ATEXIT is not set
# UCLIBC_SUSV3_LEGACY is not set
# UCLIBC_SUSV3_LEGACY_MACROS is not set
UCLIBC_HAS_SHADOW=y
# UCLIBC_HAS_PROGRAM_INVOCATION_NAME is not set
UCLIBC_HAS___PROGNAME=y
# UNIX98PTY_ONLY is not set
ASSUME_DEVPTS=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"

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

#
# Networking Support
#
UCLIBC_HAS_IPV6=y
UCLIBC_HAS_RPC=y
UCLIBC_HAS_FULL_RPC=y
UCLIBC_HAS_REENTRANT_RPC=y
# UCLIBC_USE_NETLINK is not set
# UCLIBC_HAS_BSD_RES_CLOSE is not set

#
# 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 is not set
# UCLIBC_HAS_LOCALE is not set
UCLIBC_HAS_HEXADECIMAL_FLOATS=y
UCLIBC_HAS_GLIBC_CUSTOM_PRINTF=y
# USE_OLD_VFPRINTF is not set
UCLIBC_PRINTF_SCANF_POSITIONAL_ARGS=9
UCLIBC_HAS_SCANF_GLIBC_A_FLAG=y
# UCLIBC_HAS_STDIO_BUFSIZ_NONE is not set
# 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_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_GNU_GETSUBOPT=y

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

#
# Library Installation Options
#
SHARED_LIB_LOADER_PREFIX="/lib"
RUNTIME_PREFIX="/"
DEVEL_PREFIX="/usr/"

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

#
# uClibc development/debugging options
#
CROSS_COMPILER_PREFIX="/mnt/build/test/buildroot/svn/build_i586/staging_dir/usr/bin/i586-linux-uclibc-"
UCLIBC_EXTRA_CFLAGS=""
DODEBUG=y
# DOASSERTS is not set
SUPPORT_LD_DEBUG=y
SUPPORT_LD_DEBUG_EARLY=y
UCLIBC_MALLOC_DEBUGGING=y
WARNINGS="-Wall"
EXTRA_WARNINGS=y
# DOMULTI is not set
# UCLIBC_MJN3_ONLY is not set
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.busybox.net/pipermail/uclibc/attachments/20080326/a6fa850b/attachment-0002.pgp 


More information about the uClibc mailing list