From 2f785e2a5902c5b8c4ad942ce9cdd82ed03e65f4 Mon Sep 17 00:00:00 2001 From: Mis012 Date: Tue, 20 Sep 2022 15:32:37 +0200 Subject: [PATCH] add back support for loading libraries linked against bionic --- src/main.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main.c b/src/main.c index e0619be2..3620fb48 100644 --- a/src/main.c +++ b/src/main.c @@ -8,6 +8,39 @@ #include +// for getting _r_debug out of the dynamic section +// this is needed by the shim bionic linker to register stuff with gdb +#include +#include + +// the dynamic section +extern Elf64_Dyn _DYNAMIC[]; + +extern struct r_debug *_r_debug_ptr; +void init__r_debug() { +#if defined(_r_debug) +// _r_debug is defined by glibc and is declared as extern in link.h + _r_debug_ptr = &_r_debug; +#else + int i = 0; + Elf64_Dyn current; + + do { + current = _DYNAMIC[i]; + if(current.d_tag == 0x15) { + _r_debug_ptr = (struct r_debug *)current.d_un.d_ptr; + break; + } + i++; + } while(current.d_tag != 0); + + if(!_r_debug_ptr) { + fprintf(stderr, "error: no DEBUG tag in the dynamic section, treating this as fatal\n"); + exit(1); + } +#endif +} + GtkWidget *window; // standard Gtk Application stuff, more or less @@ -227,6 +260,8 @@ int main(int argc, char **argv/*, JNIEnv *env*/) GtkApplication *app; int status; + init__r_debug(); + struct jni_callback_data *callback_data = malloc(sizeof(struct jni_callback_data)); callback_data->apk_main_activity_class = NULL; callback_data->window_width = 960;