From owner-svn-src-head@FreeBSD.ORG Sat Sep 21 21:03:54 2013 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTP id F3CA2FC5; Sat, 21 Sep 2013 21:03:53 +0000 (UTC) (envelope-from des@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id E009E2893; Sat, 21 Sep 2013 21:03:53 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.7/8.14.7) with ESMTP id r8LL3rxW068046; Sat, 21 Sep 2013 21:03:53 GMT (envelope-from des@svn.freebsd.org) Received: (from des@localhost) by svn.freebsd.org (8.14.7/8.14.5/Submit) id r8LL3rKT068041; Sat, 21 Sep 2013 21:03:53 GMT (envelope-from des@svn.freebsd.org) Message-Id: <201309212103.r8LL3rKT068041@svn.freebsd.org> From: Dag-Erling Smørgrav Date: Sat, 21 Sep 2013 21:03:53 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r255765 - in head: libexec/rtld-elf share/man/man5 X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 21 Sep 2013 21:03:54 -0000 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 +.\" 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@jurai.net . +.An Matthew N. Dodd Aq winter@jurai.net +and extensively rewritten by +.An Dag-Erling Sm\(/orgrav Aq des@FreeBSD.org .