kristapsdz/openrsync

"undefined reference to `major'" on debian 10 buster

Closed this issue · 1 comments

job commented

On Debian 10 (Buster), I get the following error

root@rpki0:~/openrsync# ./configure
config.log: writing...
configure.local: no (fully automatic configuration)
arc4random: no
b64_ntop: yes (with -lresolv)
capsicum: no
err: yes 
explicit_bzero: yes 
getprogname: no
INFTIM: no
md5: no
memmem: yes 
memrchr: yes 
memset_s: no
PATH_MAX: yes 
pledge: no
program_invocation_short_name: yes 
reallocarray: no
recallocarray: no
sandbox_init: no
seccomp-filter: yes 
SOCK_NONBLOCK: yes 
strlcat: no
strlcpy: no
strndup: yes 
strnlen: yes 
strtonum: no
sys_queue: no
systrace: no
unveil: no
zlib: no
__progname: yes 
config.h: written
Makefile.configure: written
root@rpki0:~/openrsync# make
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o blocks.o blocks.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o client.o client.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o compats.o compats.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o downloader.o downloader.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o fargs.o fargs.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o flist.o flist.c
In file included from �[01m�[Kflist.c:34�[m�[K:
�[01m�[Kflist.c:�[m�[K In function ‘�[01m�[Kflist_recv�[m�[K’:
�[01m�[Kflist.c:741:4:�[m�[K �[01;35m�[Kwarning: �[m�[Kimplicit declaration of function ‘�[01m�[Kmajor�[m�[K’ [�[01;35m�[K-Wimplicit-function-declaration�[m�[K]
    �[01;35m�[Kmajor�[m�[K(ff->st.rdev), minor(ff->st.rdev));
    �[01;35m�[K^~~~~�[m�[K
�[01m�[Kextern.h:240:45:�[m�[K �[01;36m�[Knote: �[m�[Kin definition of macro ‘�[01m�[KLOG3�[m�[K’
  rsync_log(__FILE__, __LINE__, 2, (_fmt), ##�[01;36m�[K__VA_ARGS__�[m�[K)
                                             �[01;36m�[K^~~~~~~~~~~�[m�[K
�[01m�[Kflist.c:741:24:�[m�[K �[01;35m�[Kwarning: �[m�[Kimplicit declaration of function ‘�[01m�[Kminor�[m�[K’; did you mean ‘�[01m�[Kmknod�[m�[K’? [�[01;35m�[K-Wimplicit-function-declaration�[m�[K]
    major(ff->st.rdev), �[01;35m�[Kminor�[m�[K(ff->st.rdev));
                        �[01;35m�[K^~~~~�[m�[K
�[01m�[Kextern.h:240:45:�[m�[K �[01;36m�[Knote: �[m�[Kin definition of macro ‘�[01m�[KLOG3�[m�[K’
  rsync_log(__FILE__, __LINE__, 2, (_fmt), ##�[01;36m�[K__VA_ARGS__�[m�[K)
                                             �[01;36m�[K^~~~~~~~~~~�[m�[K
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o hash.o hash.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o ids.o ids.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o io.o io.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o log.o log.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o md4.o md4.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o misc.o misc.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o mkpath.o mkpath.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o mktemp.o mktemp.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o receiver.o receiver.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o sender.o sender.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o server.o server.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o session.o session.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o socket.o socket.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o symlinks.o symlinks.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o uploader.o uploader.c
cc -g -W -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Wwrite-strings -Wno-unused-parameter   -c -o main.o main.c
cc -o openrsync blocks.o client.o compats.o downloader.o fargs.o flist.o hash.o ids.o io.o log.o md4.o misc.o mkpath.o mktemp.o receiver.o sender.o server.o session.o socket.o symlinks.o uploader.o main.o -lm
/usr/bin/ld: flist.o: in function `flist_recv':
/root/openrsync/flist.c:737: undefined reference to `minor'
/usr/bin/ld: /root/openrsync/flist.c:737: undefined reference to `major'
collect2: error: ld returned 1 exit status
make: *** [Makefile:34: openrsync] Error 1
root@rpki0:~/openrsync#

New versions of glibc (since 2.28) and musl (since 1.1.23) actually no longer provide a definition of major by including sys/types.h. It's a bit unfortunate since on Linux, you now need to include sys/sysmacros.h, and on BSDs, this header doesn't exist.

You could add a configure test to check which header it is in. A trick I've been using, which was suggested by Rich Felker, is

#include <sys/types.h>
#ifndef major
#include <sys/sysmacros.h>
#endif

which works on Linux and BSDs with no configure test.