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