uclibc segfault in ldso again..
Colin Whittaker
colinw at occamnetworks.com
Thu Apr 2 06:59:03 UTC 2009
The debug segfault occurs when the "reloc" flag is set.
Looks like the _dl_reltypes_tab symbol is not fixed up correctly in ldso.
I don't really understand this.
gdb shows _dl_reltypes_tab as 0x9af0, which happens to be the offset in
the file.
But I couldn't find the symbol with objdump.
How do I find the symbols that need to be fixed up with objdump ?
Colin..
Colin Whittaker wrote:
> I turned on SUPPORT_LD_DEBUG=y
> Now with LD_DEBUG=all, it segfaults everytime.
> Without the LD_DEBUG=all, it runs without segfault, except the very
> first time...
> At least I have consistent behavior now.
>
> Here is the output of
> # LD_DEBUG=all scp
>
> _dl_get_ready_to_run:587: file='libutil.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libutil.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_load_elf_shared_library:639:
> file='/lib/libutil.so.0'; generating link map
> _dl_load_elf_shared_library:640: dynamic: 0x2aac412c
> base: 0x2aac4000
> _dl_load_elf_shared_library:642: entry: 0x2aac4730
> phdr: 0x2aac4034 phnum: 0x7
>
> _dl_get_ready_to_run:587: file='libz.so.1'; needed by 'scp'
> _dl_load_shared_library:222: find library='libz.so.1'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_load_shared_library:307: searching full lib path list
> _dl_load_elf_shared_library:639:
> file='/usr/lib/libz.so.1'; generating link map
> _dl_load_elf_shared_library:640: dynamic: 0x2aad610c
> base: 0x2aad6000
> _dl_load_elf_shared_library:642: entry: 0x2aad7200
> phdr: 0x2aad6034 phnum: 0x6
>
> _dl_get_ready_to_run:587: file='libcrypt.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libcrypt.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_load_elf_shared_library:639:
> file='/lib/libcrypt.so.0'; generating link map
> _dl_load_elf_shared_library:640: dynamic: 0x2aaf812c
> base: 0x2aaf8000
> _dl_load_elf_shared_library:642: entry: 0x2aaf84c0
> phdr: 0x2aaf8034 phnum: 0x7
>
> _dl_get_ready_to_run:587: file='libc.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libc.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_load_elf_shared_library:639:
> file='/lib/libc.so.0'; generating link map
> _dl_load_elf_shared_library:640: dynamic: 0x2ab1e14c
> base: 0x2ab1e000
> _dl_load_elf_shared_library:642: entry: 0x2ab28af0
> phdr: 0x2ab1e034 phnum: 0x8
>
> _dl_get_ready_to_run:587: file='libc.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libc.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_get_ready_to_run:587: file='libc.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libc.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
> _dl_get_ready_to_run:587: file='libc.so.0'; needed by 'scp'
> _dl_load_shared_library:222: find library='libc.so.0'; searching
> _dl_load_shared_library:298: searching ldso dir='/lib'
>
> INIT/FINI order and dependencies:
> lib: /lib/libutil.so.0 has deps:
> /lib/libc.so.0
> lib: /usr/lib/libz.so.1 has deps:
> /lib/libc.so.0
> lib: /lib/libcrypt.so.0 has deps:
> /lib/libc.so.0
> lib: /lib/libc.so.0 has deps:
>
> _dl_perform_mips_global_got_relocations for 'scp'
> _dl_perform_mips_global_got_relocations for '/lib/libutil.so.0'
> _dl_perform_mips_global_got_relocations for '/usr/lib/libz.so.1'
> _dl_perform_mips_global_got_relocations for '/lib/libcrypt.so.0'
> _dl_perform_mips_global_got_relocations for '/lib/libc.so.0'
> _dl_fixup:664: relocation processing: /lib/libc.so.0
>
> Segmentation fault
> # scp
> usage: scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
> [-l limit] [-o ssh_option] [-P port] [-S program]
> [[user@]host1:]file1 [...] [[user@]host2:]file2
> #
>
> Colin Whittaker wrote:
>> I am seeing what Nigel saw in the thread of the same name.
>>
>> I am running on mips.
>> Basically after the ldso loads everything it goes and tries to run
>> the init function with DL_CALL_FUNC_AT_ADDR().
>>
>> First time it runs __GI___uClibc_init which is in libc.so.0
>> Second time it points to something called _init which appears to be
>> in the .init section of libz.so.1
>> It crashes in there. From what I see it looks like a bad address in
>> the GOT.
>>
>> If I run the same program again. It does not crash. And everytime
>> after that it does not crash.
>> Weird....
>>
>> Then another application, which uses other libs, has the same
>> problem. 1st time it crashes during init. 2nd time and ever after it
>> runs fine.
>>
>> I never did see if Nigel found a fix. I am using the
>> LINUXTHREADS_OLD=y
>> PTHREADS_DEBUG_SUPPORT=y
>>
>> I've tried both 0.29 and 0.30.
>>
>> Any thoughts ?
>>
>> Colin..
>>
>> _______________________________________________
>> uClibc mailing list
>> uClibc at uclibc.org
>> http://lists.busybox.net/mailman/listinfo/uclibc
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://lists.busybox.net/mailman/listinfo/uclibc
More information about the uClibc
mailing list