dlmopen in LD_PRELOAD
Baojun Wang
wangbj@gmail.com
Mon Jun 17 18:58:00 GMT 2019
I can => I cannot
On Mon, Jun 17, 2019 at 2:55 PM Baojun Wang <wangbj@gmail.com> wrote:
> > 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