tech-userlevel: patch to allow /etc/ld.so.conf configure directories for ELF

Subject: patch to allow /etc/ld.so.conf configure directories for ELF
To: None <tech-userlevel@netbsd.org>
From: matthew green <mrg@eterna.com.au>
List: tech-userlevel
Date: 03/12/1999 00:43:46
hi folks.
it has always annoyed me that the only way to change the shared
library directory search for our ELF ports was LD_LIBRARY_PATH.
this has two problems in my mind:
	- it isn't "system wide". i can't configure it simply
	 so that it works for everyone, all the time.
	- it doesn't work for set-id binaries.
these are fatal flaws to me.
after discussions several months ago, it came to my attention
that it was considered a feature that there was no elf ld.so.conf.
this is because people don't like the fact that the cache gets
stale. well, i don't care too much about the cache. infact, i
agree that it can be painful with stale caches (it could stat(2)
dirs, but then you're stretching it's ability to be an effective
cache, arne't you?).
below is a patch that simply adds the directories found in
/etc/ld.so.conf to the search path after the default, but
before LD_LIBRARY_PATH (same as a.out). infact, most of
this patch is ripped directly out of the a.out ldconfig(8)
program, so it uses exactly the same file format -- it just
does not create or use a cache file.
it adds support to both ld.elf_so and ldd_elf to read
/etc/ld.so.conf (yay! ldd_elf is NOT a complete nightmare!)
i'd really like this to go in. comments?
Index: libexec/ld.elf_so/paths.c
===================================================================
RCS file: /cvsroot/src/libexec/ld.elf_so/paths.c,v
retrieving revision 1.4
diff -p -c -r1.4 paths.c
*** paths.c	1999年03月01日 16:40:07	1.4
--- paths.c	1999年03月11日 13:40:49
***************
*** 1,5 ****
--- 1,41 ----
 /*	$NetBSD: paths.c,v 1.4 1999年03月01日 16:40:07 christos Exp $	 */
 
+ /*-
+ * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Paul Kranenburg.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the NetBSD
+ * Foundation, Inc. and its contributors.
+ * 4. Neither the name of The NetBSD Foundation nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+ 
 /*
 * Copyright 1996 Matt Thomas <matt@3am-software.com>
 * All rights reserved.
***************
*** 27,33 ****
--- 63,73 ----
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */
 
+ #include <sys/types.h>
+ #include <sys/mman.h>
 
+ #include <ctype.h>
+ #include <dirent.h>
 #include <err.h>
 #include <errno.h>
 #include <fcntl.h>
***************
*** 36,44 ****
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
- #include <sys/types.h>
- #include <sys/mman.h>
- #include <dirent.h>
 
 #include "debug.h"
 #include "rtld.h"
--- 76,81 ----
*************** _rtld_add_paths(path_p, pathstr, dodebug
*** 104,108 ****
--- 141,200 ----
 		if (ep[0] == '0円')
 			break;
 		pathstr = ep + 1;
+ 	}
+ }
+ 
+ /*
+ * this is mostly ripped off src/sbin/ldconfig/ldconfig.c:
+ *	NetBSD: ldconfig.c,v 1.22 1998年12月15日 22:49:42 pk Exp
+ */
+ void
+ _rtld_setup_paths(path_p, pathstr, confstr, dodebug)
+ 	Search_Path ** path_p;
+ 	const char *pathstr;
+ 	const char *confstr;
+ 	bool dodebug;
+ {
+ 	FILE	*conf;
+ 	char	*line, *c;
+ 	char	*cline = NULL;
+ 	size_t	len;
+ 
+ 	/* first, setup the default paths */
+ 	_rtld_add_paths(path_p, pathstr, dodebug);
+ 
+ 	/* now, fill in the bits from /etc/ld.so.conf */
+ 	if ((conf = fopen(confstr, "r")) == NULL)
+ 		return;
+ 
+ 	while ((line = fgetln(conf, &len)) != NULL) {
+ 		if (*line == '#' || *line == '\n')
+ 			continue;
+ 
+ 		if (line[len-1] == '\n') {
+ 			line[--len] = '0円';
+ 		} else {
+ 			cline = xmalloc(len+1);
+ 			bcopy(line, cline, len);
+ 			line = cline;
+ 			line[len] = '0円';
+ 		}
+ 		while (isblank(*line)) {
+ 			line++;
+ 			len--;
+ 		}
+ 		if ((c = strchr(line, '#')) == NULL)
+ 			c = line + len;
+ 		while (--c >= line && isblank(*c))
+ 			;
+ 		if (c >= line) {
+ 			*++c = '0円';
+ 			_rtld_add_paths(path_p, line, dodebug);
+ 		}
+ 
+ 		if (cline) {
+ 			free(cline);
+ 			cline = NULL;
+ 		}
 	}
 }
