Since the change to build the preloader as PIE, the GDB integration was broken:
1) the executable has a DT_DEBUG dynamic entry and GDB prefers it over the _r_debug static symbol. Fixed this by writing the _r_debug address to DT_DEBUG in the preloader.
2) the _dl_debug_state breakpoint hook is not working anymore. The symbol is still required to be present for GDB to be happy, and with DT_DEBUG fixed, GDB correctly reloads the solib list, but it doesn't load their symbols dynamically (still does after a `sharedlib` command). I suspect that its _dl_debug_state breakpoint gets ovewritten somehow. So I'm now using SystemTap RTLD probes (as described in https://sourceware.org/git/?p=glibc.git;a=blob;f=elf/rtld-debugger-interface...) to notify the debugger of link_map changes instead. This requires some additional packages to be installed.