Date: Tue, 03 Sep 2013 15:37:04 +0200 From: =?utf-8?Q?Dag-Erling_Sm=C3=B8rgrav?= <des@des.no> To: freebsd-arch@freebsd.org Subject: /usr/lib/private Message-ID: <86zjrut4an.fsf@nine.des.no>
next in thread | raw e-mail | index | archive | help
--=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable The attached patch introduces a mechanism for installing libraries into /usr/lib/private, which is not in the standard rtld search path, and setting -rpath accordingly for programs and libraries that need one of those libraries. Private libraries are meant for internal use only and need to be kept out of the way so they don't conflict with similarly- named libraries installed by ports. The first to go is libssh (which shouldn't even exist, but that's another story). There is one issue this patch does not address: 32-bit binaries which reference private libraries on a 64-bit system won't find them. This can be fixed by having rtld automagically translate /usr/lib/private to /usr/lib32/private when appropriate, which is rather gross. I intend to commit this shortly - it is blocking DNSSEC for FreeBSD 10. DES --=20 Dag-Erling Sm=C3=B8rgrav - des@des.no --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=head-privatelib.diff Index: Makefile.inc1 =================================================================== --- Makefile.inc1 (revision 255069) +++ Makefile.inc1 (working copy) @@ -382,6 +382,7 @@ PATH=${TMPPATH} \ LIBDIR=/usr/lib32 \ SHLIBDIR=/usr/lib32 \ + LIBPRIVATEDIR=/usr/lib32/private \ COMPILER_TYPE=${WMAKE_COMPILER_TYPE} LIB32WMAKEFLAGS+= \ CC="${XCC} ${LIB32FLAGS}" \ Index: ObsoleteFiles.inc =================================================================== --- ObsoleteFiles.inc (revision 255069) +++ ObsoleteFiles.inc (working copy) @@ -38,6 +38,9 @@ # xargs -n1 | sort | uniq -d; # done +# 20130903: libssh becomes private +OLD_LIBS+=usr/lib/libssh.so.5 +OLD_LIBS+=usr/lib32/libssh.so.5 # 20130829: bsdpatch is patch unconditionally OLD_FILES+=usr/bin/bsdpatch OLD_FILES+=usr/share/man/man1/bsdpatch.1.gz Index: etc/mtree/BSD.usr.dist =================================================================== --- etc/mtree/BSD.usr.dist (revision 255069) +++ etc/mtree/BSD.usr.dist (working copy) @@ -24,6 +24,8 @@ .. i18n .. + private + .. .. lib32 dtrace @@ -30,6 +32,8 @@ .. i18n .. + private + .. .. libdata gcc Index: lib/libldns/Makefile =================================================================== --- lib/libldns/Makefile (revision 255069) +++ lib/libldns/Makefile (working copy) @@ -6,7 +6,7 @@ .PATH: ${LDNSDIR} ${LDNSDIR}/compat LIB= ldns -INTERNALLIB= true +PRIVATELIB= true CFLAGS+= -I${LDNSDIR} Index: lib/libpam/modules/pam_ssh/Makefile =================================================================== --- lib/libpam/modules/pam_ssh/Makefile (revision 255069) +++ lib/libpam/modules/pam_ssh/Makefile (working copy) @@ -15,6 +15,7 @@ DPADD= ${LIBSSH} ${LIBCRYPTO} ${LIBCRYPT} LDADD= -lssh -lcrypto -lcrypt +USEPRIVATELIB= ssh .include <bsd.lib.mk> Index: secure/lib/libssh/Makefile =================================================================== --- secure/lib/libssh/Makefile (revision 255069) +++ secure/lib/libssh/Makefile (working copy) @@ -3,6 +3,7 @@ .include <bsd.own.mk> LIB= ssh +PRIVATELIB= true SHLIB_MAJOR= 5 SRCS= authfd.c authfile.c bufaux.c bufbn.c buffer.c \ canohost.c channels.c cipher.c cipher-aes.c \ Index: secure/libexec/sftp-server/Makefile =================================================================== --- secure/libexec/sftp-server/Makefile (revision 255069) +++ secure/libexec/sftp-server/Makefile (working copy) @@ -10,6 +10,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/libexec/ssh-keysign/Makefile =================================================================== --- secure/libexec/ssh-keysign/Makefile (revision 255069) +++ secure/libexec/ssh-keysign/Makefile (working copy) @@ -8,6 +8,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/libexec/ssh-pkcs11-helper/Makefile =================================================================== --- secure/libexec/ssh-pkcs11-helper/Makefile (revision 255069) +++ secure/libexec/ssh-pkcs11-helper/Makefile (working copy) @@ -8,6 +8,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/scp/Makefile =================================================================== --- secure/usr.bin/scp/Makefile (revision 255069) +++ secure/usr.bin/scp/Makefile (working copy) @@ -9,6 +9,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/sftp/Makefile =================================================================== --- secure/usr.bin/sftp/Makefile (revision 255069) +++ secure/usr.bin/sftp/Makefile (working copy) @@ -9,6 +9,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} ${LIBEDIT} ${LIBNCURSES} LDADD= -lssh -lcrypt -lcrypto -lz -ledit -lncurses +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/ssh/Makefile =================================================================== --- secure/usr.bin/ssh/Makefile (revision 255069) +++ secure/usr.bin/ssh/Makefile (working copy) @@ -18,6 +18,7 @@ DPADD= ${LIBSSH} ${LIBUTIL} ${LIBZ} LDADD= -lssh -lutil -lz +USEPRIVATELIB= ssh .if ${MK_KERBEROS_SUPPORT} != "no" CFLAGS+= -DGSSAPI -DHAVE_GSSAPI_GSSAPI_H=1 -DKRB5 -DHEIMDAL Index: secure/usr.bin/ssh-add/Makefile =================================================================== --- secure/usr.bin/ssh-add/Makefile (revision 255069) +++ secure/usr.bin/ssh-add/Makefile (working copy) @@ -9,6 +9,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/ssh-agent/Makefile =================================================================== --- secure/usr.bin/ssh-agent/Makefile (revision 255069) +++ secure/usr.bin/ssh-agent/Makefile (working copy) @@ -9,6 +9,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/ssh-keygen/Makefile =================================================================== --- secure/usr.bin/ssh-keygen/Makefile (revision 255069) +++ secure/usr.bin/ssh-keygen/Makefile (working copy) @@ -9,6 +9,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.bin/ssh-keyscan/Makefile =================================================================== --- secure/usr.bin/ssh-keyscan/Makefile (revision 255069) +++ secure/usr.bin/ssh-keyscan/Makefile (working copy) @@ -6,6 +6,7 @@ DPADD= ${LIBSSH} ${LIBCRYPT} ${LIBCRYPTO} ${LIBZ} LDADD= -lssh -lcrypt -lcrypto -lz +USEPRIVATELIB= ssh .include <bsd.prog.mk> Index: secure/usr.sbin/sshd/Makefile =================================================================== --- secure/usr.sbin/sshd/Makefile (revision 255069) +++ secure/usr.sbin/sshd/Makefile (working copy) @@ -27,6 +27,7 @@ DPADD= ${LIBSSH} ${LIBUTIL} ${LIBZ} ${LIBWRAP} ${LIBPAM} LDADD= -lssh -lutil -lz -lwrap ${MINUSLPAM} +USEPRIVATELIB= ssh .if ${MK_AUDIT} != "no" CFLAGS+= -DUSE_BSM_AUDIT -DHAVE_GETAUDIT_ADDR Index: share/mk/bsd.lib.mk =================================================================== --- share/mk/bsd.lib.mk (revision 255069) +++ share/mk/bsd.lib.mk (working copy) @@ -119,16 +119,24 @@ all: objwarn +.if defined(PRIVATELIB) +_LIBDIR:=${LIBPRIVATEDIR} +_SHLIBDIR:=${LIBPRIVATEDIR} +.else +_LIBDIR:=${LIBDIR} +_SHLIBDIR:=${SHLIBDIR} +.endif + .if defined(SHLIB_NAME) .if ${MK_DEBUG_FILES} != "no" SHLIB_NAME_FULL=${SHLIB_NAME}.full # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory -.if ${SHLIBDIR} == "/boot" ||\ +.if ${_SHLIBDIR} == "/boot" ||\ ${SHLIBDIR:C%/lib(/.*)?$%/lib%} == "/lib" ||\ ${SHLIBDIR:C%/usr/lib(32)?(/.*)?%/usr/lib%} == "/usr/lib" -DEBUGFILEDIR=${DEBUGDIR}${SHLIBDIR} +DEBUGFILEDIR=${DEBUGDIR}${_SHLIBDIR} .else -DEBUGFILEDIR=${SHLIBDIR}/.debug +DEBUGFILEDIR=${_SHLIBDIR}/.debug DEBUGMKDIR= .endif .else @@ -145,6 +153,10 @@ LDFLAGS+= -Wl,--version-script=${VERSION_MAP} .endif +.if defined(USEPRIVATELIB) +LDFLAGS+= -L${_SHLIBDIRPREFIX}${LIBPRIVATEDIR} -rpath ${LIBPRIVATEDIR} +.endif + .if defined(LIB) && !empty(LIB) || defined(SHLIB_NAME) OBJS+= ${SRCS:N*.h:R:S/$/.o/} .endif @@ -291,16 +303,16 @@ _libinstall: .if defined(LIB) && !empty(LIB) && ${MK_INSTALLLIB} != "no" ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${LIBDIR} + ${_INSTALLFLAGS} lib${LIB}.a ${DESTDIR}${_LIBDIR} .endif .if ${MK_PROFILE} != "no" && defined(LIB) && !empty(LIB) ${INSTALL} -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${LIBDIR} + ${_INSTALLFLAGS} lib${LIB}_p.a ${DESTDIR}${_LIBDIR} .endif .if defined(SHLIB_NAME) ${INSTALL} ${STRIP} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ ${_INSTALLFLAGS} ${_SHLINSTALLFLAGS} \ - ${SHLIB_NAME} ${DESTDIR}${SHLIBDIR} + ${SHLIB_NAME} ${DESTDIR}${_SHLIBDIR} .if ${MK_DEBUG_FILES} != "no" .if defined(DEBUGMKDIR) ${INSTALL} -T debug -d ${DESTDIR}${DEBUGFILEDIR} @@ -328,23 +340,23 @@ # installworld; in the later case ${_LDSCRIPTROOT} must be obviously empty # because on the target system, libraries are meant to be looked up from /. .if defined(SHLIB_LDSCRIPT) && !empty(SHLIB_LDSCRIPT) && exists(${.CURDIR}/${SHLIB_LDSCRIPT}) - sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${SHLIBDIR}/${SHLIB_NAME},g' \ - -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${LIBDIR},g' \ - ${.CURDIR}/${SHLIB_LDSCRIPT} > ${DESTDIR}${LIBDIR}/${SHLIB_LINK:R}.ld + sed -e 's,@@SHLIB@@,${_LDSCRIPTROOT}${_SHLIBDIR}/${SHLIB_NAME},g' \ + -e 's,@@LIBDIR@@,${_LDSCRIPTROOT}${_LIBDIR},g' \ + ${.CURDIR}/${SHLIB_LDSCRIPT} > ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld ${INSTALL} -S -C -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} ${DESTDIR}${LIBDIR}/${SHLIB_LINK:R}.ld \ - ${DESTDIR}${LIBDIR}/${SHLIB_LINK} - rm -f ${DESTDIR}${LIBDIR}/${SHLIB_LINK:R}.ld + ${_INSTALLFLAGS} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld \ + ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} + rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_LINK:R}.ld .else -.if ${SHLIBDIR} == ${LIBDIR} - ${INSTALL_SYMLINK} ${SHLIB_NAME} ${DESTDIR}${LIBDIR}/${SHLIB_LINK} +.if ${_SHLIBDIR} == ${_LIBDIR} + ${INSTALL_SYMLINK} ${SHLIB_NAME} ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} .else - ${INSTALL_SYMLINK} ${_SHLIBDIRPREFIX}${SHLIBDIR}/${SHLIB_NAME} \ - ${DESTDIR}${LIBDIR}/${SHLIB_LINK} -.if exists(${DESTDIR}${LIBDIR}/${SHLIB_NAME}) - -chflags noschg ${DESTDIR}${LIBDIR}/${SHLIB_NAME} - rm -f ${DESTDIR}${LIBDIR}/${SHLIB_NAME} + ${INSTALL_SYMLINK} ${_SHLIBDIRPREFIX}${_SHLIBDIR}/${SHLIB_NAME} \ + ${DESTDIR}${_LIBDIR}/${SHLIB_LINK} +.if exists(${DESTDIR}${_LIBDIR}/${SHLIB_NAME}) + -chflags noschg ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} + rm -f ${DESTDIR}${_LIBDIR}/${SHLIB_NAME} .endif .endif .endif # SHLIB_LDSCRIPT @@ -352,7 +364,7 @@ .endif # SHIB_NAME .if defined(INSTALL_PIC_ARCHIVE) && defined(LIB) && !empty(LIB) && ${MK_TOOLCHAIN} != "no" ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ - ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${LIBDIR} + ${_INSTALLFLAGS} lib${LIB}_pic.a ${DESTDIR}${_LIBDIR} .endif .if defined(WANT_LINT) && !defined(NO_LINT) && defined(LIB) && !empty(LIB) ${INSTALL} -o ${LIBOWN} -g ${LIBGRP} -m ${LIBMODE} \ Index: share/mk/bsd.libnames.mk =================================================================== --- share/mk/bsd.libnames.mk (revision 255069) +++ share/mk/bsd.libnames.mk (working copy) @@ -87,7 +87,7 @@ LIBKVM?= ${DESTDIR}${LIBDIR}/libkvm.a LIBL?= ${DESTDIR}${LIBDIR}/libl.a .if ${MK_LDNS} != "no" -LIBLDNS?= ${DESTDIR}${LIBDIR}/libldns.a +LIBLDNS?= ${DESTDIR}${LIBPRIVATEDIR}/libldns.a .endif LIBLN?= "don't use LIBLN, use LIBL" .if ${MK_BIND} != "no" @@ -150,7 +150,7 @@ LIBSBUF?= ${DESTDIR}${LIBDIR}/libsbuf.a LIBSDP?= ${DESTDIR}${LIBDIR}/libsdp.a LIBSMB?= ${DESTDIR}${LIBDIR}/libsmb.a -LIBSSH?= ${DESTDIR}${LIBDIR}/libssh.a +LIBSSH?= ${DESTDIR}${LIBPRIVATEDIR}/libssh.a LIBSSL?= ${DESTDIR}${LIBDIR}/libssl.a LIBSTAND?= ${DESTDIR}${LIBDIR}/libstand.a LIBSTDCPLUSPLUS?= ${DESTDIR}${LIBDIR}/libstdc++.a Index: share/mk/bsd.own.mk =================================================================== --- share/mk/bsd.own.mk (revision 255069) +++ share/mk/bsd.own.mk (working copy) @@ -28,6 +28,8 @@ # # LIBCOMPATDIR Base path for compat libraries. [/usr/lib/compat] # +# LIBPRIVATEDIR Base path for private libraries. [/usr/lib/private] +# # LIBDATADIR Base path for misc. utility data files. [/usr/libdata] # # LIBEXECDIR Base path for system daemons and utilities. [/usr/libexec] @@ -144,6 +146,7 @@ LIBDIR?= /usr/lib LIBCOMPATDIR?= /usr/lib/compat +LIBPRIVATEDIR?= /usr/lib/private LIBDATADIR?= /usr/libdata LIBEXECDIR?= /usr/libexec LINTLIBDIR?= /usr/libdata/lint Index: share/mk/bsd.prog.mk =================================================================== --- share/mk/bsd.prog.mk (revision 255069) +++ share/mk/bsd.prog.mk (working copy) @@ -52,6 +52,10 @@ LDFLAGS+= -static .endif +.if defined(USEPRIVATELIB) +LDFLAGS+= -L${_SHLIBDIRPREFIX}${LIBPRIVATEDIR} -rpath ${LIBPRIVATEDIR} +.endif + .if ${MK_DEBUG_FILES} != "no" PROG_FULL=${PROG}.full # Use ${DEBUGDIR} for base system debug files, else .debug subdirectory --=-=-=--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?86zjrut4an.fsf>