build shared versions of libraries

building defaults to off until clang is updated.

current clang does not handle -shared, necessary to change the ld
invocation to build shared libraries properly. a new clang should be
installed and MKPIC defaults to no unless the newer clang is detected.

changes:

	. mainly small imports of a Makefile or two and small fixes
	  (turning things back on that were turned off in Makefiles)
	. e.g.: dynamic librefuse now depends on dynamic
	  libpuffs, so libpuffs has to be built dynamically too
	  and a make dependency barrier is needed in lib/Makefile
	. all library objects now have a PIC (for .so) and non-PIC
	  version, so everything is built twice.
	. generate PIC versions of the compat (un-RENAMEd) jump files,
	  include function type annotation in generated assembly
	. build progs with -static by default for now
	. also build ld.elf_so
	. also import NetBSD ldd
This commit is contained in:
Ben Gras
2012-04-16 05:21:20 +02:00
parent 53002f6f6c
commit 4b999f1962
49 changed files with 1051 additions and 53 deletions
+44
View File
@@ -0,0 +1,44 @@
# $NetBSD: Makefile,v 1.15 2009/12/15 04:06:43 mrg Exp $
WARNS?= 3 # XXX: -Wsign-compare issues ld.elf_so source
.include <bsd.own.mk> # for MKDYNAMICROOT definition
PROG= ldd
SRCS= ldd.c
MAN= ldd.1
SUBDIR+= elf32 elf64 elf32_compat
.if (${MACHINE_ARCH} != "alpha")
LIB_ELF32DIR!= cd ${.CURDIR}/elf32 && ${PRINTOBJDIR}
EXTRA_LIBS+= ${LIB_ELF32DIR}/libldd_elf32.a
.endif
.if (${MACHINE_ARCH} == "mips64el") || (${MACHINE_ARCH} == "mips64eb")
LIB_ELF32COMPATDIR!= cd ${.CURDIR}/elf32_compat && ${PRINTOBJDIR}
EXTRA_LIBS+= ${LIB_ELF32COMPATDIR}/libldd_elf32_compat.a
.endif
.if (${MACHINE_ARCH} == "alpha") || (${MACHINE_ARCH} == "sparc64") || \
(${MACHINE_ARCH} == "x86_64") || (${MACHINE_ARCH} == "powerpc64") || \
(${MACHINE_ARCH} == "mips64el") || (${MACHINE_ARCH} == "mips64eb")
LIB_ELF64DIR!= cd ${.CURDIR}/elf64 && ${PRINTOBJDIR}
EXTRA_LIBS+= ${LIB_ELF64DIR}/libldd_elf64.a
CPPFLAGS.ldd.c= -DELFSIZE=64
.else
CPPFLAGS.ldd.c= -DELFSIZE=32
.endif
LDADD+= ${EXTRA_LIBS}
DPADD+= ${EXTRA_LIBS}
.include "Makefile.common"
.if (${MKDYNAMICROOT} == "no")
LDSTATIC?= -static
.endif
.include <bsd.prog.mk>
.include <bsd.subdir.mk>
+13
View File
@@ -0,0 +1,13 @@
# $NetBSD: Makefile.common,v 1.1 2009/01/06 03:59:56 mrg Exp $
LDELFSO=${NETBSDSRCDIR}/libexec/ld.elf_so
CPPFLAGS+= -I${LDELFSO} -DLIBDIR=\"${LIBDIR}\"
CPPFLAGS+= -D_RTLD_SOURCE
#CPPFLAGS+= -DDEBUG
.PATH: ${LDELFSO}
.if (${MACHINE_ARCH} == "sparc") || (${MACHINE_ARCH} == "sparc64") || \
(${MACHINE_ARCH} == "arm") || (${MACHINE_ARCH} == "m68k") || \
(${MACHINE_ARCH} == "powerpc")
CPPFLAGS+= -DVARPSZ
.endif
+10
View File
@@ -0,0 +1,10 @@
# $NetBSD: Makefile.elf,v 1.3 2009/01/07 07:52:28 mrg Exp $
# Makefile fragment to build a (32 or 64 bit) libldd_elfxx.a.
# Expects CPPFLAGS to have ELFSIZE set, and LIB to be set.
SRCS= ldd_elfxx.c
SRCS+= xmalloc.c debug.c expand.c map_object.c load.c search.c \
headers.c paths.c
.include "Makefile.common"
+26
View File
@@ -0,0 +1,26 @@
# $NetBSD: Makefile.inc,v 1.4 2009/12/15 04:06:43 mrg Exp $
WARNS?= 3 # XXX: -Wsign-compare issues ld.elf_so source
.if ${MACHINE_ARCH} == "sparc64"
MLIBDIR= sparc
.endif
.if ${MACHINE_ARCH} == "x86_64"
MLIBDIR= i386
.endif
.if ${MACHINE_ARCH} == "powerpc64"
MLIBDIR= powerpc
.endif
# For now make "elf32" look for native (n32)
.if (${MACHINE_ARCH} == "mips64eb") || (${MACHINE_ARCH} == "mips64el")
MLIBDIR= 64
COMPAT_MLIBDIR= o32
CPPFLAGS+= -DLDD_ELF64
.endif
.if exists(${.CURDIR}/../../Makefile.inc)
.include "${.CURDIR}/../../Makefile.inc"
.endif
+3
View File
@@ -0,0 +1,3 @@
/* $NetBSD: dummy.c,v 1.1 2009/01/07 00:39:24 mrg Exp $ */
/* This file left intentially blank. */
+23
View File
@@ -0,0 +1,23 @@
# $NetBSD: Makefile,v 1.7 2009/12/13 08:50:56 mrg Exp $
.include <bsd.own.mk>
.include <bsd.init.mk>
CPPFLAGS+= -DELFSIZE=32
LIB= ldd_elf32
# XXX Force one member
SRCS= dummy.c
LIBISPRIVATE= yes
.PATH: ${.CURDIR}/..
.ifdef MLIBDIR
CPPFLAGS+= -DRTLD_ARCH_SUBDIR=\"${MLIBDIR}\"
.endif
.if ${MACHINE_ARCH} != "alpha"
.include "../Makefile.elf"
.endif
.include <bsd.lib.mk>
+24
View File
@@ -0,0 +1,24 @@
# $NetBSD: Makefile,v 1.1 2009/12/13 08:50:56 mrg Exp $
.include <bsd.own.mk>
.include <bsd.init.mk>
CPPFLAGS+= -DELFSIZE=32 -DELF32_COMPAT
LIB= ldd_elf32_compat
# XXX Force one member
SRCS= dummy.c
LIBISPRIVATE= yes
.PATH: ${.CURDIR}/..
.ifdef COMPAT_MLIBDIR
MLIBDIR= ${COMPAT_MLIBDIR}
CPPFLAGS+= -DRTLD_ARCH_SUBDIR=\"${MLIBDIR}\"
.endif
.ifdef MLIBDIR
.include "../Makefile.elf"
.endif
.include <bsd.lib.mk>
+47
View File
@@ -0,0 +1,47 @@
# $NetBSD: Makefile,v 1.5 2009/12/13 08:50:57 mrg Exp $
.include <bsd.own.mk>
CPPFLAGS+= -DELFSIZE=64
LIB= ldd_elf64
# XXX Force one member
SRCS= dummy.c
LIBISPRIVATE= yes
.PATH: ${.CURDIR}/..
.if (${MACHINE_ARCH} == "alpha") || (${MACHINE_ARCH} == "sparc64") || \
(${MACHINE_ARCH} == "x86_64") || (${MACHINE_ARCH} == "powerpc64") || \
(${MACHINE_ARCH} == "mips64el") || (${MACHINE_ARCH} == "mips64eb")
# XXX we need to make sure that we don't accidentally get the elf32
# XXX versions of these.
RTLD_FUNCS = \
_rtld_expand_path \
_rtld_digest_dynamic \
_rtld_digest_phdr \
_rtld_load_needed_objects \
_rtld_load_object \
_rtld_map_object \
_rtld_obj_free \
_rtld_obj_new \
_rtld_add_paths \
_rtld_process_hints \
_rtld_sysctl \
_rtld_load_library
.for _d in ${RTLD_FUNCS}
CPPFLAGS+= -D${_d}=_elf64_${_d}
.endfor
.if (${MACHINE_ARCH} == "mips64el") || (${MACHINE_ARCH} == "mips64eb")
CPPFLAGS+= -DRTLD_ARCH_SUBDIR=\"${MLIBDIR}\"
.endif
.include "../Makefile.elf"
.endif
.include <bsd.lib.mk>
+124
View File
@@ -0,0 +1,124 @@
.\" $NetBSD: ldd.1,v 1.18 2009/09/07 20:06:21 wiz 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.
.\"
.\" 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.
.\"
.Dd September 7, 2009
.Dt LDD 1
.Os
.Sh NAME
.Nm ldd
.Nd list dynamic object dependencies
.Sh SYNOPSIS
.Nm
.Op Fl o
.Op Fl f Ar format
.Ar program ...
.Sh DESCRIPTION
.Nm
displays all shared objects that are needed to run the given program.
Contrary to
.Xr nm 1 ,
the list includes
.Dq indirect
dependencies that are the result of needed shared objects which themselves
depend on yet other shared objects.
Zero, one or two
.Fl f
options may be given.
The argument is a format string passed to
.Xr rtld 1
and allows customization of
.Nm ldd Ns 's
output.
The first format argument is used for library objects and defaults to
.Qq "\et-l%o.%m =\*[Gt] %p\en" .
The second format argument is used for non-library objects and defaults to
.Qq "\et%o =\*[Gt] %p\en" .
.Pp
These arguments are interpreted as format strings a la
.Xr printf 3
to customize the trace output and allow
.Nm
to be operated as a filter more conveniently.
The following conversions can be used:
.Bl -tag -width xxxx
.It \&%a
The main program's name
.Po also known as
.Dq __progname
.Pc .
.It \&%A
The value of the environment variable
.Ev LD_TRACE_LOADED_OBJECTS_PROGNAME
in a.out and the program name from the argument vector from elf.
.It \&%o
The library name.
.It \&%m
The library's major version number.
.It \&%n
The library's minor version number (a.out only, ignored in elf).
.It \&%p
The full pathname as determined by
.Nm rtld Ns 's
library search rules.
.It \&%x
The library's load address
.El
.Pp
Additionally,
.Sy \en
and
.Sy \et
are recognized and have their usual meaning.
.Pp
The
.Fl o
option is an alias for
.Fl f
.Ar \&%a:-l\&%o.\&%m =\*[Gt] \&%p\en ,
which makes
.Nm
behave analogously to
.Ic nm Fl o .
.Sh SEE ALSO
.Xr ld 1 ,
.Xr ld.elf_so 1 ,
.Xr nm 1 ,
.Xr rtld 1
.Sh HISTORY
A
.Nm
utility first appeared in SunOS 4.0, it appeared in its current form
in
.Nx 0.9a .
.Sh BUGS
The
a.out
.Nm
actually runs the program it has been requested to analyze which in specially
constructed environments can have security implications.
+305
View File
@@ -0,0 +1,305 @@
/* $NetBSD: ldd.c,v 1.15 2010/10/16 10:27:08 skrll Exp $ */
/*-
* Copyright (c) 1998, 2000 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.
*
* 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 John D. Polstra.
* Copyright 1996 Matt Thomas <matt@3am-software.com>
* All rights reserved.
*
* 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 John Polstra.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*/
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: ldd.c,v 1.15 2010/10/16 10:27:08 skrll Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <dirent.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include "debug.h"
#include "rtld.h"
#include "ldd.h"
/*
* Data declarations.
*/
static char *error_message; /* Message for dlopen(), or NULL */
bool _rtld_trust; /* False for setuid and setgid programs */
Obj_Entry *_rtld_objlist; /* Head of linked list of shared objects */
Obj_Entry **_rtld_objtail = &_rtld_objlist;
/* Link field of last object in list */
u_int _rtld_objcount; /* Number of shared objects */
u_int _rtld_objloads; /* Number of objects loaded */
Obj_Entry *_rtld_objmain; /* The main program shared object */
size_t _rtld_pagesz;
Search_Path *_rtld_default_paths;
Search_Path *_rtld_paths;
Library_Xform *_rtld_xforms;
static void usage(void) __dead;
char *main_local;
char *main_progname;
static void
usage(void)
{
fprintf(stderr, "Usage: %s [-f <format 1>] [-f <format 2>] <filename>"
" ...\n", getprogname());
exit(1);
}
int
main(int argc, char **argv)
{
const char *fmt1 = NULL, *fmt2 = NULL;
int c;
#ifdef DEBUG
debug = 1;
#endif
while ((c = getopt(argc, argv, "f:o")) != -1) {
switch (c) {
case 'f':
if (fmt1) {
if (fmt2)
errx(1, "Too many formats");
fmt2 = optarg;
} else
fmt1 = optarg;
break;
case 'o':
if (fmt1 || fmt2)
errx(1, "Cannot use -o and -f together");
fmt1 = "%a:-l%o.%m => %p\n";
break;
default:
usage();
/*NOTREACHED*/
}
}
argc -= optind;
argv += optind;
if (argc <= 0) {
usage();
/*NOTREACHED*/
}
for (; argc != 0; argc--, argv++) {
int fd;
fd = open(*argv, O_RDONLY);
if (fd == -1) {
warn("%s", *argv);
continue;
}
if (elf_ldd(fd, *argv, fmt1, fmt2) == -1
/* Alpha never had 32 bit support. */
#if defined(_LP64) && !defined(__alpha__)
&& elf32_ldd(fd, *argv, fmt1, fmt2) == -1
#ifdef __mips__
&& elf32_ldd_compat(fd, *argv, fmt1, fmt2) == -1
#endif
#endif
)
warnx("%s", error_message);
close(fd);
}
return 0;
}
/*
* Error reporting function. Use it like printf. If formats the message
* into a buffer, and sets things up so that the next call to dlerror()
* will return the message.
*/
void
_rtld_error(const char *fmt, ...)
{
static char buf[512];
va_list ap;
va_start(ap, fmt);
xvsnprintf(buf, sizeof buf, fmt, ap);
error_message = buf;
va_end(ap);
}
char *
dlerror()
{
char *msg = error_message;
error_message = NULL;
return msg;
}
void
fmtprint(const char *libname, Obj_Entry *obj, const char *fmt1,
const char *fmt2)
{
const char *libpath = obj ? obj->path : "not found";
char libnamebuf[200];
char *libmajor = NULL;
const char *fmt;
char *cp;
int c;
if (strncmp(libname, "lib", 3) == 0 &&
(cp = strstr(libname, ".so")) != NULL) {
int i = cp - (libname + 3);
if (i >= sizeof(libnamebuf))
i = sizeof(libnamebuf) - 1;
(void)memcpy(libnamebuf, libname + 3, i);
libnamebuf[i] = '\0';
if (cp[3] && isdigit((unsigned char)cp[4]))
libmajor = &cp[4];
libname = libnamebuf;
}
if (fmt1 == NULL)
fmt1 = libmajor != NULL ?
"\t-l%o.%m => %p\n" :
"\t-l%o => %p\n";
if (fmt2 == NULL)
fmt2 = "\t%o => %p\n";
fmt = libname == libnamebuf ? fmt1 : fmt2;
while ((c = *fmt++) != '\0') {
switch (c) {
default:
putchar(c);
continue;
case '\\':
switch (c = *fmt) {
case '\0':
continue;
case 'n':
putchar('\n');
break;
case 't':
putchar('\t');
break;
}
break;
case '%':
switch (c = *fmt) {
case '\0':
continue;
case '%':
default:
putchar(c);
break;
case 'A':
printf("%s", main_local);
break;
case 'a':
printf("%s", main_progname);
break;
case 'o':
printf("%s", libname);
break;
case 'm':
printf("%s", libmajor);
break;
case 'n':
/* XXX: not supported for elf */
break;
case 'p':
printf("%s", libpath);
break;
case 'x':
printf("%p", obj ? obj->mapbase : 0);
break;
}
break;
}
++fmt;
}
}
void
print_needed(Obj_Entry *obj, const char *fmt1, const char *fmt2)
{
const Needed_Entry *needed;
for (needed = obj->needed; needed != NULL; needed = needed->next) {
const char *libname = obj->strtab + needed->name;
if (needed->obj != NULL) {
if (!needed->obj->printed) {
fmtprint(libname, needed->obj, fmt1, fmt2);
needed->obj->printed = 1;
print_needed(needed->obj, fmt1, fmt2);
}
} else {
fmtprint(libname, needed->obj, fmt1, fmt2);
}
}
}
+50
View File
@@ -0,0 +1,50 @@
/* $NetBSD: ldd.h,v 1.6 2009/12/15 04:06:43 mrg Exp $ */
/*
* Copyright (c) 2008 Matthew R. Green
* All rights reserved.
*
* 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. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*/
int elf32_ldd(int, char *, const char *, const char *);
#ifdef _LP64
#define LDD_ELF64
#endif
#ifdef LDD_ELF64
int elf64_ldd(int, char *, const char *, const char *);
#define elf_ldd elf64_ldd
#elif defined(ELF32_COMPAT)
#define elf_ldd elf32_compat_ldd
#else
#define elf_ldd elf32_ldd
#endif
void fmtprint(const char *, Obj_Entry *, const char *, const char *);
void print_needed(Obj_Entry *, const char *, const char *);
extern char *main_local;
extern char *main_progname;
+162
View File
@@ -0,0 +1,162 @@
/* $NetBSD: ldd_elfxx.c,v 1.4 2009/09/07 04:49:03 dholland Exp $ */
/*-
* Copyright (c) 1998, 2000 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.
*
* 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 John D. Polstra.
* Copyright 1996 Matt Thomas <matt@3am-software.com>
* All rights reserved.
*
* 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 John Polstra.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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.
*/
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: ldd_elfxx.c,v 1.4 2009/09/07 04:49:03 dholland Exp $");
#endif /* not lint */
#include <sys/types.h>
#include <sys/mman.h>
#include <sys/wait.h>
#include <dirent.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
#include "debug.h"
#include "rtld.h"
#include "ldd.h"
#define munmap minix_munmap
/*
* elfxx_ldd() - bit-size independant ELF ldd implementation.
* returns 0 on success and -1 on failure.
*/
int
ELFNAME(ldd)(int fd, char *path, const char *fmt1, const char *fmt2)
{
struct stat st;
if (lseek(fd, 0, SEEK_SET) < 0 ||
fstat(fd, &st) < 0) {
_rtld_error("%s: %s", path, strerror(errno));
return -1;
}
_rtld_pagesz = sysconf(_SC_PAGESIZE);
#ifdef RTLD_ARCH_SUBDIR
_rtld_add_paths(path, &_rtld_default_paths,
RTLD_DEFAULT_LIBRARY_PATH "/" RTLD_ARCH_SUBDIR);
#endif
_rtld_add_paths(path, &_rtld_default_paths, RTLD_DEFAULT_LIBRARY_PATH);
_rtld_paths = NULL;
_rtld_trust = (st.st_mode & (S_ISUID | S_ISGID)) == 0;
if (_rtld_trust)
_rtld_add_paths(path, &_rtld_paths, getenv("LD_LIBRARY_PATH"));
_rtld_process_hints(path, &_rtld_paths, &_rtld_xforms, _PATH_LD_HINTS);
_rtld_objmain = _rtld_map_object(xstrdup(path), fd, &st);
if (_rtld_objmain == NULL)
return -1;
_rtld_objmain->path = xstrdup(path);
_rtld_digest_dynamic(path, _rtld_objmain);
/* Link the main program into the list of objects. */
*_rtld_objtail = _rtld_objmain;
_rtld_objtail = &_rtld_objmain->next;
++_rtld_objmain->refcount;
(void) _rtld_load_needed_objects(_rtld_objmain, 0);
if (fmt1 == NULL)
printf("%s:\n", _rtld_objmain->path);
main_local = path;
main_progname = _rtld_objmain->path;
print_needed(_rtld_objmain, fmt1, fmt2);
while (_rtld_objlist != NULL) {
Obj_Entry *obj = _rtld_objlist;
_rtld_objlist = obj->next;
while (obj->rpaths != NULL) {
const Search_Path *rpath = obj->rpaths;
obj->rpaths = rpath->sp_next;
xfree(__UNCONST(rpath->sp_path));
xfree(__UNCONST(rpath));
}
while (obj->needed != NULL) {
const Needed_Entry *needed = obj->needed;
obj->needed = needed->next;
xfree(__UNCONST(needed));
}
(void) munmap(obj->mapbase, obj->mapsize);
xfree(obj->path);
xfree(obj);
}
_rtld_objmain = NULL;
_rtld_objtail = &_rtld_objlist;
/* Need to free _rtld_paths? */
return 0;
}