Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 18 Apr 2026 12:08:21 +0000
From:      Lexi Winter <ivy@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: ba94d7574972 - main - stand/common/load_elf: Do kernel module relocations for PPC
Message-ID:  <69e37435.3b47e.5048e12@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by ivy:

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

commit ba94d75749721fae999f756cb227638f9d4398a8
Author:     Lexi Winter <ivy@FreeBSD.org>
AuthorDate: 2026-04-18 12:07:10 +0000
Commit:     Lexi Winter <ivy@FreeBSD.org>
CommitDate: 2026-04-18 12:07:10 +0000

    stand/common/load_elf: Do kernel module relocations for PPC
    
    reloc_ptr() skips relocations for the kernel module, because on most
    platforms the kernel is ET_EXEC and this is not required.  On PPC,
    the kernel is ET_DYN and we need to relocate here, otherwise the
    module metadata will not be loaded properly and the kernel module
    will have an incorrect version, preventing module dependencies from
    resolving.
    
    This fixes loading kernel modules from loader.conf on powerpc.
    
    Diagnosed by:   jrtc27
    Reviewed by:    jrtc27, adrian
    Sponsored by:   https://www.patreon.com/bsdivy
    Differential Revision:  https://reviews.freebsd.org/D56457
---
 stand/common/load_elf.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/stand/common/load_elf.c b/stand/common/load_elf.c
index 10131f7ccb88..a6ea60c74b84 100644
--- a/stand/common/load_elf.c
+++ b/stand/common/load_elf.c
@@ -1282,10 +1282,11 @@ __elfN(reloc_ptr)(struct preloaded_file *mp, elf_file_t ef,
 	int error;
 
 	/*
-	 * The kernel is already relocated, but we still want to apply
-	 * offset adjustments.
+	 * On most platforms, the kernel is already relocated, but we still
+	 * want to apply offset adjustments.  For PowerPC, the kernel is
+	 * ET_DYN rather than ET_EXEC and we still need to relocate here.
 	 */
-	if (ef->kernel)
+	if (ef->kernel && ef->ehdr->e_type != ET_DYN)
 		return (EOPNOTSUPP);
 
 	for (n = 0; n < ef->relsz / sizeof(r); n++) {


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69e37435.3b47e.5048e12>