diff options
| author | kamil <kamil@NetBSD.org> | 2020-09-21 16:08:57 +0000 |
|---|---|---|
| committer | kamil <kamil@NetBSD.org> | 2020-09-21 16:08:57 +0000 |
| commit | 4eb7209a01c4fe2b46d816965fdd7bc2ae54ae25 (patch) | |
| tree | 263316b3b95bf46038a83969853a4f971b3b0b16 /libexec | |
| parent | e337c009fca2f7418ca5d7938c396ff1e50e4e79 (diff) | |
Upgrade the SVR4 RTLD r_debug protocol to version 1
Changes:
- Add a new field r_ldbase in the r_debug struct.
- Set r_version to 1.
This harmonizes the support with OpenBSD and Linux.
FreeBSD uses version 0 (or no version).
Solaris uses version 2 that is not implemented elsewhere and relies on
SVR4 specific design and interfaces.
Update the code comments as r_debug and link_map is used by other software
than GDB, namely: sanitizers, rump, LLDB.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/ld.elf_so/load.c | 6 | ||||
| -rw-r--r-- | libexec/ld.elf_so/rtld.c | 14 | ||||
| -rw-r--r-- | libexec/ld.elf_so/rtld.h | 4 |
3 files changed, 13 insertions, 11 deletions
diff --git a/libexec/ld.elf_so/load.c b/libexec/ld.elf_so/load.c index 60635042d8f..40e424bb4f7 100644 --- a/libexec/ld.elf_so/load.c +++ b/libexec/ld.elf_so/load.c @@ -1,4 +1,4 @@ -/* $NetBSD: load.c,v 1.48 2017/01/10 21:08:48 christos Exp $ */ +/* $NetBSD: load.c,v 1.49 2020/09/21 16:08:57 kamil Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: load.c,v 1.48 2017/01/10 21:08:48 christos Exp $"); +__RCSID("$NetBSD: load.c,v 1.49 2020/09/21 16:08:57 kamil Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -180,7 +180,7 @@ _rtld_load_object(const char *filepath, int flags) _rtld_objcount++; _rtld_objloads++; #ifdef RTLD_LOADER - _rtld_linkmap_add(obj); /* for GDB */ + _rtld_linkmap_add(obj); /* for the debugger */ #endif dbg((" %p .. %p: %s", obj->mapbase, obj->mapbase + obj->mapsize - 1, obj->path)); diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c index 7e2b3d97dfe..f67995a3eff 100644 --- a/libexec/ld.elf_so/rtld.c +++ b/libexec/ld.elf_so/rtld.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.c,v 1.205 2020/04/19 01:06:15 joerg Exp $ */ +/* $NetBSD: rtld.c,v 1.206 2020/09/21 16:08:57 kamil Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: rtld.c,v 1.205 2020/04/19 01:06:15 joerg Exp $"); +__RCSID("$NetBSD: rtld.c,v 1.206 2020/09/21 16:08:57 kamil Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -81,7 +81,7 @@ Elf_Addr _rtld(Elf_Addr *, Elf_Addr); */ static char *error_message; /* Message for dlopen(), or NULL */ -struct r_debug _rtld_debug; /* for GDB; */ +struct r_debug _rtld_debug; /* The SVR4 interface for the debugger */ bool _rtld_trust; /* False for setuid and setgid programs */ Obj_Entry *_rtld_objlist; /* Head of linked list of shared objects */ Obj_Entry **_rtld_objtail; /* Link field of last object in list */ @@ -394,8 +394,10 @@ _rtld_init(caddr_t mapbase, caddr_t relocbase, const char *execname) _rtld_objtail = &_rtld_objlist; _rtld_objcount = 0; + _rtld_debug.r_version = R_DEBUG_VERSION; _rtld_debug.r_brk = _rtld_debug_state; _rtld_debug.r_state = RT_CONSISTENT; + _rtld_debug.r_ldbase = &_rtld_objself.linkmap; ehdr = (Elf_Ehdr *)mapbase; _rtld_objself.phdr = (Elf_Phdr *)((char *)mapbase + ehdr->e_phoff); @@ -676,8 +678,8 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase) /* * Get the actual dynamic linker pathname from the executable if * possible. (It should always be possible.) That ensures that - * gdb will find the right dynamic linker even if a non-standard - * one is being used. + * the debugger will find the right dynamic linker even if a + * non-standard one is being used. */ if (_rtld_objmain->interp != NULL && strcmp(_rtld_objmain->interp, _rtld_objself.path) != 0) { @@ -774,7 +776,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase) if (real___mainprog_obj) *real___mainprog_obj = _rtld_objmain; - _rtld_debug_state(); /* say hello to gdb! */ + _rtld_debug_state(); /* say hello to the debugger! */ _rtld_exclusive_enter(&mask); diff --git a/libexec/ld.elf_so/rtld.h b/libexec/ld.elf_so/rtld.h index 59a87d01808..07b558c6d5e 100644 --- a/libexec/ld.elf_so/rtld.h +++ b/libexec/ld.elf_so/rtld.h @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.h,v 1.140 2020/04/19 01:06:15 joerg Exp $ */ +/* $NetBSD: rtld.h,v 1.141 2020/09/21 16:08:57 kamil Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -226,7 +226,7 @@ typedef struct Struct_Obj_Entry { sysv_hash:1, /* SysV Hash available */ gnu_hash:1; /* GNU Hash available */ - struct link_map linkmap; /* for GDB */ + struct link_map linkmap; /* for the debugger */ /* These items are computed by map_object() or by digest_phdr(). */ const char *interp; /* Pathname of the interpreter, if any */ |
