NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
lib/59805: undefined reference to `_kvm_kvatop_i386pae' when building with -m32 on amd64
>Number: 59805
>Category: lib
>Synopsis: undefined reference to `_kvm_kvatop_i386pae' when building with -m32 on amd64
>Confidential: no
>Severity: serious
>Priority: low
>Responsible: lib-bug-people
>State: open
>Class: sw-bug
>Submitter-Id: net
>Arrival-Date: Sat Nov 29 20:45:00 +0000 2025
>Originator: Ivan Shmakov
>Release: NetBSD 10.1
>Organization:
Dbus-free station.
>Environment:
Architecture: x86_64
Machine: amd64
>Description:
When attempting to build software for i386 on an amd64 host
with -m32, linking with -lkvm fails like this (pkgsrc-2025Q3/
sysutils/xosview; note the last two lines):
c++ -m32 -Wl,-zrelro -lkvm -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -o xosview Host.o Xrm.o bitfieldmeter.o bitmeter.o defaultstring.o fieldmeter.o fieldmeterdecay.o fieldmetergraph.o llist.o main.o meter.o xosview.o xwin.o sensorfieldmeter.o bsd/MeterMaker.o bsd/btrymeter.o bsd/cpumeter.o bsd/diskmeter.o bsd/intmeter.o bsd/intratemeter.o bsd/kernel.o bsd/loadmeter.o bsd/memmeter.o bsd/netmeter.o bsd/pagemeter.o bsd/swapmeter.o bsd/sensor.o bsd/coretemp.o -lkvm -lprop -lX11 -lXpm -lm
ld: bsd/kernel.o: in function `BSDGetSensor(char const*, char const*, float*, char*)':
kernel.cc:(.text+0x1434): warning: this program uses prop_string_cstring_nocopy(), which is deprecated; use prop_string_value() instead.
ld: bsd/kernel.o: in function `BSDGetBatteryInfo(int*, unsigned int*)':
kernel.cc:(.text+0x1a6c): warning: this program uses prop_string_equals_cstring(), which is deprecated; prop_string_equals_string() instead.
ld: bsd/kernel.o: in function `BSDGetCPUTemperature(float*, float*)':
kernel.cc:(.text+0x11b3): warning: this program uses prop_number_integer_value(), which is deprecated; use prop_number_signed_value() instead.
ld: kernel.cc:(.text+0x10f5): warning: this program uses prop_dictionary_keysym_cstring_nocopy(), which is deprecated; use prop_dictionary_keysym_value() instead.
ld: /usr/lib/../lib/i386/libkvm.so: undefined reference to `_kvm_kvatop_i386pae'
gmake: *** [Makefile:130: xosview] Error 1
The relevant linker invocation in work/.work.log:
[*] c++ -m32 -Wl,-zrelro -lkvm -Wl,-R/usr/pkg/lib -L/usr/pkg/lib -o xosview Host.o Xrm.o bitfieldmeter.o bitmeter.o defaultstring.o fieldmeter.o fieldmeterdecay.o fieldmetergraph.o llist.o main.o meter.o xosview.o xwin.o sensorfieldmeter.o bsd/MeterMaker.o bsd/btrymeter.o bsd/cpumeter.o bsd/diskmeter.o bsd/intmeter.o bsd/intratemeter.o bsd/kernel.o bsd/loadmeter.o bsd/memmeter.o bsd/netmeter.o bsd/pagemeter.o bsd/swapmeter.o bsd/sensor.o bsd/coretemp.o -lkvm -lprop -lX11 -lXpm -lm
<.> /.../pkgsrc/sysutils/xosview/work/.gcc/bin/g++ -fstack-protector-strong -D_FORTIFY_SOURCE=2 -Wl,-zrelro -fPIC -m32 -Wl,-zrelro -lkvm -Wl,-rpath,/usr/pkg/lib -L/.../pkgsrc/sysutils/xosview/work/.buildlink/lib -o xosview Host.o Xrm.o bitfieldmeter.o bitmeter.o defaultstring.o fieldmeter.o fieldmeterdecay.o fieldmetergraph.o llist.o main.o meter.o xosview.o xwin.o sensorfieldmeter.o bsd/MeterMaker.o bsd/btrymeter.o bsd/cpumeter.o bsd/diskmeter.o bsd/intmeter.o bsd/intratemeter.o bsd/kernel.o bsd/loadmeter.o bsd/memmeter.o bsd/netmeter.o bsd/pagemeter.o bsd/swapmeter.o bsd/sensor.o bsd/coretemp.o -lkvm -lprop -lX11 -lXpm -lm -std=gnu++98 -I/.../pkgsrc/sysutils/xosview/work/.buildlink/include -pie
And indeed, examining libkvm.so with nm(1) gives:
$ nm /usr/lib/i386/libkvm.so
...
00004314 T _kvm_kvatop
00004159 T _kvm_kvatop_i386
U _kvm_kvatop_i386pae
0000467d T _kvm_malloc
00004384 T _kvm_mdopen
...
The symbol /is/ defined in the version of the library from
i386/binary/sets/base.tgz :
00004005 T _kvm_kvatop_i386pae
Same failure happens for sysutils/lsof and devel/cmake.
(On the plus side, it prompted me to look how many packages
I can build without cmake somewhere in their dependency graph.
Turns out, with a bit of patching, there're quite a few.)
>How-To-Repeat:
I'm using the following /etc/mk.conf fragment so that -m32
is used when building pkgsrc packages. It works surprisingly
well (the packages I've tried that have test suites generally
pass them), though every once in a while there'll be a package
that ignores the flags for one reason or another.
CFLAGS += -m32 -mcpu=i486 -mtune=i586
## Some packages will use CFLAGS for CXX and linking, but some will not
CXXFLAGS += -m32 -mcpu=i486 -mtune=i586
LDFLAGS += -m32
## Imake-based packages require these instead
MAKE_FLAGS += CCOPTIONS="-m32 -mcpu=i486 -mtune=i586"
MAKE_FLAGS += CXXOPTIONS="-m32 -mcpu=i486 -mtune=i586"
MACHINE_ARCH = i386
MACHINE_GNU_ARCH = i386
## NB: there is /usr/lib/i386, but no /usr/X11R7/lib/i386
X11_TYPE = modular
Once pkgsrc is set up:
$ cd sysutils/xosview && make build
$ cd sysutils/lsof && make build
$ cd devel/cmake && make build
>Fix:
I haven't tried, but I /think/ that changing usr/src/lib/
libkvm/Makefile as follows might solve it. (No idea about
LINTFLAGS+=-w, though.)
--- src/lib/libkvm/Makefile.~1~ 2016-01-24 16:07:48.000000000 +0000
+++ src/lib/libkvm/Makefile 2025-11-29 20:27:37 +0000
@@ -32,7 +32,7 @@
@false
.endif
-.if ${MACHINE_ARCH} == "i386"
+.if (${MACHINE_ARCH} == "i386" || ${MACHINE_ARCH} == "amd64")
LINTFLAGS+=-w
SRCS+= kvm_i386pae.c # Hook PAE support in the i386 build
.endif
Home |
Main Index |
Thread Index |
Old Index