dlmopen in LD_PRELOAD

Baojun Wang wangbj@gmail.com
Mon Jun 17 18:55:00 GMT 2019


> Does the library you load via dlmopen contain its own definition of
malloc, perhaps indirectly?

I don't think so, though the dynamic library does depends on libc.so. To
elaborate, the dynamic library is a rust `cdylib` (`.so`),
rust use system malloc by default, however, rust does use TLS quite
extensively. glibc's malloc uses TLS by default, seems even
malloc-experimental disabled during configure phase.

Maybe `LD_PRELOAD` a customized `libmalloc.so` (without using TLS) could be
an option, though I wouldn't like the idea because malloc itself exports
quite a lot symbols, and the
additional efforts of having to maintain the hacky `libmalloc.so`. Using
exactly the same glibc is a huge plus and I'd really like to stick will
this route.

Also worth mentioning is if I manually patch `__get_nprocs`, which is
called `area_get2`, then I can see the stack overflow any longer. the
pseudo assembly used to patch `__get_nprocs`:

/*

__libc_get_nprocs:

   0:   b8 02 00 00 00          mov    $0x2,%eax

   5:   c3                      retq

*/

Thanks
Baojun


On Mon, Jun 17, 2019 at 2:40 PM Florian Weimer <fweimer@redhat.com> wrote:

> * Baojun Wang:
>
> > Can `dlmopen` be called in a DSO being `LD_PRELOAD`-ed? The idea is to
> > create a minimal DSO used for `LD_PRELOAD`, then inside the DSO
> > (.init_array), call `dlmopen` to open the DSO that I'm really interested
> > in. hence the DSO being `LD_PRELOAD` acts like a mini loader only.
> >
> > I did exactly above, but ran into issue (segfault) with stack overflow:
>
> Does the library you load via dlmopen contain its own definition of
> malloc, perhaps indirectly?
>
> I expect what happens that with regular LD_PRELOAD, its TLS usage gets
> promoted to the static TLS allocation, which is allocated by the dynamic
> loader by the bootstrap/minimal malloc.  With the indirection through
> dlmopen, dynamic TLS will be allocated with malloc, which does not work
> if malloc itself uses dynamic TLS.  You can try to build that malloc
> with initial-exec TLS, but dlmopen'ing that could then fail because the
> static TLS reserve could be exhausted.
>
> Thanks,
> Florian
>



More information about the Libc-help mailing list