Forward to dev@porting list
From: Konstantin Belousov <[email protected]>
Subject: Re: [porting-dev] DEV300_m96: rtld difference on FreeBSD
Date: Sun, 30 Jan 2011 12:16:54 +0200
> On Sun, Jan 30, 2011 at 04:09:53PM +0900, Maho NAKATA wrote:
>> Hi Kostik Belousov,
>> I found a small difference of rtld behavior between Linux and FreeBSD.
>>
>> > libexec/rtld-elf/rtld.c: _rtld_error("%s: Unexpected inconsistency:
>> > dependency %s not found",
>>
>> ldd fails like that on FreeBSD,
>> > # cd basegfx/unxfbsdi.pro/lib ; ldd ./libbasegfxfi.so
>> > ./libbasegfxfi.so:
>> > /libexec/ld-elf.so.1: ./libbasegfxfi.so: Unexpected inconsistency:
>> > dependency libuno_sal.so.3 not found
>> > ./libbasegfxfi.so: exit status 1
>>
>> but on Linux
>>
>> > maho@:~/DEV300_m96/basegfx/unxlngi6.pro/lib$ ldd ./libbasegfxli.so
>> > linux-gate.so.1 => (0x0040d000)
>> > libuno_sal.so.3 => not found
>> > libuno_cppuhelpergcc3.so.3 => not found
>> > libuno_cppu.so.3 => not found
>> > libstlport_gcc.so => not found
>> > libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00542000)
>> > libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0x00b77000)
>> > libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00d8b000)
>> > libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0x008d5000)
>> > /lib/ld-linux.so.2 (0x00e4b000)
>> .
>>
>> Is it a correct behavior? Just i'm not sure ...
> Definitely not. Patch below fixed it for me.
>
> diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
> index 11ef847..241d617 100644
> --- a/libexec/rtld-elf/rtld.c
> +++ b/libexec/rtld-elf/rtld.c
> @@ -3709,6 +3709,8 @@ locate_dependency(const Obj_Entry *obj, const char
> *name)
> if (object_match_name(needed->obj, name))
> return needed->obj;
> }
> + if (ld_tracing != NULL)
> + return (NULL);
> _rtld_error("%s: Unexpected inconsistency: dependency %s not found",
> obj->path, name);
> die();
> @@ -3833,6 +3835,8 @@ rtld_verify_object_versions(Obj_Entry *obj)
> vn = obj->verneed;
> while (vn != NULL) {
> depobj = locate_dependency(obj, obj->strtab + vn->vn_file);
> + if (depobj == NULL)
> + return (-1);
> vna = (const Elf_Vernaux *) ((char *)vn + vn->vn_aux);
> for (;;) {
> if (check_object_provided_version(obj, depobj, vna))
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]