git: 5437ef1dc12d - stable/14 - libdtrace: Compute the relocation offset for all non-ET_REL objects

From: Mark Johnston <markj_at_FreeBSD.org>
Date: Tue, 30 Jul 2024 15:55:57 UTC
The branch stable/14 has been updated by markj:

URL: https://cgit.FreeBSD.org/src/commit/?id=5437ef1dc12db8e34ecaf82b45be6255230ed5ba

commit 5437ef1dc12db8e34ecaf82b45be6255230ed5ba
Author:     Mark Johnston <markj@FreeBSD.org>
AuthorDate: 2024-07-10 21:21:54 +0000
Commit:     Mark Johnston <markj@FreeBSD.org>
CommitDate: 2024-07-30 15:55:32 +0000

    libdtrace: Compute the relocation offset for all non-ET_REL objects
    
    The use of an ifdef here most likely carries over from when the dtrace
    port only worked on x86 platforms.
    
    MFC after:      2 weeks
    Sponsored by:   Innovate UK
    
    (cherry picked from commit 7bbcbd43c53b49360969ca82b152fd6d971e9055)
---
 .../opensolaris/lib/libdtrace/common/dt_module.c   | 24 ++++++++++++----------
 1 file changed, 13 insertions(+), 11 deletions(-)

diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
index 6fb9b0f84769..2a0386c33124 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_module.c
@@ -1251,19 +1251,21 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
 	 * [Text][R/O data][R/W data][Dynamic][BSS][Non loadable]
 	 */
 	dmp->dm_text_size = dmp->dm_data_va - dmp->dm_text_va;
-#if defined(__i386__)
-	/*
-	 * Find the first load section and figure out the relocation
-	 * offset for the symbols. The kernel module will not need
-	 * relocation, but the kernel linker modules will.
-	 */
-	for (i = 0; gelf_getphdr(dmp->dm_elf, i, &ph) != NULL; i++) {
-		if (ph.p_type == PT_LOAD) {
-			dmp->dm_reloc_offset = k_stat->address - ph.p_vaddr;
-			break;
+
+	if (!is_elf_obj) {
+		/*
+		 * Find the first load section and figure out the relocation
+		 * offset for the symbols. The kernel module will not need
+		 * relocation, but the kernel linker modules will.
+		 */
+		for (i = 0; gelf_getphdr(dmp->dm_elf, i, &ph) != NULL; i++) {
+			if (ph.p_type == PT_LOAD) {
+				dmp->dm_reloc_offset =
+				    k_stat->address - ph.p_vaddr;
+				break;
+			}
 		}
 	}
-#endif
 
 	if (dmp->dm_info.objfs_info_primary)
 		dmp->dm_flags |= DT_DM_PRIMARY;