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);