summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorkamil <kamil@NetBSD.org>2020-09-21 16:08:57 +0000
committerkamil <kamil@NetBSD.org>2020-09-21 16:08:57 +0000
commit4eb7209a01c4fe2b46d816965fdd7bc2ae54ae25 (patch)
tree263316b3b95bf46038a83969853a4f971b3b0b16 /libexec
parente337c009fca2f7418ca5d7938c396ff1e50e4e79 (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.c6
-rw-r--r--libexec/ld.elf_so/rtld.c14
-rw-r--r--libexec/ld.elf_so/rtld.h4
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 */