svn commit: r255765 - in head: libexec/rtld-elf share/man/man5

Dag-Erling Smørgrav des at FreeBSD.org
Sat Sep 21 21:03:54 UTC 2013


Author: des
Date: Sat Sep 21 21:03:52 2013
New Revision: 255765
URL: http://svnweb.freebsd.org/changeset/base/255765

Log:
  Make the directory mapping functionality, which was previously only
  available in 32-bit compatibility mode, unconditional.
  
  Overhaul the man page, which had evolved more by accretion than by design.
  
  Approved by:	re (gjb)
  MFC after:	3 weeks

Modified:
  head/libexec/rtld-elf/libmap.c
  head/libexec/rtld-elf/libmap.h
  head/libexec/rtld-elf/rtld.c
  head/share/man/man5/libmap.conf.5

Modified: head/libexec/rtld-elf/libmap.c
==============================================================================
--- head/libexec/rtld-elf/libmap.c	Sat Sep 21 19:42:37 2013	(r255764)
+++ head/libexec/rtld-elf/libmap.c	Sat Sep 21 21:03:52 2013	(r255765)
@@ -396,7 +396,6 @@ lm_find (const char *p, const char *f)
 
 /* Given a libmap translation list and a library name, return the
    replacement library, or NULL */
-#ifdef COMPAT_32BIT
 char *
 lm_findn (const char *p, const char *f, const int n)
 {
@@ -413,7 +412,6 @@ lm_findn (const char *p, const char *f, 
 		free(s);
 	return (t);
 }
-#endif
 
 static char *
 lml_find (struct lm_list *lmh, const char *f)

Modified: head/libexec/rtld-elf/libmap.h
==============================================================================
--- head/libexec/rtld-elf/libmap.h	Sat Sep 21 19:42:37 2013	(r255764)
+++ head/libexec/rtld-elf/libmap.h	Sat Sep 21 21:03:52 2013	(r255765)
@@ -5,6 +5,4 @@
 int	lm_init (char *);
 void	lm_fini (void);
 char *	lm_find (const char *, const char *);
-#ifdef COMPAT_32BIT
 char *	lm_findn (const char *, const char *, const int);
-#endif

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c	Sat Sep 21 19:42:37 2013	(r255764)
+++ head/libexec/rtld-elf/rtld.c	Sat Sep 21 21:03:52 2013	(r255765)
@@ -2581,12 +2581,14 @@ rtld_exit(void)
     lock_release(rtld_bind_lock, &lockstate);
 }
 
+/*
+ * Iterate over a search path, translate each element, and invoke the
+ * callback on the result.
+ */
 static void *
 path_enumerate(const char *path, path_enum_proc callback, void *arg)
 {
-#ifdef COMPAT_32BIT
     const char *trans;
-#endif
     if (path == NULL)
 	return (NULL);
 
@@ -2596,13 +2598,11 @@ path_enumerate(const char *path, path_en
 	char  *res;
 
 	len = strcspn(path, ":;");
-#ifdef COMPAT_32BIT
 	trans = lm_findn(NULL, path, len);
 	if (trans)
 	    res = callback(trans, strlen(trans), arg);
 	else
-#endif
-	res = callback(path, len, arg);
+	    res = callback(path, len, arg);
 
 	if (res != NULL)
 	    return (res);

Modified: head/share/man/man5/libmap.conf.5
==============================================================================
--- head/share/man/man5/libmap.conf.5	Sat Sep 21 19:42:37 2013	(r255764)
+++ head/share/man/man5/libmap.conf.5	Sat Sep 21 21:03:52 2013	(r255765)
@@ -1,4 +1,5 @@
 .\" Copyright (c) 2003 Matthew N. Dodd <winter at 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
 .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 at jurai.net .
+.An Matthew N. Dodd Aq winter at jurai.net
+and extensively rewritten by
+.An Dag-Erling Sm\(/orgrav Aq des at FreeBSD.org .


More information about the svn-src-head mailing list