Hook symbols not found in libc_malloc_debug.so
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Mon Sep 9 17:08:35 GMT 2024
On 08/09/24 01:17, Josh Leivenzon via Libc-help wrote:
> Hi all,
> I am trying to use some proprietary software meant for use with glibc 2.31 on 2.39 instead.
> This software fails at runtime due to the following missing symbols: ErrorF, __malloc_hook, __realloc_hook, __free_hook, and __memalign_hook.
>
> I'm not too sure about ErrorF, but as for the latter symbols, I believe that preloading libc_malloc_debug.so is supposed to make them available. This, for some reason, is not working.
> Using LD_DEBUG=symbols, I can see that libc_malloc_debug.so is being searched, but the symbols are not found there. I get the following lines among similar ones for other loaded libraries (I'm using Nix, hence the long paths, but I don't think that should be a problem):
>
> ...
> symbol=__malloc_hook; lookup in file=/nix/store/5qfsgr600bry4a6431w311jv4a73v8js-glibc-2.39-52/lib/libc_malloc_debug.so [0]
> ...
> error: symbol lookup error: undefined symbol: __malloc_hook (fatal)
>
> ...
> symbol=__realloc_hook; lookup in file=/nix/store/5qfsgr600bry4a6431w311jv4a73v8js-glibc-2.39-52/lib/libc_malloc_debug.so [0]
> ...
> error: symbol lookup error: undefined symbol: __realloc_hook (fatal)
>
> ...
> symbol=__free_hook; lookup in file=/nix/store/5qfsgr600bry4a6431w311jv4a73v8js-glibc-2.39-52/lib/libc_malloc_debug.so [0]
> ...
> error: symbol lookup error: undefined symbol: __free_hook (fatal)
>
> ...
> symbol=__memalign_hook; lookup in file=/nix/store/5qfsgr600bry4a6431w311jv4a73v8js-glibc-2.39-52/lib/libc_malloc_debug.so [0]
> ...
> error: symbol lookup error: undefined symbol: __memalign_hook (fatal)
>
> Using nm, I can see the following symbols in libc_malloc_debug.so:
>
> __malloc_hook@GLIBC_2.17
> __realloc_hook@GLIBC_2.17
> __free_hook@GLIBC_2.17
> __memalign_hook@GLIBC_2.17
>
> What's going wrong here? Why can't these symbols be found at runtime?
I am not sure, and we do have have a actual regression test for this:
aarch64-linux-gnu$ objdump -t malloc/tst-compathooks-on | grep "_hook@"
00000000000201d0 g O .data 0000000000000008 __malloc_initialize_hook@GLIBC_2.17
0000000000000000 O *UND* 0000000000000000 __realloc_hook@GLIBC_2.17
0000000000000000 O *UND* 0000000000000000 __memalign_hook@GLIBC_2.17
0000000000000000 O *UND* 0000000000000000 __free_hook@GLIBC_2.17
0000000000000000 O *UND* 0000000000000000 __malloc_hook@GLIBC_2.17
$ env LD_DEBUG=symbols LC_ALL=C LD_PRELOAD=malloc/libc_malloc_debug.so malloc/tst-compathooks-on --direct 2>&1 | grep _hook
1934996: symbol=argp_program_version_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=argp_program_version_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=argp_program_version_hook; lookup in file=/home/azanella/Projects/glibc/build/aarch64-linux-gnu/libc.so.6 [0]
1934996: symbol=__malloc_initialize_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__realloc_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__realloc_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__memalign_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__memalign_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__free_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__free_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__malloc_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__malloc_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__realloc_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__realloc_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__memalign_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__memalign_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__free_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__free_hook; lookup in file=malloc/libc_malloc_debug.so [0]
1934996: symbol=__malloc_hook; lookup in file=malloc/tst-compathooks-on [0]
1934996: symbol=__malloc_hook; lookup in file=malloc/libc_malloc_debug.so [0]
The only think I can think is either libc_malloc_debug.so being built wrong
somehow with the hooks symbols not being global, or if the binary has a wrong
version binding (GLIBC_2.XX where libc_malloc_debug.so is providing GLIBC_2.YY).
More information about the Libc-help
mailing list