sabotage-linux / netbsd-curses

libcurses and dependencies taken from netbsd and brought into a portable shape (at least to musl or glibc)
Other
147 stars 14 forks source link

libpanel.so: Fix a build break without an already installed libterminfo.so #55

Closed winspool closed 9 months ago

winspool commented 12 months ago

While testing the new rc of tinycc on linux, the build breaks at libpanel/libpanel.so:

tcc -m32 -w  -v -v  -shared -o libpanel/libpanel.so libpanel/_deck.lo libpanel/above.lo libpanel/below.lo libpanel/bottom.lo libpanel/del.lo libpanel/getuser.lo libpanel/hidden.lo libpanel/hide.lo libpanel/move.lo libpanel/new.lo libpanel/replace.lo libpanel/setuser.lo libpanel/show.lo libpanel/top.lo libpanel/update.lo libpanel/window.lo libcurses/libcurses.so -Wl,-soname=libpanel.so
tcc version 0.9.28rc 2023-09-09 mob@7f39b4f (i386 Linux)
-> /usr/i686-linux-gnu/lib/crti.o
-> libpanel/_deck.lo
-> libpanel/above.lo
-> libpanel/below.lo
-> libpanel/bottom.lo
-> libpanel/del.lo
-> libpanel/getuser.lo
-> libpanel/hidden.lo
-> libpanel/hide.lo
-> libpanel/move.lo
-> libpanel/new.lo
-> libpanel/replace.lo
-> libpanel/setuser.lo
-> libpanel/show.lo
-> libpanel/top.lo
-> libpanel/update.lo
-> libpanel/window.lo
-> libcurses/libcurses.so
libcurses/libcurses.so: error: referenced dll 'libterminfo.so' not found
make: *** [GNUmakefile:529: libpanel/libpanel.so] Fehler 1

This patch adds the missing reference to libterminfo/ during the build to allow the compiler to find libterminfo.so.

When the os has a libterminfo.so already installed in one of the default lib search directories, the bug will never be visible.

This can be verified after a sucessful build, without an installed libterminfo.so: Example:

ldd libpanel/libpanel.so
libcurses.so is marked as "not found"

ldd libcurses/libcurses.so
libterminfo.so is marked as "not found"

-- Regards ... Detlef

winspool commented 12 months ago

The failure log is similar, when compiling for 64bit.

With an increased verbosity level, tcc prints more infos during linking, but for "libterminfo.so", the result is always "nf" (not found).

tcc -w -v -v -v   -shared -o libpanel/libpanel.so libpanel/_deck.lo libpanel/above.lo libpanel/below.lo libpanel/bottom.lo libpanel/del.lo libpanel/getuser.lo libpanel/hidden.lo libpanel/hide.lo libpanel/move.lo libpanel/new.lo libpanel/replace.lo libpanel/setuser.lo libpanel/show.lo libpanel/top.lo libpanel/update.lo libpanel/window.lo libcurses/libcurses.so -Wl,-soname=libpanel.so
tcc version 0.9.28rc 2023-09-09 mob@7f39b4f (x86_64 Linux)
-> /usr/lib/x86_64-linux-gnu/crti.o
-> libpanel/_deck.lo
-> libpanel/above.lo
-> libpanel/below.lo
-> libpanel/bottom.lo
-> libpanel/del.lo
-> libpanel/getuser.lo
-> libpanel/hidden.lo
-> libpanel/hide.lo
-> libpanel/move.lo
-> libpanel/new.lo
-> libpanel/replace.lo
-> libpanel/setuser.lo
-> libpanel/show.lo
-> libpanel/top.lo
-> libpanel/update.lo
-> libpanel/window.lo
-> libcurses/libcurses.so
nf /usr/lib/x86_64-linux-gnu/tcc/libterminfo.so
nf /usr/lib/x86_64-linux-gnu/libterminfo.so
nf /usr/lib/libterminfo.so
nf /lib/x86_64-linux-gnu/libterminfo.so
nf /lib/libterminfo.so
nf /usr/local/lib/x86_64-linux-gnu/libterminfo.so
nf /usr/local/lib/libterminfo.so
libcurses/libcurses.so: error: referenced dll 'libterminfo.so' not found
make: *** [GNUmakefile:529: libpanel/libpanel.so] Fehler 1
rofl0r commented 12 months ago

libpanel.so only uses symbols from libcurses.so, which has its full path provided at the linker command line. imo it's a bug that tcc tries to "recurse" into the dependency tree of libcurses.so. gcc doesn't, i often build netbsd curses on a fresh rootfs without any existing libterminfo.so installed. i suppose unless that is fixed you'll run into problems with other packages that use multiple shared libraries. in case tinycc calls out to binutils' ld, the fix could be as easy as passing the right options (same ones that gcc uses).

winspool commented 9 months ago

libpanel.so only uses symbols from libcurses.so, which has its full path provided at the linker command line. imo it's a bug that tcc tries to "recurse" into the dependency tree of libcurses.so. gcc doesn't,

tcc 0.9.28rc was fixed to not load all referenced libraries, when linking a library. https://repo.or.cz/tinycc.git/commit/32c4df1497e887eb77f5663c7b656aad70475325

in case tinycc calls out to binutils' ld, the fix could be as easy as passing the right options (same ones that gcc uses).

tcc is not only a superfast compiler, but includes also common linker and archive functionality.