Module Name:    src
Committed By:   skrll
Date:           Fri Apr 28 07:33:57 UTC 2023

Modified Files:
        src/sys/arch/aarch64/aarch64: kobj_machdep.c
        src/sys/arch/alpha/alpha: kobj_machdep.c
        src/sys/arch/amd64/amd64: kobj_machdep.c
        src/sys/arch/arm/arm32: kobj_machdep.c
        src/sys/arch/hppa/hppa: kobj_machdep.c
        src/sys/arch/i386/i386: kobj_machdep.c
        src/sys/arch/m68k/m68k: kobj_machdep.c
        src/sys/arch/mips/mips: kobj_machdep.c
        src/sys/arch/powerpc/powerpc: kobj_machdep.c
        src/sys/arch/sh3/sh3: kobj_machdep.c
        src/sys/arch/sparc/sparc: kobj_machdep.c
        src/sys/arch/sparc64/sparc64: kobj_machdep.c
        src/sys/arch/vax/vax: kobj_machdep.c
        src/sys/kern: subr_kobj.c
        src/sys/sys: kobj.h

Log Message:
Pass local symbols relocations in both passes and provide the kobj_reloc
implementation visibility of these relocations.

Currently all implementations resolve local symbol relocations in the first
pass and simply skip them in the second. The RISC-V implementation will
make use of this visiblity.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/aarch64/aarch64/kobj_machdep.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/alpha/alpha/kobj_machdep.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/amd64/amd64/kobj_machdep.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/arm32/kobj_machdep.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/hppa/hppa/kobj_machdep.c
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/i386/i386/kobj_machdep.c
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/m68k/m68k/kobj_machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/mips/mips/kobj_machdep.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/powerpc/powerpc/kobj_machdep.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sh3/sh3/kobj_machdep.c
cvs rdiff -u -r1.5 -r1.6 src/sys/arch/sparc/sparc/kobj_machdep.c
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/sparc64/sparc64/kobj_machdep.c
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/vax/vax/kobj_machdep.c
cvs rdiff -u -r1.77 -r1.78 src/sys/kern/subr_kobj.c
cvs rdiff -u -r1.20 -r1.21 src/sys/sys/kobj.h

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

Modified files:

Index: src/sys/arch/aarch64/aarch64/kobj_machdep.c
diff -u src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.6 src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.7
--- src/sys/arch/aarch64/aarch64/kobj_machdep.c:1.6	Fri Dec 11 18:03:33 2020
+++ src/sys/arch/aarch64/aarch64/kobj_machdep.c	Fri Apr 28 07:33:55 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.6 2020/12/11 18:03:33 skrll Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.7 2023/04/28 07:33:55 skrll Exp $	*/
 
 /*
  * Copyright (c) 2018 Ryo Shimizu <r...@nerv.org>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.6 2020/12/11 18:03:33 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.7 2023/04/28 07:33:55 skrll Exp $");
 
 #define ELFSIZE		ARCH_ELFSIZE
 
@@ -168,6 +168,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		return 0;
 	}
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	error = kobj_sym_lookup(ko, symidx, &saddr);
 	if (error != 0) {
 		printf("kobj_reloc: symidx %d lookup failure."

Index: src/sys/arch/alpha/alpha/kobj_machdep.c
diff -u src/sys/arch/alpha/alpha/kobj_machdep.c:1.3 src/sys/arch/alpha/alpha/kobj_machdep.c:1.4
--- src/sys/arch/alpha/alpha/kobj_machdep.c:1.3	Fri Nov  3 09:59:07 2017
+++ src/sys/arch/alpha/alpha/kobj_machdep.c	Fri Apr 28 07:33:55 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.3 2017/11/03 09:59:07 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.4 2023/04/28 07:33:55 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.3 2017/11/03 09:59:07 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.4 2023/04/28 07:33:55 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -88,6 +88,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		symidx = ELF_R_SYM(rel->r_info);
 	}
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_ALPHA_NONE:
 		break;

Index: src/sys/arch/amd64/amd64/kobj_machdep.c
diff -u src/sys/arch/amd64/amd64/kobj_machdep.c:1.8 src/sys/arch/amd64/amd64/kobj_machdep.c:1.9
--- src/sys/arch/amd64/amd64/kobj_machdep.c:1.8	Tue May 28 03:52:08 2019
+++ src/sys/arch/amd64/amd64/kobj_machdep.c	Fri Apr 28 07:33:55 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.8 2019/05/28 03:52:08 kamil Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.9 2023/04/28 07:33:55 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2019/05/28 03:52:08 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.9 2023/04/28 07:33:55 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -106,6 +106,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		}
 	}
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_X86_64_NONE:	/* none */
 		break;

