Description
What type of defect/bug is this?
incorrect 3rd party API usage
How can the issue be reproduced?
When I try to build freeradius-server-3.0.27 with the confiugre-option --without-shared-libs, I get link errors for radattr and radeapclient:
$ tar -xf.../freeradius-server-3.0.27.tar.gz
$ cd freeradius-server-3.0.27
$ ./configure --without-shared-libs
...
$ make VERBOSE=1
...
$ LINK build/bin/radeapclient
build/make/jlibtool --silent --mode=link gcc -o build/bin/radeapclient -static build/objs/src/modules/rlm_eap/radeapclient.lo build/objs/src/main/files.lo build/objs/src/main/threads.lo build/objs/src/main/version.lo build/objs/src/main/cb.lo build/objs/src/main/tls.lo build/lib/libfreeradius-radius.la build/lib/libfreeradius-server.la build/lib/libfreeradius-eap.la -lcrypto -lssl -ltalloc -latomic -lpcre -lcap -lnsl -lresolv -ldl -lpthread -lreadline -lcrypto -lssl
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-server.a(log.o):/home/mkl/tmp/freeradius-server-3.0.27/src/main/log.c:49: multiple definition of `rad_debug_lvl'; build/objs/src/modules/rlm_eap/radeapclient.o:/home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/radeapclient.c:77: first defined here
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-eap.a(eapcrypto.o): in function `eapsim_calculate_keys':
/home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/eapcrypto.c:85:(.text+0xf4): undefined reference to `fr_sha1_init'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/eapcrypto.c:86:(.text+0x10d): undefined reference to `fr_sha1_update'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/eapcrypto.c:87:(.text+0x118): undefined reference to `fr_sha1_final'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-eap.a(eapsimlib.o): in function `map_eapsim_basictypes':
/home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/eapsimlib.c:255:(.text+0x35e): undefined reference to `fr_hmac_sha1'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-eap.a(eapsimlib.o): in function `eapsim_checkmac':
/home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/eapsimlib.c:462:(.text+0x7cb): undefined reference to `fr_hmac_sha1'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-eap.a(fips186prf.o): in function `fips186_2prf':
/home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:134:(.text+0xc2): undefined reference to `fr_sha1_init'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:139:(.text+0xf8): undefined reference to `fr_sha1_transform'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:143:(.text+0x104): undefined reference to `fr_sha1_final_no_len'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:153:(.text+0x179): undefined reference to `fr_sha1_init'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:158:(.text+0x1af): undefined reference to `fr_sha1_transform'
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: /home/mkl/tmp/freeradius-server-3.0.27/src/modules/rlm_eap/libeap/fips186prf.c:162:(.text+0x1bb): undefined reference to `fr_sha1_final_no_len'
collect2: error: ld returned 1 exit status
make: *** [scripts/boiler.mk:638: build/bin/radeapclient] Error 1
$
The cause is a wrong order of libraries on the linker command line:
.../libfreeradius-radius.la .../libfreeradius-server.la .../libfreeradius-eap.la
libfreeradius-radius.a defines fr_sha1_init, that is needed in libfreeradius-eap.a. The linker has to process libfreeradius-eap.a first to satisfy this undefined symbol.
This can be fixed using this patch:
*** ../freeradius-server-3.0.27.orig/src/modules/rlm_eap/radeapclient.mk 2024-07-08 23:21:42.000000000 +0200
--- src/modules/rlm_eap/radeapclient.mk 2025-06-04 16:03:19.901831694 +0200
***************
*** 5,18 ****
${top_srcdir}/src/main/threads.c \
${top_srcdir}/src/main/version.c
! TGT_PREREQS := libfreeradius-radius.a libfreeradius-server.a
TGT_LDLIBS := $(LIBS)
#
# For future work, if we want radeapclient to become radclient
#
ifneq "$(filter libfreeradius-eap%,${ALL_TGTS})" ""
! TGT_PREREQS += libfreeradius-eap.a
ifneq ($(OPENSSL_LIBS),)
SOURCES += ${top_srcdir}/src/main/cb.c ${top_srcdir}/src/main/tls.c
--- 5,18 ----
${top_srcdir}/src/main/threads.c \
${top_srcdir}/src/main/version.c
! TGT_PREREQS :=
TGT_LDLIBS := $(LIBS)
#
# For future work, if we want radeapclient to become radclient
#
ifneq "$(filter libfreeradius-eap%,${ALL_TGTS})" ""
! TGT_PREREQS += libfreeradius-eap.a libfreeradius-server.a libfreeradius-radius.a
ifneq ($(OPENSSL_LIBS),)
SOURCES += ${top_srcdir}/src/main/cb.c ${top_srcdir}/src/main/tls.c
But now, I get a duplicate symbol error:
$ make -k
LINK build/bin/radeapclient
/usr/lib/gcc/x86_64-pc-linux-gnu/13/../../../../x86_64-pc-linux-gnu/bin/ld: build/lib/.libs/libfreeradius-server.a(log.o):/home/mkl/tmp/freeradius-server-3.0.27.mkl/src/main/log.c:49: multiple definition of `rad_debug_lvl'; build/objs/src/modules/rlm_eap/radeapclient.o:/home/mkl/tmp/freeradius-server-3.0.27.mkl/src/modules/rlm_eap/radeapclient.c:77: first defined here
collect2: error: ld returned 1 exit status
make: *** [scripts/boiler.mk:638: build/bin/radeapclient] Error 1
make: Target 'all' not remade because of errors.
$
radattr also fails to link, and this patch fixes that.
*** ../freeradius-server-3.0.27.orig/src/main/radattr.mk 2024-07-08 23:21:42.000000000 +0200
--- src/main/radattr.mk 2025-06-04 15:58:58.197378019 +0200
***************
*** 1,10 ****
TARGET := radattr
SOURCES := radattr.c
! TGT_PREREQS := libfreeradius-server.a libfreeradius-radius.a
ifneq "$(WITH_DHCP)" "no"
! TGT_PREREQS += libfreeradius-dhcp.a
endif
TGT_LDLIBS := $(LIBS)
--- 1,10 ----
TARGET := radattr
SOURCES := radattr.c
! TGT_PREREQS :=
ifneq "$(WITH_DHCP)" "no"
! TGT_PREREQS += libfreeradius-dhcp.a libfreeradius-radius.a libfreeradius-server.a
endif
TGT_LDLIBS := $(LIBS)
A possible fix for the duplicate symbol problem might be to make the variable rad_debug_lvl external in radeapclient.c;
*** ../freeradius-server-3.0.27.orig/src/modules/rlm_eap/radeapclient.c 2024-07-08 23:21:42.000000000 +0200
--- src/modules/rlm_eap/radeapclient.c 2025-06-04 16:02:28.853548098 +0200
***************
*** 74,80 ****
#include <freeradius-devel/tls.h>
#endif
! log_lvl_t rad_debug_lvl = 0;
//TODO: move structures to a header file.
--- 74,80 ----
#include <freeradius-devel/tls.h>
#endif
! extern log_lvl_t rad_debug_lvl;
//TODO: move structures to a header file.
Log output from the FreeRADIUS daemon
-
Relevant log output from client utilities
No response