On Wed, Jan 14, 2009 at 04:23:36PM +0100, Havard Eidnes wrote: | maybe my build host is too slow, but I continue to do UPDATE | builds of NetBSD-current. This flagged a problem when Christos | recently bumped the major version of a number of our shared | libraries. In short, some applications ended up linking the old | version of the shared libraries, resulting in warnings which are | transformed into errors by the use of -Werror for our in-tree | code. | | Some digging with "readelf -d" revealed that some of the shared | libraries the application linked with had a NEEDED attribute | which pointed to a shared library with a now old major number. | | I've finally found out what causes this, and it is the way we | link our shared libraries. As an example I use lib/libdns, where | a MAKEVERBOSE=2 build resulted in: | | /u/build/HEAD/tools/sgimips/bin/mipseb--netbsd-gcc -Wl,-nostdlib -B/u/build/HEAD/dest/sgimips/usr/lib/ -B/u/build/HEAD/dest/sgimips/usr/lib/ -Wl,-rpath-link,/u/build/HEAD/dest/sgimips/lib:/u/build/HEAD/dest/sgimips/usr/lib -L/u/build/HEAD/dest/sgimips/lib -Wl,-x -shared -Wl,-soname,libdns.so.2 -Wl,--warn-shared-textrel -o libdns.so.2.0 -Wl,--whole-archive libdns.a -Wl,--no-whole-archive -L/u/build/HEAD/obj/sgimips/lib/libpthread -lpthread -L/u/build/HEAD/obj/sgimips/lib/libcrypto -lcrypto -Wl,--fatal-warnings -L/u/build/HEAD/dest/sgimips/usr/lib | | You will note that -L${DESTDIR}/usr/lib and -L${DESTDIR}/lib | comes before the shared libraries it wants to use, and even | though care is taken to point to the OBJDIRS of those shared | libraries, the previous -L.../usr/lib and -L.../lib will override | those directories if the shared library is already installed in | DESTDIR, as it typically will be with an UPDATE build. | | So... Because the shared libraries with the new major numbers | have not been installed at this point in the build process | (typically the "build all the libraries" phase), the shared | library linking command above will pick up the shared libraries | with the old major numbers from DESTDIR, causing conflicts/errors | when applications are linked later on (I saw it with | external/bsd/am-utils in my builds). | | In my case, I also wanted to easily trigger a rebuild of my | shared libraries (without cleaning them...) so I ended up with | the following local patch in my bsd.lib.mk file: | | Index: bsd.lib.mk | =================================================================== | RCS file: /cvsroot/src/share/mk/bsd.lib.mk,v | retrieving revision 1.293 | diff -u -p -r1.293 bsd.lib.mk | --- bsd.lib.mk 8 Jan 2009 20:03:59 -0000 1.293 | +++ bsd.lib.mk 14 Jan 2009 15:17:51 -0000 | @@ -81,6 +81,8 @@ SHLIB_MAJOR != . ${SHLIB_VERSION_FILE} ; | SHLIB_MINOR != . ${SHLIB_VERSION_FILE} ; echo $$minor | SHLIB_TEENY != . ${SHLIB_VERSION_FILE} ; echo $$teeny | | +DPADD+= ${SHLIB_VERSION_FILE} | + | # Check for higher installed library versions. | .if !defined(NOCHECKVER) && !defined(NOCHECKVER_${LIB}) && \ | exists(${NETBSDSRCDIR}/lib/checkver) | @@ -511,10 +513,10 @@ lib${LIB}.so.${SHLIB_FULLVERSION}: ${SOL | rm -f lib${LIB}.so.${SHLIB_FULLVERSION} | .if defined(DESTDIR) | ${LIBCC} ${LDLIBC} -Wl,-nostdlib -B${_GCC_CRTDIR}/ -B${DESTDIR}/usr/lib/ | \ | - ${_LIBLDOPTS} \ | - -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} -o ${.TARGET} \ | + -Wl,-x -shared ${SHLIB_SHFLAGS} -o ${.TARGET} \ | -Wl,--whole-archive ${SOLIB} \ | -Wl,--no-whole-archive ${LDADD} \ | + ${_LIBLDOPTS} ${LDFLAGS} \ | -L${_GCC_LIBGCCDIR} | .else | ${LIBCC} ${LDLIBC} -Wl,-x -shared ${SHLIB_SHFLAGS} ${LDFLAGS} \ | | With that, the linker command is then transformed to this (which | may not be correct...): | | /u/build/HEAD/tools/sgimips/bin/mipseb--netbsd-gcc -Wl,-nostdlib -B/u/build/HEAD/dest/sgimips/usr/lib/ -B/u/build/HEAD/dest/sgimips/usr/lib/ -Wl,-x -shared -Wl,-soname,libdns.so.2 -Wl,--warn-shared-textrel -o libdns.so.2.0 -Wl,--whole-archive libdns.a -Wl,--no-whole-archive -L/u/build/HEAD/obj/sgimips/lib/libpthread -lpthread -L/u/build/HEAD/obj/sgimips/lib/libcrypto -lcrypto -Wl,-rpath-link,/u/build/HEAD/dest/sgimips/lib:/u/build/HEAD/dest/sgimips/usr/lib -L/u/build/HEAD/dest/sgimips/lib -Wl,--fatal-warnings -L/u/build/HEAD/dest/sgimips/usr/lib | | However, at least my libs and applications now link correctly | while continuing my UPDATE builds after having touched all my | shlib_version files. | | I'm a little uncertain whether some of the options I've moved | around have position-dependence up and above finding the shared | libraries, so this may not be suitable for general consumption, | and I may revert it locally once I've completed the current | round. However, the patch is included here for those of you who | perform the same excercise I do... I think your patch is correct, after considering the issues and looking at the cvs history of bsd.lib.mk. I'm slightly concerned (as you appear to be) that there may be a lurking dependency on the position of certain arguments. A potentially tricky situation is libraries that don't get installed into /lib or /usr/lib (e.g., /usr/X11R7/lib); it may be worthwhile confirming that the X11 apps are linked correctly too. Other than that, I'd just commit the patch. cheers, Luke.
Attachment:
pgpPJvhutLJYe.pgp
Description: PGP signature