A problem about dlsym

Joakim Tjernlund joakim.tjernlund at transmode.se
Wed Sep 24 13:01:29 UTC 2014


Yang Yingliang <yangyingliang at huawei.com> wrote on 2014/09/24 10:44:26:
> 
> On 2014/9/24 15:34, Joakim Tjernlund wrote:
> > "uClibc" <uclibc-bounces at uclibc.org> wrote on 2014/09/24 05:51:08:
> >>
> >> Hi,
> >>
> >> After I using the dlopen some libs successfully, I tried to use dlsym 
to 
> > find the symbol.
> >>
> >> E.g.
> >>
> >>   The open order is (liba => libb => libc):
> >>   liba = dlopen("./liba.so", RTLD_LAZY);   //liba.so has the aSymbol
> >>   libb = dlopen("./libb.so", RTLD_LAZY);   //libb.so has the bSymbol
> >>   libc = dlopen("./libc.so", RTLD_LAZY);   //libc.so has the cSymbol
> >>
> >>   Use dlsym to find the symbol:
> >>   bSymbol = dlsym(liba, "bSymbol"));      //we can find the bSymbol 
and 
> > cSymbol via liba
> >>   cSymbol = dlsym(liba, "cSymbol"));
> >>   aSymbol = dlsym(libb, "aSymbol"));      //but, we can not find the 
> > aSymbol via libb or libc
> >>   aSymbol = dlsym(libc, "aSymbol"));
> >>
> >>   cSymbol = dlsym(libb, "cSymbol"));      //we can find the cSymbol 
via 
> > libb
> >>   bSymbol = dlsym(libc, "bSymbol"));      //but, we can not find the 
> > bSymbol via libc
> >>
> >>   It looks like that we can find all the following symbols via the 
first 
> > opened handle
> >>   and find all the following symbols except first opened symbols via 
the 
> > second opened handle, and so on.
> >>
> >>   Is it a bug or it supposed to act like that ?
> > 
> > I guess this is related to your dependencies: How does lib{a,b,c} 
depend 
> > on each other?
> > Do a "readelf -d <lib> | grep NEEDED" and post the result.
> > 
> >  Jocke
> > 
> > 
> Here is the results:
> 
> readelf -d libaa.so | grep NEEDED
>  0x00000001 (NEEDED)                     Shared library: [libc.so.0]
> readelf -d libbb.so | grep NEEDED
>  0x00000001 (NEEDED)                     Shared library: [libc.so.0]
> readelf -d libcc.so | grep NEEDED
>  0x00000001 (NEEDED)                     Shared library: [libc.so.0]

I don't recall exactly but I think this is right.
Search is in load order so dlsym on A will find syms in A,B and C
dlsym B finds B and C.
dlsym C only finds in C.

 Jocke



More information about the uClibc mailing list