[PATCH] Fix dladdr return value when cannot find symbol

Carmelo Amoroso carmelo73 at gmail.com
Tue Mar 25 14:49:59 UTC 2008


Bernhard Fischer wrote:
> On Fri, Feb 08, 2008 at 10:24:40AM +0100, Carmelo AMOROSO wrote:
>> Bernd Schmidt wrote:
>>> Carmelo AMOROSO wrote:
>>>   
>>>> based on  the patch from Nickolai, here you can find a comprehensive
>>>> patch to fix
>>>> dladdr function.
>>>>
>>>> With the current implementation, the invocation of dladdr((void *) 1,
>>>> &dlinfo)
>>>> will fill dlinfo.dli_fname with the name of the application itself and
>>>> dlinfo.dli_fbase with 0 (the current value of tpnt->loadaddr for the
>>>> main app).
>>>>
>>>> The patch solves this adding a new field into the struct elf_resolve
>>>> named  DL_LOADADDR_TYPE mapaddr.
>>>> For shared objects, mapaddr has exactly the same value as loadaddr,
>>>> while for the
>>>> main app it contains the address of the first PT_LOAD segmented loaded.
>>>>
>>>> loadaddr will keep it's value and will used exactly as is (as a in
>>>> memory offset
>>>> with respect to relative addresses from ELF sections).
>>>> While in the DL_ADDR_IN_LOADADDR macro, the new field mapaddr needs to
>>>> be used.
>>>>     
>>> This is broken on FD-PIC, since you treat DL_LOADADDR_TYPE variables as
>>> pointers, defeating the point of abstracting away the type.
>>>
>>> The following patch makes it compile on Blackfin, but I'm unable to test
>>> this on a non-FDPIC system.  Does it still work for you?
>>>
>>>
>>> Bernd
>>>   
>> Hi Bernd,
>> the fix is fine for me too.. sorry I did not take care of the 
>> specificity of bfin.
>> Please, go ahead and commit it. I'll update the nptl branch too.
> 
> Ever since this patch was installed, i get:
> ldso/libdl/libdl.c: In function 'dladdr':
> ldso/libdl/libdl.c:746: warning: assignment makes pointer from integer without a cast
> 
> To bypass this alleged bug, i suspect something like the paste below
> could be appropriate, but i'd prefer if somebody else would have a look
> and fix this. TIA..
> 
> 
> Index: uClibc/ldso/libdl/libdl.c
> ===================================================================
> --- uClibc/ldso/libdl/libdl.c   (revision 21490)
> +++ uClibc/ldso/libdl/libdl.c   (working copy)
> @@ -743,7 +743,7 @@ int dladdr(const void *__address, Dl_inf
>  
>                 /* Set the info for the object the address lies in */
>                 __info->dli_fname = pelf->libname;
> -               __info->dli_fbase = pelf->mapaddr;
> +               __info->dli_fbase = (void*)(pelf->mapaddr);
>  
>                 symtab = (ElfW(Sym) *) (pelf->dynamic_info[DT_SYMTAB]);
>                 strtab = (char *) (pelf->dynamic_info[DT_STRTAB]);
>
Fixed as suggested in rev 21493.

Thanks,
Carmelo
  _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
> 




More information about the uClibc mailing list