Skip to content

drivers: Fix undefined references with slibtool. - #1001

Merged
jimklimov merged 1 commit into
networkupstools:masterfrom
orbea:libtool
Mar 29, 2021
Merged

jimklimov merged 1 commit into
networkupstools:masterfrom
orbea:libtool

Conversation

@orbea

@orbea orbea commented Mar 27, 2021 •

Copy link
Copy Markdown
Contributor

When building the nut drivers with slibtool (https://dev.midipix.org/cross/slibtool) it fails with the same issues in several places.

rdlibtool --tag=CC --mode=link gcc -I../include -I/usr/include/libusb-1.0 -g -O2 -Wall -Wsign-compare -Wno-error -o al175 al175.o ../common/libcommon.la ../common/libparseconf.la main.o dstate.o serial.o -lpthread

rdlibtool: lconf: {.name="libtool"}.
rdlibtool: fdcwd: {.fdcwd=AT_FDCWD, .realpath="/tmp/nut/drivers"}.
rdlibtool: lconf: fstatat(AT_FDCWD,".",...) = 0 {.st_dev = 45, .st_ino = 557816}.
rdlibtool: lconf: openat(AT_FDCWD,"libtool",O_RDONLY,0) = -1 [ENOENT].
rdlibtool: lconf: openat(AT_FDCWD,"../",O_DIRECTORY,0) = 3.
rdlibtool: lconf: fstat(3,...) = 0 {.st_dev = 45, .st_ino = 557467}.
rdlibtool: lconf: openat(3,"libtool",O_RDONLY,0) = 4.
rdlibtool: lconf: found "/tmp/nut/libtool".
rdlibtool: link: gcc al175.o ../common/.libs/libcommon.a ../common/.libs/libparseconf.a main.o dstate.o serial.o -I../include -I/usr/include/libusb-1.0 -g -O2 -Wall -Wsign-compare -Wno-error -lpthread -o .libs/al175
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: main.o: in function `main':
/tmp/nut/drivers/main.c:542: undefined reference to `read_upsconf'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `sock_disconnect':
/tmp/nut/drivers/dstate.c:151: undefined reference to `pconf_finish'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:151: undefined reference to `pconf_finish'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `sock_read':
/tmp/nut/drivers/dstate.c:534: undefined reference to `pconf_char'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `sock_disconnect':
/tmp/nut/drivers/dstate.c:151: undefined reference to `pconf_finish'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `sock_connect':
/tmp/nut/drivers/dstate.c:291: undefined reference to `pconf_init'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_setinfo':
/tmp/nut/drivers/dstate.c:718: undefined reference to `state_setinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_addenum':
/tmp/nut/drivers/dstate.c:749: undefined reference to `state_addenum'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_setflags':
/tmp/nut/drivers/dstate.c:779: undefined reference to `state_tree_find'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_addflags':
/tmp/nut/drivers/dstate.c:818: undefined reference to `state_getflags'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_addrange':
/tmp/nut/drivers/dstate.c:762: undefined reference to `state_addrange'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delflags':
/tmp/nut/drivers/dstate.c:836: undefined reference to `state_getflags'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_setaux':
/tmp/nut/drivers/dstate.c:857: undefined reference to `state_tree_find'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_addcmd':
/tmp/nut/drivers/dstate.c:883: undefined reference to `state_addcmd'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delinfo':
/tmp/nut/drivers/dstate.c:895: undefined reference to `state_delinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delenum':
/tmp/nut/drivers/dstate.c:909: undefined reference to `state_delenum'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delrange':
/tmp/nut/drivers/dstate.c:923: undefined reference to `state_delrange'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delcmd':
/tmp/nut/drivers/dstate.c:937: undefined reference to `state_delcmd'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_free':
/tmp/nut/drivers/dstate.c:949: undefined reference to `state_infofree'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:952: undefined reference to `state_cmdfree'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `sock_disconnect':
/tmp/nut/drivers/dstate.c:151: undefined reference to `pconf_finish'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_getinfo':
/tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_delinfo':
/tmp/nut/drivers/dstate.c:895: undefined reference to `state_delinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:895: undefined reference to `state_delinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o: in function `dstate_getinfo':
/tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: /tmp/nut/drivers/dstate.c:876: undefined reference to `state_getinfo'
/usr/lib/gcc/x86_64-pc-linux-gnu/10.2.0/../../../../x86_64-pc-linux-gnu/bin/ld: dstate.o:/tmp/nut/drivers/dstate.c:876: more undefined references to `state_getinfo' follow
collect2: error: ld returned 1 exit status
rdlibtool: exec error upon slbt_exec_link_create_executable(), line 1614: (see child process error messages).
rdlibtool: < returned to > slbt_exec_link(), line 1934.
make[1]: *** [Makefile:1269: al175] Error 2
make[1]: Leaving directory '/tmp/nut/drivers'
make: *** [Makefile:550: install-recursive] Error 1

This is because of two reasons.

  1. The build is linking directly the main.o, dstate.o and serial.o object files which does not work as reliably as creating the corresponding .la files and linking with those.
  2. $(LDADD_COMMON) is missing from many of the driver's LDADD resulting in undefined references. In a few cases just adding libcommon.la was enough.

GNU libtool is far more permissive and hides these issues...

Also please see this downstream issue: https://bugs.gentoo.org/778584

@orbea
orbea force-pushed the libtool branch 2 times, most recently from f5eecdf to 0f68370 Compare March 27, 2021 21:10
@orbea

orbea commented Mar 27, 2021

Copy link
Copy Markdown
Contributor Author

The travis build is revealing cases I missed, I guess I will use travis to find them all. :)

@orbea
orbea force-pushed the libtool branch 6 times, most recently from bcd5aa7 to ddd8a4a Compare March 27, 2021 22:24
@orbea

orbea commented Mar 27, 2021

Copy link
Copy Markdown
Contributor Author

The travis build is revealing cases I missed, I guess I will use travis to find them all. :)

This made me realize there is a much more correct and cleaner way to fix this, now travis passes.

Signed-off-by: orbea <orbea@riseup.net>
@jimklimov

Copy link
Copy Markdown
Member

Looks quite neat, thanks! I'll check against a few other OSes and looks good to merge if they pass :)

@jimklimov

Copy link
Copy Markdown
Member

Beside 3 warnings in dstate.c that would be focus of a different PR and certainly not a result of yours, BuildBot on a number of other platforms concurs this is a good change set :) Kudos!

@jimklimov
jimklimov merged commit 80842dd into networkupstools:master Mar 29, 2021
@orbea
orbea deleted the libtool branch March 30, 2021 01:30
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants