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