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]

Reply via email to