Index: src/sys/arch/arm/arm32/kobj_machdep.c
diff -u src/sys/arch/arm/arm32/kobj_machdep.c:1.15 src/sys/arch/arm/arm32/kobj_machdep.c:1.16
--- src/sys/arch/arm/arm32/kobj_machdep.c:1.15	Tue Dec  1 02:43:14 2020
+++ src/sys/arch/arm/arm32/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.15 2020/12/01 02:43:14 rin Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.16 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.15 2020/12/01 02:43:14 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.16 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -95,6 +95,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		symidx = ELF_R_SYM(rel->r_info);
 	}
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_ARM_NONE:	/* none */
 	case R_ARM_V4BX:	/* none */

Index: src/sys/arch/hppa/hppa/kobj_machdep.c
diff -u src/sys/arch/hppa/hppa/kobj_machdep.c:1.15 src/sys/arch/hppa/hppa/kobj_machdep.c:1.16
--- src/sys/arch/hppa/hppa/kobj_machdep.c:1.15	Fri Nov  3 09:59:08 2017
+++ src/sys/arch/hppa/hppa/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.15 2017/11/03 09:59:08 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.16 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.15 2017/11/03 09:59:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.16 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -149,6 +149,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	rtype = ELF_R_TYPE(rela->r_info);
 	symidx = ELF_R_SYM(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_TYPE(NONE):
 		break;

Index: src/sys/arch/i386/i386/kobj_machdep.c
diff -u src/sys/arch/i386/i386/kobj_machdep.c:1.8 src/sys/arch/i386/i386/kobj_machdep.c:1.9
--- src/sys/arch/i386/i386/kobj_machdep.c:1.8	Fri Nov  3 09:59:08 2017
+++ src/sys/arch/i386/i386/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.8 2017/11/03 09:59:08 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.9 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -55,7 +55,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2017/11/03 09:59:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.9 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -95,6 +95,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		symidx = ELF_R_SYM(rel->r_info);
 	}
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_386_NONE:	/* none */
 		return 0;

