ldso: "can't load library" due to not using (f)stat64 calls

Jody Bruchon jody at jodybruchon.com
Thu Jan 16 16:27:41 UTC 2014


I have built a uClibc i386 + BusyBox chroot environment that I 
previously confirmed as working; specifically, if I "chroot . /bin/sh" 
while in the root of it, I would get a BusyBox ash prompt. However, I 
think something changed about Linux or my filesystem that broke my 
ability to chroot into it. My uClibc x86_64 chroot still works fine. My 
eglibc-2.18 i386 + BusyBox chroot also still works fine, leading me to 
believe the problem is uClibc-i386 specific, and probably in the dynamic 
linker/loader.

I am using uClibc snapshot 2014-01-03 and have an XFS filesystem on a 
Linux-3.12.6 x86_64 system. When I attempt to chroot, I receive the 
error: /bin/sh: can't load library 'libcrypt.so.0' (even though the 
library is in place and was previously working.)

I produced an strace output, noticed the EOVERFLOW errors and the *stat 
family calls not being the 64-bit variants, and since I have had this 
problem with a lot of software recently, having to add 
-D_FILE_OFFSET_BITS=64 to CFLAGS, I assume this is why EOVERFLOW is 
happening and causing a failure.

Relevant portion of strace output:
# strace chroot . /bin/sh
execve("/usr/bin/chroot", ["chroot", ".", "/bin/sh"], [/* 23 vars */]) = 0
---  snip  ---
arch_prctl(ARCH_SET_FS, 0x7fc8ae28d700) = 0
mprotect(0x7fc8ae06f000, 16384, PROT_READ) = 0
mprotect(0x7fc8ae29a000, 4096, PROT_READ) = 0
munmap(0x7fc8ae28f000, 39592)           = 0
chroot(".")                             = 0
chdir("/")                              = 0
execve("/bin/sh", ["/bin/sh"], [/* 23 vars */]) = 0
[ Process PID=2787 runs in 32 bit mode. ]
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, 
MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0xf77bf000
stat("/etc/ld.so.cache", 0xfffffffffff98dac) = -1 EOVERFLOW (Value too 
large for defined data type)
stat("/etc/ld.so.preload", 0xfffffffffff98e34) = -1 ENOENT (No such file 
or directory)
open("/lib/libcrypt.so.0", O_RDONLY)    = 3
fstat(3, 0xfffffffffff98464)            = -1 EOVERFLOW (Value too large 
for defined data type)
close(3)                                = 0
open("/lib/libcrypt.so.0", O_RDONLY)    = 3
fstat(3, 0xfffffffffff98458)            = -1 EOVERFLOW (Value too large 
for defined data type)
close(3)                                = 0
open("/usr/lib/libcrypt.so.0", O_RDONLY) = -1 ENOENT (No such file or 
directory)
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 
0) = 0xf77be000
write(2, "", 0)                         = 0
write(2, "/bin/sh", 7/bin/sh)                  = 7
write(2, ": can't load library '", 22: can't load library ')  = 22
write(2, "libcrypt.so.0", 13libcrypt.so.0)           = 13
write(2, "'\n", 2'
)                      = 2
munmap(0xfffffffff77be000, 4096)        = 0
_exit(16)                               = ?
+++ exited with 16 +++

Any ideas?

-Jody Lee Bruchon


More information about the uClibc mailing list