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:
parent
ad5b574375
commit
8182b3bee1
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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 .
|
||||
|
Loading…
x
Reference in New Issue
Block a user