Module Name:    src
Committed By:   christos
Date:           Fri Jan 31 18:44:59 UTC 2025

Modified Files:
        src/libexec/ld.elf_so: rtld.c

Log Message:
Prefer the kernel passed exec name as opposed to argv[0] for the main object
name, if available. This is more useful because it is an absolute path
and more consistent.


To generate a diff of this commit:
cvs rdiff -u -r1.217 -r1.218 src/libexec/ld.elf_so/rtld.c

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

Modified files:

Index: src/libexec/ld.elf_so/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.217 src/libexec/ld.elf_so/rtld.c:1.218
--- src/libexec/ld.elf_so/rtld.c:1.217	Fri Jan 19 14:21:34 2024
+++ src/libexec/ld.elf_so/rtld.c	Fri Jan 31 13:44:59 2025
@@ -1,4 +1,4 @@
-/*	$NetBSD: rtld.c,v 1.217 2024/01/19 19:21:34 christos Exp $	 */
+/*	$NetBSD: rtld.c,v 1.218 2025/01/31 18:44:59 christos Exp $	 */
 
 /*
  * Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.217 2024/01/19 19:21:34 christos Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.218 2025/01/31 18:44:59 christos Exp $");
 #endif /* not lint */
 
 #include <sys/param.h>
@@ -467,7 +467,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
 	bool            bind_now = 0;
 	const char     *ld_bind_now, *ld_preload, *ld_library_path;
 	const char    **argv;
-	const char     *execname;
+	const char     *execname, *objmain_name;
 	long		argc;
 	const char **real___progname;
 	const Obj_Entry **real___mainprog_obj;
@@ -633,6 +633,14 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
 	}
 	*oenvp++ = NULL;
 
+	/*
+	 * Set the main name. Prefer the name passed by the kernel first,
+	 * then the argument vector, and fall back to "main program"
+	 * This way the name will be an absolute path if available.
+	 */
+	objmain_name = execname ? execname :
+	    (argv[0] ? argv[0] : "main program");
+
 	if (ld_bind_now != NULL && *ld_bind_now != '\0')
 		bind_now = true;
 	if (_rtld_trust) {
@@ -645,6 +653,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
 #endif
 		_rtld_add_paths(execname, &_rtld_paths, ld_library_path);
 	} else {
+		// Prevent $ORIGIN expansion
 		execname = NULL;
 	}
 	_rtld_process_hints(execname, &_rtld_paths, &_rtld_xforms,
@@ -658,9 +667,8 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
          */
 	if (pAUX_execfd != NULL) {	/* Load the main program. */
 		int             fd = pAUX_execfd->a_v;
-		const char *obj_name = argv[0] ? argv[0] : "main program";
 		dbg(("loading main program"));
-		_rtld_objmain = _rtld_map_object(obj_name, fd, NULL);
+		_rtld_objmain = _rtld_map_object(objmain_name, fd, NULL);
 		close(fd);
 		if (_rtld_objmain == NULL)
 			_rtld_die();
@@ -679,8 +687,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
 		assert(pAUX_entry != NULL);
 		entry = (caddr_t) pAUX_entry->a_v;
 		_rtld_objmain = _rtld_digest_phdr(phdr, phnum, entry);
-		_rtld_objmain->path = xstrdup(argv[0] ? argv[0] :
-		    "main program");
+		_rtld_objmain->path = xstrdup(objmain_name);
 		_rtld_objmain->pathlen = strlen(_rtld_objmain->path);
 	}
 

Reply via email to