Index: libexec/ld.elf_so/rtld.c
===================================================================
RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.c,v
retrieving revision 1.17
diff -p -c -r1.17 rtld.c
*** rtld.c	1999年03月08日 10:44:25	1.17
--- rtld.c	1999年03月11日 13:40:51
*************** _rtld_init(mapbase)
*** 194,200 ****
 	_rtld_objself = objself;
 
 	_rtld_objself.path = _rtld_path;
! 	_rtld_add_paths(&_rtld_paths, RTLD_DEFAULT_LIBRARY_PATH, true);
 
 	/*
 	 * Set up the _rtld_objlist pointer, so that rtld symbols can be found.
--- 194,201 ----
 	_rtld_objself = objself;
 
 	_rtld_objself.path = _rtld_path;
! 	_rtld_setup_paths(&_rtld_paths, RTLD_DEFAULT_LIBRARY_PATH,
! 	 _PATH_LD_SO_CONF, true);
 
 	/*
 	 * Set up the _rtld_objlist pointer, so that rtld symbols can be found.
Index: libexec/ld.elf_so/rtld.h
===================================================================
RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.h,v
retrieving revision 1.8
diff -p -c -r1.8 rtld.h
*** rtld.h	1999年03月01日 16:40:07	1.8
--- rtld.h	1999年03月11日 13:40:52
***************
*** 42,47 ****
--- 42,48 ----
 #include "link.h"
 
 #define	RTLD_DEFAULT_LIBRARY_PATH	"/usr/lib:/usr/local/lib"
+ #define	_PATH_LD_SO_CONF		"/etc/ld.so.conf"
 
 #if 0
 #define SVR4_LIBDIR	"/usr/lib"
*************** int _rtld_load_needed_objects __P((Obj_E
*** 197,202 ****
--- 198,204 ----
 
 /* path.c */
 void _rtld_add_paths __P((Search_Path **, const char *, bool));
+ void _rtld_setup_paths __P((Search_Path **, const char *, const char *, bool));
 
 /* reloc.c */
 int _rtld_do_copy_relocations __P((const Obj_Entry *, bool));
Index: usr.bin/ldd/ldd_elf/ldd.c
===================================================================
RCS file: /cvsroot/src/usr.bin/ldd/ldd_elf/ldd.c,v
retrieving revision 1.2
diff -p -c -r1.2 ldd.c
*** ldd.c	1999年02月25日 16:26:51	1.2
--- ldd.c	1999年03月11日 13:40:52
*************** main(
*** 85,91 ****
 #ifdef DEBUG
 debug = 1;
 #endif
! _rtld_add_paths(&_rtld_paths, RTLD_DEFAULT_LIBRARY_PATH, true);
 
 
 _rtld_trust = geteuid() == getuid() && getegid() == getgid();
--- 85,92 ----
 #ifdef DEBUG
 debug = 1;
 #endif
! _rtld_setup_paths(&_rtld_paths, RTLD_DEFAULT_LIBRARY_PATH,
! _PATH_LD_SO_CONF, true);
 
 
 _rtld_trust = geteuid() == getuid() && getegid() == getgid();

AltStyle によって変換されたページ (->オリジナル) /