summaryrefslogtreecommitdiff
path: root/share
diff options
context:
space:
mode:
authorDag-Erling Smørgrav <des@FreeBSD.org>2014-03-11 16:13:03 +0000
committerDag-Erling Smørgrav <des@FreeBSD.org>2014-03-11 16:13:03 +0000
commite631dfd1d68d523cfb9dad891bf7db3960128cd4 (patch)
tree3a45c0cee91d8b8e605c89d14a9a5ed8afc0bd8b /share
parent01d81b94aaf749cfedf4c71c644be5004b19e047 (diff)
downloadsrc-test2-e631dfd1d68d523cfb9dad891bf7db3960128cd4.tar.gz
src-test2-e631dfd1d68d523cfb9dad891bf7db3960128cd4.zip
Notes
Diffstat (limited to 'share')
-rw-r--r--share/man/man5/libmap.conf.5150
-rw-r--r--share/mk/bsd.lib.mk51
-rw-r--r--share/mk/bsd.own.mk3
-rw-r--r--share/mk/bsd.prog.mk4
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