git: 6a4450470593 - stable/15 - rtld: allow arches to initialize/finalize objects

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Sat, 12 Sep 2026 00:28:04 UTC
The branch stable/15 has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=6a4450470593578194a9c7ab5ab14b2b1df1f2e3

commit 6a4450470593578194a9c7ab5ab14b2b1df1f2e3
Author:     Konstantin Belousov <kib@FreeBSD.org>
AuthorDate: 2026-08-26 11:53:20 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2026-09-11 06:59:52 +0000

    rtld: allow arches to initialize/finalize objects
    
    (cherry picked from commit 6a69d28ee07534c8c0eac328dbbc2529dfceb7fd)
---
 libexec/rtld-elf/aarch64/rtld_machdep.h   | 3 +++
 libexec/rtld-elf/amd64/rtld_machdep.h     | 3 +++
 libexec/rtld-elf/arm/rtld_machdep.h       | 3 +++
 libexec/rtld-elf/i386/rtld_machdep.h      | 3 +++
 libexec/rtld-elf/map_object.c             | 2 ++
 libexec/rtld-elf/powerpc/rtld_machdep.h   | 3 +++
 libexec/rtld-elf/powerpc64/rtld_machdep.h | 3 +++
 libexec/rtld-elf/riscv/rtld_machdep.h     | 3 +++
 8 files changed, 23 insertions(+)

diff --git a/libexec/rtld-elf/aarch64/rtld_machdep.h b/libexec/rtld-elf/aarch64/rtld_machdep.h
index 4b5ad523ee87..4edf374617af 100644
--- a/libexec/rtld-elf/aarch64/rtld_machdep.h
+++ b/libexec/rtld-elf/aarch64/rtld_machdep.h
@@ -41,6 +41,9 @@ struct Struct_Obj_Entry;
 #define	MD_OBJ_ENTRY	\
     bool variant_pcs : 1;	/* Object has a variant pcs function */
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 #define	rtld_dynamic(obj)						\
 ({									\
diff --git a/libexec/rtld-elf/amd64/rtld_machdep.h b/libexec/rtld-elf/amd64/rtld_machdep.h
index 2ee63d566bed..53a3cd29f967 100644
--- a/libexec/rtld-elf/amd64/rtld_machdep.h
+++ b/libexec/rtld-elf/amd64/rtld_machdep.h
@@ -37,6 +37,9 @@ struct Struct_Obj_Entry;
 
 #define	MD_OBJ_ENTRY
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 Elf_Dyn *rtld_dynamic_addr(void);
 #define	rtld_dynamic(obj)	rtld_dynamic_addr()
diff --git a/libexec/rtld-elf/arm/rtld_machdep.h b/libexec/rtld-elf/arm/rtld_machdep.h
index 88fa18a0c07a..c46b75fca078 100644
--- a/libexec/rtld-elf/arm/rtld_machdep.h
+++ b/libexec/rtld-elf/arm/rtld_machdep.h
@@ -38,6 +38,9 @@ struct Struct_Obj_Entry;
 
 #define	MD_OBJ_ENTRY
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 #define rtld_dynamic(obj) (&_DYNAMIC)
 
diff --git a/libexec/rtld-elf/i386/rtld_machdep.h b/libexec/rtld-elf/i386/rtld_machdep.h
index 079991f913d6..7eb7b1cdfb77 100644
--- a/libexec/rtld-elf/i386/rtld_machdep.h
+++ b/libexec/rtld-elf/i386/rtld_machdep.h
@@ -37,6 +37,9 @@ struct Struct_Obj_Entry;
 
 #define	MD_OBJ_ENTRY
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 #define rtld_dynamic(obj) \
     ((const Elf_Dyn *)((obj)->relocbase + (Elf_Addr)&_DYNAMIC))
diff --git a/libexec/rtld-elf/map_object.c b/libexec/rtld-elf/map_object.c
index 0b4e847f407e..7135ba1843fc 100644
--- a/libexec/rtld-elf/map_object.c
+++ b/libexec/rtld-elf/map_object.c
@@ -477,6 +477,7 @@ obj_free(Obj_Entry *obj)
 		free(obj->path);
 	if (obj->phdr_alloc)
 		free(__DECONST(void *, obj->phdr));
+	MD_OBJ_ENTRY_FINI(obj);
 	free(obj);
 }
 
@@ -489,6 +490,7 @@ obj_new(void)
 	STAILQ_INIT(&obj->dldags);
 	STAILQ_INIT(&obj->dagmembers);
 	STAILQ_INIT(&obj->names);
+	MD_OBJ_ENTRY_INIT(obj);
 	return (obj);
 }
 
diff --git a/libexec/rtld-elf/powerpc/rtld_machdep.h b/libexec/rtld-elf/powerpc/rtld_machdep.h
index de6a894ac1f5..69a833575a7c 100644
--- a/libexec/rtld-elf/powerpc/rtld_machdep.h
+++ b/libexec/rtld-elf/powerpc/rtld_machdep.h
@@ -38,6 +38,9 @@ struct Struct_Obj_Entry;
 #define	MD_OBJ_ENTRY	\
     Elf_Addr *gotptr;		/* GOT pointer (secure-plt only) */
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 #define rtld_dynamic(obj)    (&_DYNAMIC)
 
diff --git a/libexec/rtld-elf/powerpc64/rtld_machdep.h b/libexec/rtld-elf/powerpc64/rtld_machdep.h
index 06eb6d884101..76091895bb5d 100644
--- a/libexec/rtld-elf/powerpc64/rtld_machdep.h
+++ b/libexec/rtld-elf/powerpc64/rtld_machdep.h
@@ -38,6 +38,9 @@ struct Struct_Obj_Entry;
 #define	MD_OBJ_ENTRY	\
     Elf_Addr glink;		/* GLINK PLT call stub section */
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 /* Return the address of the .dynamic section in the dynamic linker. */
 #define rtld_dynamic(obj)    (&_DYNAMIC)
 
diff --git a/libexec/rtld-elf/riscv/rtld_machdep.h b/libexec/rtld-elf/riscv/rtld_machdep.h
index 1f4fe2e928fe..acb6fa4835db 100644
--- a/libexec/rtld-elf/riscv/rtld_machdep.h
+++ b/libexec/rtld-elf/riscv/rtld_machdep.h
@@ -44,6 +44,9 @@ struct Struct_Obj_Entry;
 
 #define	MD_OBJ_ENTRY
 
+#define	MD_OBJ_ENTRY_INIT(obj)
+#define	MD_OBJ_ENTRY_FINI(obj)
+
 uint64_t set_gp(struct Struct_Obj_Entry *obj);
 
 /* Return the address of the .dynamic section in the dynamic linker. */