From: Miod Vallat Subject: nlist(3) users: drop leading underscores To: tech@openbsd.org Date: Mon, 2 Nov 2026 13:06:56 +0000 Years ago, in the good old (but dark) ages of a.out, C symbols would get prefixed with an underscore (`_'). But on ELF platforms, they would not be modified. As a result of this, nlist(3), if it fails to find a symbol but the symbol names starts with an underscore, tries a second time, without the underscore. This allowed nlist users to always look for _foo and work on both a.out and ELF platforms. It's been more than 10 years since all OpenBSD platforms use ELF binaries. Therefore there is no need to search for _foo symbols, as none will be found. The following diff adjusts the symbol lists of all nlist(3) consumers in base, to remove that leading underscore. I am *NOT* suggesting that the logic to retry without the leading underscore in nlist() gets removed, yet. Give it a few more years. Index: bin/ps/nlist.c =================================================================== RCS file: /OpenBSD/src/bin/ps/nlist.c,v diff -u -p -r1.24 nlist.c --- bin/ps/nlist.c 2 Jul 2025 13:24:48 -0000 1.24 +++ bin/ps/nlist.c 2 Nov 2026 13:02:32 -0000 @@ -46,13 +46,13 @@ #include "ps.h" struct nlist psnl[] = { - {"_fscale"}, + {"fscale"}, #define X_FSCALE 0 - {"_ccpu"}, + {"ccpu"}, #define X_CCPU 1 - {"_physmem"}, + {"physmem"}, #define X_PHYSMEM 2 - {"_maxslp"}, + {"maxslp"}, #define X_MAXSLP 3 {NULL} }; Index: lib/libkvm/kvm.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm.c,v diff -u -p -r1.72 kvm.c --- lib/libkvm/kvm.c 22 Feb 2022 17:35:01 -0000 1.72 +++ lib/libkvm/kvm.c 2 Nov 2026 13:02:32 -0000 @@ -819,7 +819,7 @@ kvm_dump_inval(kvm_t *kd) _kvm_err(kd, kd->program, "clearing dump on live kernel"); return (-1); } - nl[0].n_name = "_dumpmag"; + nl[0].n_name = "dumpmag"; nl[1].n_name = NULL; if (kvm_nlist(kd, nl) == -1) { Index: lib/libkvm/kvm_amd64.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm_amd64.c,v diff -u -p -r1.17 kvm_amd64.c --- lib/libkvm/kvm_amd64.c 4 Jun 2026 05:25:04 -0000 1.17 +++ lib/libkvm/kvm_amd64.c 2 Nov 2026 13:02:32 -0000 @@ -76,8 +76,8 @@ _kvm_initvtop(kvm_t *kd) { struct nlist nl[3]; - nl[0].n_name = "_pmap_direct_base"; - nl[1].n_name = "_pmap_direct_end"; + nl[0].n_name = "pmap_direct_base"; + nl[1].n_name = "pmap_direct_end"; nl[2].n_name = NULL; if (kvm_nlist(kd, nl) != 0) { Index: lib/libkvm/kvm_file2.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm_file2.c,v diff -u -p -r1.58 kvm_file2.c --- lib/libkvm/kvm_file2.c 11 Feb 2024 21:29:12 -0000 1.58 +++ lib/libkvm/kvm_file2.c 2 Nov 2026 13:02:32 -0000 @@ -208,8 +208,8 @@ kvm_deadfile_byfile(kvm_t *kd, int op, i struct filelist filehead; int nfiles; - nl[0].n_name = "_filehead"; - nl[1].n_name = "_numfiles"; + nl[0].n_name = "filehead"; + nl[1].n_name = "numfiles"; nl[2].n_name = 0; if (kvm_nlist(kd, nl) != 0) { @@ -279,9 +279,9 @@ kvm_deadfile_byid(kvm_t *kd, int op, int char *filebuf = NULL; int i, nfiles; - nl[0].n_name = "_filehead"; - nl[1].n_name = "_numfiles"; - nl[2].n_name = "_allprocess"; + nl[0].n_name = "filehead"; + nl[1].n_name = "numfiles"; + nl[2].n_name = "allprocess"; nl[3].n_name = 0; if (kvm_nlist(kd, nl) != 0) { Index: lib/libkvm/kvm_getloadavg.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm_getloadavg.c,v diff -u -p -r1.10 kvm_getloadavg.c --- lib/libkvm/kvm_getloadavg.c 10 Sep 2021 00:02:43 -0000 1.10 +++ lib/libkvm/kvm_getloadavg.c 2 Nov 2026 13:02:32 -0000 @@ -46,9 +46,9 @@ #include "kvm_private.h" static struct nlist nl[] = { - { "_averunnable" }, + { "averunnable" }, #define X_AVERUNNABLE 0 - { "_fscale" }, + { "fscale" }, #define X_FSCALE 1 { "" }, }; Index: lib/libkvm/kvm_i386.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm_i386.c,v diff -u -p -r1.28 kvm_i386.c --- lib/libkvm/kvm_i386.c 1 Dec 2021 16:53:28 -0000 1.28 +++ lib/libkvm/kvm_i386.c 2 Nov 2026 13:02:32 -0000 @@ -124,9 +124,9 @@ _kvm_initvtop(kvm_t *kd) vm->PTD = NULL; - nl[0].n_name = "_PTDpaddr"; - nl[1].n_name = "_PTDsize"; - nl[2].n_name = "_cpu_pae"; + nl[0].n_name = "PTDpaddr"; + nl[1].n_name = "PTDsize"; + nl[2].n_name = "cpu_pae"; nl[3].n_name = NULL; if (kvm_nlist(kd, nl) != 0) { Index: lib/libkvm/kvm_proc2.c =================================================================== RCS file: /OpenBSD/src/lib/libkvm/kvm_proc2.c,v diff -u -p -r1.39 kvm_proc2.c --- lib/libkvm/kvm_proc2.c 8 Jul 2024 13:18:26 -0000 1.39 +++ lib/libkvm/kvm_proc2.c 2 Nov 2026 13:02:32 -0000 @@ -134,8 +134,8 @@ kvm_proclist(kvm_t *kd, int op, int arg, op &= ~KERN_PROC_SHOW_THREADS; /* Anchor a time to compare process starting times from. */ - nl[0].n_name = "_time_second"; - nl[1].n_name = "_time_uptime"; + nl[0].n_name = "time_second"; + nl[1].n_name = "time_uptime"; nl[2].n_name = NULL; if (kvm_nlist(kd, nl) != 0) { for (i = 0; nl[i].n_type != 0; ++i) @@ -476,10 +476,10 @@ kvm_getprocs(kvm_t *kd, int op, int arg, } memset(nl, 0, sizeof(nl)); - nl[0].n_name = "_nthreads"; - nl[1].n_name = "_nprocesses"; - nl[2].n_name = "_allprocess"; - nl[3].n_name = "_zombprocess"; + nl[0].n_name = "nthreads"; + nl[1].n_name = "nprocesses"; + nl[2].n_name = "allprocess"; + nl[3].n_name = "zombprocess"; nl[4].n_name = NULL; if (kvm_nlist(kd, nl) != 0) { Index: regress/sys/arch/amd64/fpu/fxproc0.c =================================================================== RCS file: /OpenBSD/src/regress/sys/arch/amd64/fpu/fxproc0.c,v diff -u -p -r1.2 fxproc0.c --- regress/sys/arch/amd64/fpu/fxproc0.c 13 Dec 2021 16:56:49 -0000 1.2 +++ regress/sys/arch/amd64/fpu/fxproc0.c 2 Nov 2026 13:02:32 -0000 @@ -49,7 +49,7 @@ main(int argc, char *argv[]) char *memf, *nlistf; kvm_t *kd; int ch; - struct nlist nl[] = { { .n_name = "_proc0" }, { .n_name = NULL } }; + struct nlist nl[] = { { .n_name = "proc0" }, { .n_name = NULL } }; memf = nlistf = NULL; while ((ch = getopt(argc, argv, "M:N:")) != -1) { Index: regress/sys/arch/amd64/dump_tables/dump_tables.c =================================================================== RCS file: /OpenBSD/src/regress/sys/arch/amd64/dump_tables/dump_tables.c,v diff -u -p -r1.9 dump_tables.c --- regress/sys/arch/amd64/dump_tables/dump_tables.c 7 Jun 2026 14:22:07 -0000 1.9 +++ regress/sys/arch/amd64/dump_tables/dump_tables.c 2 Nov 2026 13:02:32 -0000 @@ -79,8 +79,8 @@ int meltdown, hide_direct, hide_pte, rep int user_proc; struct nlist nl[] = { - { "_proc0paddr" }, - { "_pmap_direct_base" }, + { "proc0paddr" }, + { "pmap_direct_base" }, { NULL } }; Index: sbin/dmesg/dmesg.c =================================================================== RCS file: /OpenBSD/src/sbin/dmesg/dmesg.c,v diff -u -p -r1.33 dmesg.c --- sbin/dmesg/dmesg.c 4 Dec 2022 23:50:46 -0000 1.33 +++ sbin/dmesg/dmesg.c 2 Nov 2026 13:02:32 -0000 @@ -49,7 +49,7 @@ #ifndef NOKVM struct nlist nl[] = { #define X_MSGBUF 0 - { "_msgbufp" }, + { "msgbufp" }, { NULL }, }; #endif Index: sbin/savecore/savecore.c =================================================================== RCS file: /OpenBSD/src/sbin/savecore/savecore.c,v diff -u -p -r1.67 savecore.c --- sbin/savecore/savecore.c 31 May 2025 20:25:33 -0000 1.67 +++ sbin/savecore/savecore.c 2 Nov 2026 13:02:32 -0000 @@ -59,32 +59,32 @@ extern FILE *zopen(const char *fname, co struct nlist current_nl[] = { /* Namelist for currently running system. */ #define X_DUMPDEV 0 - { "_dumpdev" }, + { "dumpdev" }, #define X_DUMPLO 1 - { "_dumplo" }, + { "dumplo" }, #define X_TIME 2 - { "_time_second" }, + { "time_second" }, #define X_DUMPSIZE 3 - { "_dumpsize" }, + { "dumpsize" }, #define X_VERSION 4 - { "_version" }, + { "version" }, #define X_PANICSTR 5 - { "_panicstr" }, + { "panicstr" }, #define X_DUMPMAG 6 - { "_dumpmag" }, + { "dumpmag" }, { NULL }, }; int cursyms[] = { X_DUMPDEV, X_DUMPLO, X_VERSION, X_DUMPMAG, -1 }; int dumpsyms[] = { X_TIME, X_DUMPSIZE, X_VERSION, X_PANICSTR, X_DUMPMAG, -1 }; struct nlist dump_nl[] = { /* Name list for dumped system. */ - { "_dumpdev" }, /* Entries MUST be the same as */ - { "_dumplo" }, /* those in current_nl[]. */ - { "_time_second" }, - { "_dumpsize" }, - { "_version" }, - { "_panicstr" }, - { "_dumpmag" }, + { "dumpdev" }, /* Entries MUST be the same as */ + { "dumplo" }, /* those in current_nl[]. */ + { "time_second" }, + { "dumpsize" }, + { "version" }, + { "panicstr" }, + { "dumpmag" }, { NULL }, }; Index: usr.bin/ipcs/ipcs.c =================================================================== RCS file: /OpenBSD/src/usr.bin/ipcs/ipcs.c,v diff -u -p -r1.30 ipcs.c --- usr.bin/ipcs/ipcs.c 10 Oct 2026 14:33:52 -0000 1.30 +++ usr.bin/ipcs/ipcs.c 2 Nov 2026 13:02:32 -0000 @@ -661,19 +661,19 @@ ipcs_kvm(void) kvm_t *kd; int i; struct nlist symbols[] = { - {"_sema"}, + {"sema"}, #define X_SEMA 0 - {"_seminfo"}, + {"seminfo"}, #define X_SEMINFO 1 - {"_semu"}, + {"semu"}, #define X_SEMU 2 - {"_msginfo"}, + {"msginfo"}, #define X_MSGINFO 3 - {"_msg_queues"}, + {"msg_queues"}, #define X_MSG_QUEUES 4 - {"_shminfo"}, + {"shminfo"}, #define X_SHMINFO 5 - {"_shmsegs"}, + {"shmsegs"}, #define X_SHMSEGS 6 {NULL} }; Index: usr.bin/netstat/main.c =================================================================== RCS file: /OpenBSD/src/usr.bin/netstat/main.c,v diff -u -p -r1.126 main.c --- usr.bin/netstat/main.c 16 Jul 2026 12:35:32 -0000 1.126 +++ usr.bin/netstat/main.c 2 Nov 2026 13:02:32 -0000 @@ -55,11 +55,11 @@ struct nlist nl[] = { #define N_AFMAP 0 - { "_afmap"}, + { "afmap"}, #define N_AF2IDX 1 - { "_af2idx" }, + { "af2idx" }, #define N_AF2IDXMAX 2 - { "_af2idx_max" }, + { "af2idx_max" }, { "" } }; Index: usr.bin/nfsstat/nfsstat.c =================================================================== RCS file: /OpenBSD/src/usr.bin/nfsstat/nfsstat.c,v diff -u -p -r1.38 nfsstat.c --- usr.bin/nfsstat/nfsstat.c 8 Mar 2023 04:43:12 -0000 1.38 +++ usr.bin/nfsstat/nfsstat.c 2 Nov 2026 13:02:32 -0000 @@ -60,7 +60,7 @@ struct nlist nl[] = { #define N_NFSSTAT 0 - { "_nfsstats" }, + { "nfsstats" }, { "" }, }; kvm_t *kd; Index: usr.bin/vmstat/dkstats.c =================================================================== RCS file: /OpenBSD/src/usr.bin/vmstat/dkstats.c,v diff -u -p -r1.42 dkstats.c --- usr.bin/vmstat/dkstats.c 6 May 2024 16:54:22 -0000 1.42 +++ usr.bin/vmstat/dkstats.c 2 Nov 2026 13:02:32 -0000 @@ -53,19 +53,19 @@ #if !defined(NOKVM) static struct nlist namelist[] = { #define X_TK_NIN 0 /* sysctl */ - { "_tk_nin" }, + { "tk_nin" }, #define X_TK_NOUT 1 /* sysctl */ - { "_tk_nout" }, + { "tk_nout" }, #define X_CP_TIME 2 /* sysctl */ - { "_cp_time" }, + { "cp_time" }, #define X_HZ 3 /* sysctl */ - { "_hz" }, + { "hz" }, #define X_STATHZ 4 /* sysctl */ - { "_stathz" }, + { "stathz" }, #define X_DISK_COUNT 5 /* sysctl */ - { "_disk_count" }, + { "disk_count" }, #define X_DISKLIST 6 /* sysctl */ - { "_disklist" }, + { "disklist" }, { NULL }, }; #define KVM_ERROR(_string) { \ Index: usr.bin/vmstat/vmstat.c =================================================================== RCS file: /OpenBSD/src/usr.bin/vmstat/vmstat.c,v diff -u -p -r1.160 vmstat.c --- usr.bin/vmstat/vmstat.c 21 May 2025 03:04:14 -0000 1.160 +++ usr.bin/vmstat/vmstat.c 2 Nov 2026 13:02:32 -0000 @@ -61,21 +61,21 @@ struct nlist namelist[] = { #define X_UVMEXP 0 /* sysctl */ - { "_uvmexp" }, + { "uvmexp" }, #define X_TIME_UPTIME 1 - { "_time_uptime" }, + { "time_uptime" }, #define X_NCHSTATS 2 /* sysctl */ - { "_nchstats" }, + { "nchstats" }, #define X_KMEMSTAT 3 /* sysctl */ - { "_kmemstats" }, + { "kmemstats" }, #define X_KMEMBUCKETS 4 /* sysctl */ - { "_bucket" }, + { "bucket" }, #define X_FORKSTAT 5 /* sysctl */ - { "_forkstat" }, + { "forkstat" }, #define X_POOLHEAD 6 /* sysctl */ - { "_pool_head" }, + { "pool_head" }, #define X_NAPTIME 7 - { "_naptime" }, + { "naptime" }, { NULL }, }; Index: usr.sbin/acpidump/acpidump.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/acpidump/acpidump.c,v diff -u -p -r1.25 acpidump.c --- usr.sbin/acpidump/acpidump.c 11 Sep 2022 10:40:35 -0000 1.25 +++ usr.sbin/acpidump/acpidump.c 2 Nov 2026 13:02:32 -0000 @@ -714,7 +714,7 @@ efi_acpi_addr(void) kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); if (kd == NULL) goto on_error; - nl[0].n_name = "_efi_acpi_table"; + nl[0].n_name = "efi_acpi_table"; if (kvm_nlist(kd, nl) != 0) goto on_error; if (kvm_read(kd, nl[0].n_value, &table, sizeof(table)) == -1) @@ -745,7 +745,7 @@ efi_acpi_addr(void) kd = kvm_openfiles(NULL, NULL, NULL, O_RDONLY, NULL); if (kd == NULL) goto on_error; - nl[0].n_name = "_bios_efiinfo"; + nl[0].n_name = "bios_efiinfo"; if (kvm_nlist(kd, nl) != 0) goto on_error; if (kvm_read(kd, nl[0].n_value, &ptr, sizeof(ptr)) == -1) Index: usr.sbin/config/ukc.h =================================================================== RCS file: /OpenBSD/src/usr.sbin/config/ukc.h,v diff -u -p -r1.17 ukc.h --- usr.sbin/config/ukc.h 6 Sep 2019 21:30:31 -0000 1.17 +++ usr.sbin/config/ukc.h 2 Nov 2026 13:02:32 -0000 @@ -49,24 +49,24 @@ #ifdef UKC_MAIN struct nlist nl[] = { - { "_locnames" }, - { "_locnamp" }, - { "_cfroots" }, - { "_cfroots_size" }, - { "_pv_size" }, - { "_pv" }, - { "_cfdata" }, - { "_kernel_text" }, - { "_version" }, - { "_extraloc" }, - { "_rextraloc" }, - { "_textraloc" }, - { "_userconf_histlen" }, - { "_userconf_history" }, - { "_pdevnames" }, - { "_pdevnames_size" }, - { "_pdevinit" }, - { "_nkmempages" }, + { "locnames" }, + { "locnamp" }, + { "cfroots" }, + { "cfroots_size" }, + { "pv_size" }, + { "pv" }, + { "cfdata" }, + { "kernel_text" }, + { "version" }, + { "extraloc" }, + { "rextraloc" }, + { "textraloc" }, + { "userconf_histlen" }, + { "userconf_history" }, + { "pdevnames" }, + { "pdevnames_size" }, + { "pdevinit" }, + { "nkmempages" }, { NULL }, }; int maxdev = 0; Index: usr.sbin/installboot/i386_installboot.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/installboot/i386_installboot.c,v diff -u -p -r1.51 i386_installboot.c --- usr.sbin/installboot/i386_installboot.c 17 Sep 2025 16:12:10 -0000 1.51 +++ usr.sbin/installboot/i386_installboot.c 2 Nov 2026 13:02:32 -0000 @@ -76,14 +76,14 @@ char *blkstore; size_t blksize; struct sym_data pbr_symbols[] = { - {"_fs_bsize_p", 2}, - {"_fs_bsize_s", 2}, - {"_fsbtodb", 1}, - {"_p_offset", 4}, - {"_inodeblk", 4}, - {"_inodedbl", 4}, - {"_nblocks", 2}, - {"_blkincr", 1}, + {"fs_bsize_p", 2}, + {"fs_bsize_s", 2}, + {"fsbtodb", 1}, + {"p_offset", 4}, + {"inodeblk", 4}, + {"inodedbl", 4}, + {"nblocks", 2}, + {"blkincr", 1}, {NULL} }; Index: usr.sbin/kgmon/kgmon.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/kgmon/kgmon.c,v diff -u -p -r1.26 kgmon.c --- usr.sbin/kgmon/kgmon.c 28 Jun 2019 13:32:48 -0000 1.26 +++ usr.sbin/kgmon/kgmon.c 2 Nov 2026 13:02:32 -0000 @@ -48,9 +48,9 @@ struct nlist nl[] = { #define N_GMONPARAM 0 - { "__gmonparam" }, + { "_gmonparam" }, #define N_PROFHZ 1 - { "_profhz" }, + { "profhz" }, { NULL } }; Index: usr.sbin/procmap/procmap.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/procmap/procmap.c,v diff -u -p -r1.74 procmap.c --- usr.sbin/procmap/procmap.c 20 Oct 2024 11:21:24 -0000 1.74 +++ usr.sbin/procmap/procmap.c 2 Nov 2026 13:02:32 -0000 @@ -163,17 +163,17 @@ struct kbit { #define KDEREF(kd, item) _KDEREF((kd), A(item), D(item, data), S(item)) struct nlist nl[] = { - { "_maxsmap" }, + { "maxsmap" }, #define NL_MAXSSIZ 0 - { "_uvm_vnodeops" }, + { "uvm_vnodeops" }, #define NL_UVM_VNODEOPS 1 - { "_uvm_deviceops" }, + { "uvm_deviceops" }, #define NL_UVM_DEVICEOPS 2 - { "_aobj_pager" }, + { "aobj_pager" }, #define NL_AOBJ_PAGER 3 - { "_kernel_map" }, + { "kernel_map" }, #define NL_KERNEL_MAP 4 - { "_nclruhead" }, + { "nclruhead" }, #define NL_NCLRUHEAD 5 { NULL } }; Index: usr.sbin/pstat/pstat.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/pstat/pstat.c,v diff -u -p -r1.132 pstat.c --- usr.sbin/pstat/pstat.c 6 Aug 2026 20:41:11 -0000 1.132 +++ usr.sbin/pstat/pstat.c 2 Nov 2026 13:02:32 -0000 @@ -71,17 +71,17 @@ struct nlist vnodenl[] = { #define FNL_NFILE 0 /* sysctl */ - {"_numfiles"}, + {"numfiles"}, #define FNL_MAXFILE 1 /* sysctl */ - {"_maxfiles"}, + {"maxfiles"}, #define TTY_NTTY 2 /* sysctl */ - {"_tty_count"}, + {"tty_count"}, #define V_NUMV 3 /* sysctl */ - { "_numvnodes" }, + {"numvnodes"}, #define TTY_TTYLIST 4 /* sysctl */ - {"_ttylist"}, + {"ttylist"}, #define V_MOUNTLIST 5 /* no sysctl */ - { "_mountlist" }, + {"mountlist"}, { NULL } }; Index: usr.sbin/trpt/trpt.c =================================================================== RCS file: /OpenBSD/src/usr.sbin/trpt/trpt.c,v diff -u -p -r1.40 trpt.c --- usr.sbin/trpt/trpt.c 8 Mar 2023 04:43:15 -0000 1.40 +++ usr.sbin/trpt/trpt.c 2 Nov 2026 13:02:32 -0000 @@ -100,9 +100,9 @@ struct nlist nl[] = { #define N_TCP_DEBUG 0 /* no sysctl */ - { "_tcp_debug" }, + { "tcp_debug" }, #define N_TCP_DEBX 1 /* no sysctl */ - { "_tcp_debx" }, + { "tcp_debx" }, { NULL }, };