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
This commit is contained in:
Dag-Erling Smørgrav 2013-09-21 21:03:52 +00:00
parent ad5b574375
commit 8182b3bee1
4 changed files with 78 additions and 86 deletions

View File

@ -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, const int n)
free(s);
return (t);
}
#endif
static char *
lml_find (struct lm_list *lmh, const char *f)

View File

@ -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

View File

@ -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_enum_proc callback, void *arg)
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);

View File

@ -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 .