Index: src/sys/arch/m68k/m68k/kobj_machdep.c
diff -u src/sys/arch/m68k/m68k/kobj_machdep.c:1.4 src/sys/arch/m68k/m68k/kobj_machdep.c:1.5
--- src/sys/arch/m68k/m68k/kobj_machdep.c:1.4	Fri Nov  3 09:59:08 2017
+++ src/sys/arch/m68k/m68k/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.4 2017/11/03 09:59:08 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.5 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.4 2017/11/03 09:59:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.5 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -57,6 +57,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	symnum = ELF_R_SYM(rela->r_info);
 	rtype = ELF_R_TYPE(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_TYPE(NONE):
 		break;

Index: src/sys/arch/mips/mips/kobj_machdep.c
diff -u src/sys/arch/mips/mips/kobj_machdep.c:1.1 src/sys/arch/mips/mips/kobj_machdep.c:1.2
--- src/sys/arch/mips/mips/kobj_machdep.c:1.1	Tue Mar 23 13:22:40 2021
+++ src/sys/arch/mips/mips/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.1 2021/03/23 13:22:40 simonb Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.2 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -84,6 +84,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	rtype = ELF_R_TYPE(rela->r_info);
 	symidx = ELF_R_SYM(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	/* pointer to 32bit value and instruction */
 	insn = (void *)where;
 

Index: src/sys/arch/powerpc/powerpc/kobj_machdep.c
diff -u src/sys/arch/powerpc/powerpc/kobj_machdep.c:1.7 src/sys/arch/powerpc/powerpc/kobj_machdep.c:1.8
--- src/sys/arch/powerpc/powerpc/kobj_machdep.c:1.7	Fri Nov  3 09:59:08 2017
+++ src/sys/arch/powerpc/powerpc/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.7 2017/11/03 09:59:08 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -52,7 +52,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.7 2017/11/03 09:59:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -91,6 +91,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	rtype = ELF_R_TYPE(rela->r_info);
 	symidx = ELF_R_SYM(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_PPC_NONE:
 	       	break;

Index: src/sys/arch/sh3/sh3/kobj_machdep.c
diff -u src/sys/arch/sh3/sh3/kobj_machdep.c:1.7 src/sys/arch/sh3/sh3/kobj_machdep.c:1.8
--- src/sys/arch/sh3/sh3/kobj_machdep.c:1.7	Tue Apr  9 00:36:55 2019
+++ src/sys/arch/sh3/sh3/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.7 2019/04/09 00:36:55 uwe Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.7 2019/04/09 00:36:55 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -59,6 +59,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	symidx = ELF_R_SYM(rela->r_info);
 	rtype = ELF_R_TYPE(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	switch (rtype) {
 	case R_TYPE(NONE):
 		break;

Index: src/sys/arch/sparc/sparc/kobj_machdep.c
diff -u src/sys/arch/sparc/sparc/kobj_machdep.c:1.5 src/sys/arch/sparc/sparc/kobj_machdep.c:1.6
--- src/sys/arch/sparc/sparc/kobj_machdep.c:1.5	Sun Nov  5 01:18:15 2017
+++ src/sys/arch/sparc/sparc/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.5 2017/11/05 01:18:15 christos Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.6 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 1999, 2002, 2008 The NetBSD Foundation, Inc.
@@ -138,6 +138,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	type = ELF_R_TYPE(rela->r_info);
 	value = rela->r_addend;
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	if (type == R_TYPE(NONE))
 		return 0;
 

Index: src/sys/arch/sparc64/sparc64/kobj_machdep.c
diff -u src/sys/arch/sparc64/sparc64/kobj_machdep.c:1.7 src/sys/arch/sparc64/sparc64/kobj_machdep.c:1.8
--- src/sys/arch/sparc64/sparc64/kobj_machdep.c:1.7	Fri Nov  3 09:59:08 2017
+++ src/sys/arch/sparc64/sparc64/kobj_machdep.c	Fri Apr 28 07:33:56 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj_machdep.c,v 1.7 2017/11/03 09:59:08 maxv Exp $	*/
+/*	$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2001 Jake Burkholder.
@@ -32,7 +32,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.7 2017/11/03 09:59:08 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kobj_machdep.c,v 1.8 2023/04/28 07:33:56 skrll Exp $");
 
 #define	ELFSIZE		ARCH_ELFSIZE
 
@@ -201,6 +201,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 	rtype = ELF64_R_TYPE(rela->r_info);
 	symidx = ELF_R_SYM(rela->r_info);
 
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	if (rtype == R_SPARC_NONE)
 		return 0;
 

Index: src/sys/arch/vax/vax/kobj_machdep.c
diff -u src/sys/arch/vax/vax/kobj_machdep.c:1.1 src/sys/arch/vax/vax/kobj_machdep.c:1.2
--- src/sys/arch/vax/vax/kobj_machdep.c:1.1	Mon Apr 30 06:46:12 2018
+++ src/sys/arch/vax/vax/kobj_machdep.c	Fri Apr 28 07:33:57 2023
@@ -1,4 +1,4 @@
-/*      $NetBSD: kobj_machdep.c,v 1.1 2018/04/30 06:46:12 ragge Exp $   */
+/*      $NetBSD: kobj_machdep.c,v 1.2 2023/04/28 07:33:57 skrll Exp $   */
 
 /*-
  * Copyright (c) 2018 The NetBSD Foundation, Inc.
@@ -54,6 +54,12 @@ kobj_reloc(kobj_t ko, uintptr_t relocbas
 		printf("Elf_Rel not supported");
 		return -1;
 	}
+	const Elf_Sym *sym = kobj_symbol(ko, symidx);
+
+	if (!local && ELF_ST_BIND(sym->st_info) == STB_LOCAL) {
+		return 0;
+	}
+
 	if (rtype != R_VAX_PC32 && rtype != R_VAX_32) {
 		printf("Bad relocation %d", rtype);
 		return -1;

Index: src/sys/kern/subr_kobj.c
diff -u src/sys/kern/subr_kobj.c:1.77 src/sys/kern/subr_kobj.c:1.78
--- src/sys/kern/subr_kobj.c:1.77	Mon Apr 17 08:14:51 2023
+++ src/sys/kern/subr_kobj.c	Fri Apr 28 07:33:57 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_kobj.c,v 1.77 2023/04/17 08:14:51 skrll Exp $	*/
+/*	$NetBSD: subr_kobj.c,v 1.78 2023/04/28 07:33:57 skrll Exp $	*/
 
 /*
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -63,7 +63,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.77 2023/04/17 08:14:51 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_kobj.c,v 1.78 2023/04/28 07:33:57 skrll Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_modular.h"
@@ -878,6 +878,14 @@ kobj_jettison(kobj_t ko)
 	}
 }
 
+const Elf_Sym *
+kobj_symbol(kobj_t ko, uintptr_t symidx)
+{
+
+	return ko->ko_symtab + symidx;
+}
+
+
 /*
  * kobj_sym_lookup:
  *
@@ -1080,7 +1088,8 @@ kobj_relocate(kobj_t ko, bool local)
 				continue;
 			}
 			sym = ko->ko_symtab + symidx;
-			if (local != (ELF_ST_BIND(sym->st_info) == STB_LOCAL)) {
+			/* Skip non-local symbols in the first pass (local == TRUE) */
+			if (local && (ELF_ST_BIND(sym->st_info) != STB_LOCAL)) {
 				continue;
 			}
 			error = kobj_reloc(ko, base, rel, false, local);
@@ -1116,7 +1125,8 @@ kobj_relocate(kobj_t ko, bool local)
 				continue;
 			}
 			sym = ko->ko_symtab + symidx;
-			if (local != (ELF_ST_BIND(sym->st_info) == STB_LOCAL)) {
+			/* Skip non-local symbols in the first pass (local == TRUE) */
+			if (local && (ELF_ST_BIND(sym->st_info) != STB_LOCAL)) {
 				continue;
 			}
 			error = kobj_reloc(ko, base, rela, true, local);

Index: src/sys/sys/kobj.h
diff -u src/sys/sys/kobj.h:1.20 src/sys/sys/kobj.h:1.21
--- src/sys/sys/kobj.h:1.20	Mon Nov  6 17:56:25 2017
+++ src/sys/sys/kobj.h	Fri Apr 28 07:33:57 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: kobj.h,v 1.20 2017/11/06 17:56:25 christos Exp $	*/
+/*	$NetBSD: kobj.h,v 1.21 2023/04/28 07:33:57 skrll Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -47,6 +47,7 @@ int		kobj_stat(kobj_t, vaddr_t *, size_t
 int		kobj_find_section(kobj_t, const char *, void **, size_t *);
 
 /* MI-MD interface. */
+const Elf_Sym *	kobj_symbol(kobj_t, uintptr_t);
 int		kobj_sym_lookup(kobj_t, uintptr_t, Elf_Addr *);
 int		kobj_reloc(kobj_t, uintptr_t, const void *, bool, bool);
 int		kobj_machdep(kobj_t, void *, size_t, bool);

Reply via email to