diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2014-03-11 16:13:03 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2014-03-11 16:13:03 +0000 |
commit | e631dfd1d68d523cfb9dad891bf7db3960128cd4 (patch) | |
tree | 3a45c0cee91d8b8e605c89d14a9a5ed8afc0bd8b /share | |
parent | 01d81b94aaf749cfedf4c71c644be5004b19e047 (diff) | |
download | src-test2-e631dfd1d68d523cfb9dad891bf7db3960128cd4.tar.gz src-test2-e631dfd1d68d523cfb9dad891bf7db3960128cd4.zip |
Notes
Diffstat (limited to 'share')
-rw-r--r-- | share/man/man5/libmap.conf.5 | 150 | ||||
-rw-r--r-- | share/mk/bsd.lib.mk | 51 | ||||
-rw-r--r-- | share/mk/bsd.own.mk | 3 | ||||
-rw-r--r-- | share/mk/bsd.prog.mk | 4 |
4 files changed, 113 insertions, 95 deletions
diff --git a/share/man/man5/libmap.conf.5 b/share/man/man5/libmap.conf.5 index 784d5d053231..b97160faa07d 100644 --- a/share/man/man5/libmap.conf.5 +++ b/share/man/man5/libmap.conf.5 @@ -1,4 +1,5 @@ .\" Copyright (c) 2003 Matthew N. Dodd <winter@jurai.net> +.\" Copyright (c) 2013 Dag-Erling Smørgrav .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -24,7 +25,7 @@ .\" .\" $FreeBSD$ .\" -.Dd April 28, 2012 +.Dd September 16, 2013 .Dt LIBMAP.CONF 5 .Os .Sh NAME @@ -35,109 +36,105 @@ The .Nm libmap functionality of .Xr ld-elf.so.1 1 -allows dynamic object dependencies to be mapped to arbitrary -names. +allows dynamic object dependencies to be mapped to arbitrary names. .Pp -The configuration file consists of two whitespace separated columns; the -left hand side containing the mapping candidate and the right hand -side containing the mapping. -Dependencies are matched against candidates and replaced with the mappings. -.Pp -Two special directives are available: +Each line in +.Pa /etc/libmap.conf +can have one of five forms: .Bl -tag -width indent +.It Ar origin Ar target +Whenever a dependency on +.Ar origin +is encountered while loading a dynamic object, use +.Ar target +instead of searching for +.Ar origin +in the normal library search paths. +.It Ar path1 Ar path2 +When iterating through a library search path, replace any element that +matches +.Ar path1 +exactly with +.Ar path2 . +.It Bq Ar constraint +Apply +.Ar constraint +to all subsequent mappings until the next constraint line or the end +of the file. +See the +.Sx Constraints +section for details. .It Cm include Ar file Parse the contents of .Ar file before continuing with the current file. +Nesting depth is limited only by available memory, but each file +encountered is processed only once, and loops are silently ignored. .It Cm includedir Ar dir -Parse the contents of every file in +Recurse through .Ar dir -that ends in +and parse the contents of any file that ends in .Pa .conf before continuing with the current file. +Nesting depth is limited only by available memory, but each directory +or file encountered is processed only once, and loops are silently +ignored. .El -.Pp -Any file or directory encountered while processing -.Cm include -or -.Cm includedir -directives will be parsed exactly once, even if it is encountered -multiple times. -.Pp -Constrained mappings may be specified by enclosing the name of the -executable or library in brackets. -All mappings following a constraint will only be evaluated for that constraint. -Constraints can be one of three types: +.Ss Constraints +Constrained mappings only apply when processing binaries or libraries +that satisfy the constraint. +There are three types of constraints: .Bl -tag -width indent .It Exact The constraint is matched literally so that only an executable with an -identical fully qualified pathname will match the constraint. +identical fully qualified pathname will satisfy the constraint. This means that the executable .Pa /usr/bin/foo -will not match a constraint for -.Pa /usr/bin/./foo +will not satisfy the constraint +.Bq Pa /usr/bin/./foo , and vice-versa. This is the default constraint type. .It Basename A constraint with no path is matched against the basename of the executable. -.Pa foo +For instance, the constraint +.Bq Pa foo will match .Pa /bin/foo , .Pa /usr/local/sbin/foo , or any other executable named .Pa foo , -no matter what its path is. +no matter what directory it is in. .It Directory -A constraint with a trailing slash is prefix-matched against the full -pathname of the executable. -.Pa /usr/bin/ -will match any executable with a path starting with /usr/bin. +A constraint with a trailing slash is satisfied if the full pathname +begins with the constraint string. +For instance, the constraint +.Bq Pa /usr/bin/ +will match any executable with a path starting with +.Pa /usr/bin/ . .El .Pp -Note that the executable path matched against is the -.Fa path -parameter in an -.Fn exec* -function call. -The Directory or Exact constraints can only match when the executable -is called with a full pathname. +Note that the constraints are matched against the path that was passed +as the first argument to whichever +.Xr exec 3 +function was used to execute the binary in question. Most programs executed from a shell are run without a full path, via -.Fn exec*p , -so the Basename constraint type is the most useful. +.Xr execvp 3 +or similar, so the basename constraint type is the most useful. .Pp +.Bf -symbolic WARNING! -Constrained mappings must never appear first in the configuration file. -While there is a way to specify the -.Dq default -constraint, its use is not recommended. -.Pp -The most common use at the date of writing is for allowing multiple -.Tn POSIX -threading libraries to be used on a system without relinking or -changing symlinks. -.Pp -On 64-bit architectures that provide 32-bit runtime support, -the libmap mechanism is available for 32-bit binaries too. -The mappings has to be written into separate configuration file +Constraints apply to all mappings until the next constraint or the end +of the file. +Hence, unconstrained mappings must be placed at the top of the file. +.Ef +.Ss ABI compatibility +On 64-bit architectures that provide 32-bit binary compatibility, the +mappings in +.Pa /etc/libmap.conf +apply only to 64-bit binaries. +Mappings for 32-bit binaries must be placed in .Pa /etc/libmap32.conf . -Currently only supported on amd64. -.Pp -This mechanism has also been used to create shims to allow Linux -shared libraries to be dynamically loaded into -.Fx -binaries. -In this case, an Exact constraint is used for the Linux shared library, -mapping libraries it depends on to a wrapper. -The wrapper then defines any needed symbols for the Linux shared library -and relies on its libraries not being mapped to provide actual -implementations. -It appears that only libraries loaded via -.Xr dlopen 3 -will work correctly. -The symbol version information in shared libraries is checked at -link time, but at run time the version information is currently -ignored. .Sh FILES .Bl -tag -width ".Pa /etc/libmap32.conf" -compact .It Pa /etc/libmap.conf @@ -147,9 +144,8 @@ The libmap configuration file for 32-bit binaries on 64-bit system. .El .Sh EXAMPLES .Bd -literal -# /etc/libmap.conf # -# candidate mapping +# origin target # libc_r.so.6 libpthread.so.2 # Everything that uses 'libc_r' libc_r.so libpthread.so # now uses 'libpthread' @@ -174,11 +170,11 @@ libdl.so.2 pluginwrapper/pips.so .Xr rtld 1 .Sh HISTORY The -.Nm -manual page and .Nm libmap -functionality first appeared in +mechanism first appeared in .Fx 5.1 . .Sh AUTHORS This manual page was written by -.An Matthew N. Dodd Aq winter@jurai.net . +.An Matthew N. Dodd Aq winter@jurai.net +and extensively rewritten by +.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org . diff --git a/share/mk/bsd.lib.mk b/share/mk/bsd.lib.mk index b8b886a254f0..e2354dd97b77 100644 --- a/share/mk/bsd.lib.mk +++ b/share/mk/bsd.lib.mk @@ -119,16 +119,24 @@ PO_FLAG=-pg 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 @@ ${SHLIB_NAME_FULL}: ${VERSION_MAP} 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 @@ realinstall: _libinstall _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,20 +340,23 @@ _libinstall: # 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} > lib${LIB}.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} lib${LIB}.ld ${DESTDIR}${LIBDIR}/${SHLIB_LINK} + ${_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 @@ -349,7 +364,7 @@ _libinstall: .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} \ diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk index 46f29f3731bc..b96b9644fec7 100644 --- a/share/mk/bsd.own.mk +++ b/share/mk/bsd.own.mk @@ -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 @@ KMODMODE?= ${BINMODE} LIBDIR?= /usr/lib LIBCOMPATDIR?= /usr/lib/compat +LIBPRIVATEDIR?= /usr/lib/private LIBDATADIR?= /usr/libdata LIBEXECDIR?= /usr/libexec LINTLIBDIR?= /usr/libdata/lint diff --git a/share/mk/bsd.prog.mk b/share/mk/bsd.prog.mk index 9643482b5839..b759b0448c9a 100644 --- a/share/mk/bsd.prog.mk +++ b/share/mk/bsd.prog.mk @@ -52,6 +52,10 @@ STRIP?= -s 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 |