Module Name:    src
Committed By:   kamil
Date:           Mon Sep 21 16:08:57 UTC 2020

Modified Files:
        src/include: link_elf.h
        src/libexec/ld.elf_so: load.c rtld.c rtld.h

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/include/link_elf.h
cvs rdiff -u -r1.48 -r1.49 src/libexec/ld.elf_so/load.c
cvs rdiff -u -r1.205 -r1.206 src/libexec/ld.elf_so/rtld.c
cvs rdiff -u -r1.140 -r1.141 src/libexec/ld.elf_so/rtld.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/include/link_elf.h
diff -u src/include/link_elf.h:1.11 src/include/link_elf.h:1.12
--- src/include/link_elf.h:1.11	Mon Sep 21 02:20:27 2020
+++ src/include/link_elf.h	Mon Sep 21 16:08:57 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: link_elf.h,v 1.11 2020/09/21 02:20:27 kamil Exp $	*/
+/*	$NetBSD: link_elf.h,v 1.12 2020/09/21 16:08:57 kamil Exp $	*/
 
 #ifndef _LINK_ELF_H_
 #define	_LINK_ELF_H_
@@ -6,6 +6,8 @@
 #include <sys/types.h>
 #include <sys/exec_elf.h>
 
+#define R_DEBUG_VERSION	1 /* SVR4 Protocol version */
+
 typedef struct link_map {
 	caddr_t		 l_addr;	/* Base Address of library */
 #ifdef __mips__
@@ -43,6 +45,7 @@ struct r_debug {
 		RT_ADD,			/* adding a shared library */
 		RT_DELETE		/* removing a shared library */
 	} r_state;
+	void *r_ldbase;			/* base address of RTLD */
 };
 
 struct dl_phdr_info

Index: src/libexec/ld.elf_so/load.c
diff -u src/libexec/ld.elf_so/load.c:1.48 src/libexec/ld.elf_so/load.c:1.49
--- src/libexec/ld.elf_so/load.c:1.48	Tue Jan 10 21:08:48 2017
+++ src/libexec/ld.elf_so/load.c	Mon Sep 21 16:08:57 2020
@@ -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, 
 		_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));

Index: src/libexec/ld.elf_so/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.205 src/libexec/ld.elf_so/rtld.c:1.206
--- src/libexec/ld.elf_so/rtld.c:1.205	Sun Apr 19 01:06:15 2020
+++ src/libexec/ld.elf_so/rtld.c	Mon Sep 21 16:08:57 2020
@@ -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_Ad
  */
 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 relo
 	_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);
 

Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.140 src/libexec/ld.elf_so/rtld.h:1.141
--- src/libexec/ld.elf_so/rtld.h:1.140	Sun Apr 19 01:06:15 2020
+++ src/libexec/ld.elf_so/rtld.h	Mon Sep 21 16:08:57 2020
@@ -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 */

Reply via email to