summaryrefslogtreecommitdiffstats
path: root/lib/csu
diff options
context:
space:
mode:
authorjdp <jdp@FreeBSD.org>1998-02-09 06:05:25 +0000
committerjdp <jdp@FreeBSD.org>1998-02-09 06:05:25 +0000
commit4538098d0b3fbe09f64c578b730483a6e77ff40f (patch)
tree23d1dd6188892e0850b5b2dcd638bde40de3ac33 /lib/csu
parent7764f84ad9e53692980602aef6b4d76b001692ce (diff)
downloadFreeBSD-src-4538098d0b3fbe09f64c578b730483a6e77ff40f.zip
FreeBSD-src-4538098d0b3fbe09f64c578b730483a6e77ff40f.tar.gz
Move the trampolines for dlopen and related functions from crt0.o
into libc. This reduces the size of every dynamically linked executable by 248 bytes, and it reduces the size of static executables by a lesser amount. It also eliminates some global namespace pollution. With this change in place, the source for dlfcn.h should probably be moved to "/usr/src/include". I'll save that for another day. Compatibility note: Programs which use dlopen, if compiled on systems with this change, will not run on systems with a libc from prior to this change. Very few programs use dlopen, so I think that is OK.
Diffstat (limited to 'lib/csu')
-rw-r--r--lib/csu/i386/Makefile6
-rw-r--r--lib/csu/i386/crt0.c136
-rw-r--r--lib/csu/i386/dladdr.3121
-rw-r--r--lib/csu/i386/dlopen.3236
4 files changed, 18 insertions, 481 deletions
diff --git a/lib/csu/i386/Makefile b/lib/csu/i386/Makefile
index 42907dc..a05ecaf 100644
--- a/lib/csu/i386/Makefile
+++ b/lib/csu/i386/Makefile
@@ -1,13 +1,9 @@
# from: @(#)Makefile 5.6 (Berkeley) 5/22/91
-# $Id: Makefile,v 1.33 1998/01/12 18:29:02 eivind Exp $
+# $Id: Makefile,v 1.34 1998/02/06 16:46:31 jdp Exp $
CFLAGS+= -DLIBC_SCCS -fno-omit-frame-pointer -I${.CURDIR}
OBJS= crt0.o c++rt0.o gcrt0.o scrt0.o sgcrt0.o
CLEANFILES+= a.out
-MAN3+= dladdr.3 dlopen.3
-MLINKS+= dlopen.3 dlsym.3 \
- dlopen.3 dlerror.3 \
- dlopen.3 dlclose.3
all: ${OBJS}
diff --git a/lib/csu/i386/crt0.c b/lib/csu/i386/crt0.c
index 80759cf..75b1ac5 100644
--- a/lib/csu/i386/crt0.c
+++ b/lib/csu/i386/crt0.c
@@ -27,7 +27,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
- * $Id: crt0.c,v 1.31 1997/11/22 03:34:45 brian Exp $
+ * $Id: crt0.c,v 1.32 1998/02/06 16:46:33 jdp Exp $
*/
#include <sys/param.h>
@@ -84,7 +84,6 @@ static int _strncmp();
#endif /* LDSO */
extern struct _dynamic _DYNAMIC;
-static struct ld_entry *ld_entry;
static void __do_dynamic_link(char **argv);
#endif /* DYNAMIC */
@@ -94,7 +93,9 @@ static char empty[1];
char *__progname = empty;
char **environ;
-static int ldso_version;
+/* Globals used by dlopen() and related functions in libc */
+struct ld_entry *__ldso_entry;
+int __ldso_version;
extern unsigned char etext;
extern unsigned char eprol asm ("eprol");
@@ -257,22 +258,22 @@ __do_dynamic_link(argv)
crt.crt_argv = argv;
entry = (int (*)())(crt.crt_ba + sizeof hdr);
- ldso_version = (*entry)(CRT_VERSION_BSD_5, &crt);
- ld_entry = crt.crt_ldentry;
- if (ldso_version == -1 && ld_entry == NULL) {
+ __ldso_version = (*entry)(CRT_VERSION_BSD_5, &crt);
+ __ldso_entry = crt.crt_ldentry;
+ if (__ldso_version == -1 && __ldso_entry == NULL) {
/* If version 5 not recognised, try version 4 */
- ldso_version = (*entry)(CRT_VERSION_BSD_4, &crt);
- ld_entry = crt.crt_ldentry;
- if (ldso_version == -1 && ld_entry == NULL) {
+ __ldso_version = (*entry)(CRT_VERSION_BSD_4, &crt);
+ __ldso_entry = crt.crt_ldentry;
+ if (__ldso_version == -1 && __ldso_entry == NULL) {
/* if version 4 not recognised, try version 3 */
- ldso_version = (*entry)(CRT_VERSION_BSD_3, &crt);
- ld_entry = _DYNAMIC.d_entry;
+ __ldso_version = (*entry)(CRT_VERSION_BSD_3, &crt);
+ __ldso_entry = _DYNAMIC.d_entry;
}
}
- if (ldso_version == -1) {
+ if (__ldso_version == -1) {
_PUTMSG("ld.so failed");
- if (ld_entry != NULL) {
- const char *msg = (ld_entry->dlerror)();
+ if (__ldso_entry != NULL) {
+ const char *msg = (__ldso_entry->dlerror)();
if(msg != NULL) {
const char *endp;
_PUTMSG(": ");
@@ -285,74 +286,13 @@ __do_dynamic_link(argv)
}
- if (ldso_version >= LDSO_VERSION_HAS_DLEXIT)
- atexit(ld_entry->dlexit);
+ if (__ldso_version >= LDSO_VERSION_HAS_DLEXIT)
+ atexit(__ldso_entry->dlexit);
return;
}
/*
- * DL stubs
- */
-
-void *
-dlopen(name, mode)
-const char *name;
-int mode;
-{
- if (ld_entry == NULL)
- return NULL;
-
- return (ld_entry->dlopen)(name, mode);
-}
-
-int
-dlclose(fd)
-void *fd;
-{
- if (ld_entry == NULL)
- return -1;
-
- return (ld_entry->dlclose)(fd);
-}
-
-void *
-dlsym(fd, name)
-void *fd;
-const char *name;
-{
- if (ld_entry == NULL)
- return NULL;
-
- if (ldso_version >= LDSO_VERSION_HAS_DLSYM3) {
- void *retaddr = *(&fd - 1); /* XXX - ABI/machine dependent */
- return (ld_entry->dlsym3)(fd, name, retaddr);
- } else
- return (ld_entry->dlsym)(fd, name);
-}
-
-
-const char *
-dlerror()
-{
- if (ld_entry == NULL)
- return "Service unavailable";
-
- return (ld_entry->dlerror)();
-}
-
-int
-dladdr(addr, dlip)
- const void *addr;
- Dl_info *dlip;
-{
- if (ld_entry == NULL || ldso_version < LDSO_VERSION_HAS_DLADDR)
- return 0;
- return (ld_entry->dladdr)(addr, dlip);
-}
-
-
-/*
* Support routines
*/
@@ -407,48 +347,6 @@ _getenv(name)
asm(" movl $-1,%eax");
asm(" ret");
-#else /* DYNAMIC */
-
-/*
- * DL stubs for static linking case (just return error)
- */
-
-void *
-dlopen(name, mode)
-const char *name;
-int mode;
-{
- return NULL;
-}
-
-int
-dlclose(fd)
-void *fd;
-{
- return -1;
-}
-
-void *
-dlsym(fd, name)
-void *fd;
-const char *name;
-{
- return NULL;
-}
-
-const char *
-dlerror()
-{
- return "Service unavailable";
-}
-
-int
-dladdr(addr, dlip)
- const void *addr;
- Dl_info *dlip;
-{
- return 0;
-}
#endif /* DYNAMIC */
diff --git a/lib/csu/i386/dladdr.3 b/lib/csu/i386/dladdr.3
deleted file mode 100644
index 97af8ce..0000000
--- a/lib/csu/i386/dladdr.3
+++ /dev/null
@@ -1,121 +0,0 @@
-.\"
-.\" Copyright (c) 1998 John D. Polstra
-.\" 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.
-.\"
-.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
-.\"
-.\" $Id$
-.\"
-.Dd February 5, 1998
-.Os FreeBSD
-.Dt DLADDR 3
-.Sh NAME
-.Nm dladdr
-.Nd find the shared object containing a given address
-.Sh SYNOPSIS
-.Fd #include <dlfcn.h>
-.Ft int
-.Fn dladdr "const void *addr" "Dl_info *info"
-.Sh DESCRIPTION
-.Nm
-queries the dynamic linker for information about the shared object
-containing the address
-.Fa addr .
-The information is returned in the structure specified by
-.Fa info .
-The structure contains at least the following members:
-.Bl -tag -width "XXXconst char *dli_fname"
-.It Li "const char *dli_fname"
-The pathname of the shared object containing the address.
-.It Li "void *dli_fbase"
-The base address at which the shared object is mapped into the
-address space of the calling process.
-.It Li "const char *dli_sname"
-The name of the nearest run-time symbol with a value less than or
-equal to
-.Fa addr .
-When possible, the symbol name is returned as it would appear in C
-source code.
-.Pp
-If no symbol with a suitable value is found, both this field and
-.Va dli_saddr
-are set to
-.Dv NULL .
-.It Li "void *dli_saddr"
-The value of the symbol returned in
-.Li dli_sname .
-.El
-.Pp
-.Nm
-is available only in dynamically linked programs.
-.Sh ERRORS
-If a mapped shared object containing
-.Fa addr
-cannot be found,
-.Nm
-returns 0.
-In that case, a message detailing the failure can be retrieved by
-calling
-.Fn dlerror .
-.Pp
-On success, a non-zero value is returned.
-.Sh SEE ALSO
-.Xr dlopen 3 ,
-.Xr rtld 1
-.Sh HISTORY
-The
-.Nm
-function first appeared in the Solaris operating system.
-.Sh BUGS
-This implementation is bug-compatible with the Solaris
-implementation. In particular, the following bugs are present:
-.Bl -bullet
-.It
-If
-.Fa addr
-lies in the main executable rather than in a shared library, the
-pathname returned in
-.Va dli_fname
-may not be correct. The pathname is taken directly from
-.Va argv[0]
-of the calling process. When executing a program specified by its
-full pathname, most shells set
-.Va argv[0]
-to the pathname. But this is not required of shells or guaranteed
-by the operating system.
-.It
-If
-.Fa addr
-is of the form
-.Va &func ,
-where
-.Va func
-is a global function, its value may be an unpleasant surprise. In
-dynamically linked programs, the address of a global function is
-considered to point to its program linkage table entry, rather than to
-the entry point of the function itself. This causes most global
-functions to appear to be defined within the main executable, rather
-than in the shared libraries where the actual code resides.
-.It
-Returning 0 as an indication of failure goes against long-standing
-Unix tradition.
-.El
diff --git a/lib/csu/i386/dlopen.3 b/lib/csu/i386/dlopen.3
deleted file mode 100644
index b9a987c..0000000
--- a/lib/csu/i386/dlopen.3
+++ /dev/null
@@ -1,236 +0,0 @@
-.\" This source code is a product of Sun Microsystems, Inc. and is provided
-.\" for unrestricted use provided that this legend is included on all tape
-.\" media and as a part of the software program in whole or part. Users
-.\" may copy or modify this source code without charge, but are not authorized
-.\" to license or distribute it to anyone else except as part of a product or
-.\" program developed by the user.
-.\"
-.\" THIS PROGRAM CONTAINS SOURCE CODE COPYRIGHTED BY SUN MICROSYSTEMS, INC.
-.\" SUN MICROSYSTEMS, INC., MAKES NO REPRESENTATIONS ABOUT THE SUITABLITY
-.\" OF SUCH SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT
-.\" EXPRESS OR IMPLIED WARRANTY OF ANY KIND. SUN MICROSYSTEMS, INC. DISCLAIMS
-.\" ALL WARRANTIES WITH REGARD TO SUCH SOURCE CODE, INCLUDING ALL IMPLIED
-.\" WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN
-.\" NO EVENT SHALL SUN MICROSYSTEMS, INC. BE LIABLE FOR ANY SPECIAL, INDIRECT,
-.\" INCIDENTAL, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
-.\" FROM USE OF SUCH SOURCE CODE, REGARDLESS OF THE THEORY OF LIABILITY.
-.\"
-.\" This source code is provided with no support and without any obligation on
-.\" the part of Sun Microsystems, Inc. to assist in its use, correction,
-.\" modification or enhancement.
-.\"
-.\" SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
-.\" INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY THIS
-.\" SOURCE CODE OR ANY PART THEREOF.
-.\"
-.\" Sun Microsystems, Inc.
-.\" 2550 Garcia Avenue
-.\" Mountain View, California 94043
-.\"
-.\" Copyright (c) 1991 Sun Microsystems, Inc.
-.\"
-.\" @(#) dlopen.3 1.6 90/01/31 SMI
-.Dd September 24, 1989
-.Os FreeBSD
-.Dt DLOPEN 3
-.Sh NAME
-.Nm dlopen, dlsym, dlerror, dlclose
-.Nd programmatic interface to the dynamic linker
-.Sh SYNOPSIS
-.Fd #include <dlfcn.h>
-.Ft void *
-.Fn dlopen "const char *path" "int mode"
-.Ft void *
-.Fn dlsym "void *handle" "const char *symbol"
-.Ft const char *
-.Fn dlerror "void"
-.Ft int
-.Fn dlclose "void *handle"
-.Sh DESCRIPTION
-These functions provide a simple programmatic interface to the services of the
-dynamic linker.
-Operations are provided to add new shared objects to a
-program's address space, to obtain the address bindings of symbols
-defined by such
-objects, and to remove such objects when their use is no longer required.
-.Pp
-.Fn dlopen
-provides access to the shared object in
-.Fa path ,
-returning a descriptor that can be used for later
-references to the object in calls to
-.Fn dlsym
-and
-.Fn dlclose .
-If
-.Fa path
-was not in the address space prior to the call to
-.Fn dlopen ,
-it is placed in the address space.
-When an object is first loaded into the address space in this way, its
-function
-.Fn _init ,
-if any, is called by the dynamic linker.
-(Note that
-.Ql _init
-is the name as expressed in the C language.
-From assembly language, the name would appear as
-.Ql __init
-instead.)
-If
-.Fa path
-has already been placed in the address space in a previous call to
-.Fn dlopen ,
-it is not added a second time, although a reference count of
-.Fn dlopen
-operations on
-.Fa path
-is maintained.
-A null pointer supplied for
-.Fa path
-is interpreted as a reference to the main
-executable of the process.
-.Fa mode
-controls the way in which external function references from the
-loaded object are bound to their referents.
-It must contains one of the following values:
-.Bl -tag -width RTLD_LAZYX
-.It Dv RTLD_LAZY
-Each external function reference is resolved when the function is first
-called.
-.It Dv RTLD_NOW
-All external function references are bound immediately by
-.Fn dlopen .
-.El
-.Pp
-.Dv RTLD_LAZY
-is normally preferred, for reasons of efficiency.
-However,
-.Dv RTLD_NOW
-is useful to ensure that any undefined symbols are discovered during the
-call to
-.Fn dlopen .
-If
-.Fn dlopen
-fails, it returns a null pointer, and sets an error condition which may
-be interrogated with
-.Fn dlerror .
-.Pp
-.Fn dlsym
-returns the address binding of the symbol described in the null-terminated
-character string
-.Fa symbol ,
-as it occurs in the shared object identified by
-.Fa handle .
-Note that
-.Fa symbol
-is the assembly language representation of the symbol name.
-The assembly language representation of a C language symbol contains an
-extra underscore at the beginning.
-For example, the symbol
-.Ql foo
-in C would appear as
-.Ql _foo
-in assembly language, and in the
-.Fa symbol
-argument to
-.Fn dlsym .
-The symbols exported by objects added to the address space by
-.Fn dlopen
-can be accessed only through calls to
-.Fn dlsym .
-Such symbols do not supersede any definition of those symbols already present
-in the address space when the object is loaded, nor are they available to
-satisfy normal dynamic linking references.
-A null pointer supplied as the value of
-.Fa handle
-is interpreted as a reference to the executable from which the call to
-.Fn dlsym
-is being made. Thus a shared object can reference its own symbols.
-.Fn dlsym
-returns a null pointer if the symbol cannot be found, and sets an error
-condition which may be queried with
-.Fn dlerror .
-.Pp
-If
-.Fn dlsym
-is called with the special
-.Fa handle
-.Dv RTLD_NEXT ,
-then the search for the symbol is limited to the shared objects
-which were loaded after the one issuing the call to
-.Fn dlsym .
-Thus, if the function is called from the main program, all
-the shared libraries are searched.
-If it is called from a shared library, all subsequent shared
-libraries are searched.
-.Dv RTLD_NEXT
-is useful for implementing wrappers around library functions.
-For example, a wrapper function
-.Fn getpid
-could access the
-.Dq real
-.Fn getpid
-with
-.Li dlsym(RTLD_NEXT, \&"_getpid\&") .
-.Pp
-.Fn dlerror
-returns a null-terminated character string describing the last error that
-occurred during a call to
-.Fn dlopen ,
-.Fn dlsym ,
-or
-.Fn dlclose .
-If no such error has occurred,
-.Fn dlerror
-returns a null pointer.
-At each call to
-.Fn dlerror ,
-the error indication is reset. Thus in the case of two calls
-to
-.Fn dlerror ,
-where the second call follows the first immediately, the second call
-will always return a null pointer.
-.Pp
-.Fn dlclose
-deletes a reference to the shared object referenced by
-.Fa handle .
-If the reference count drops to 0, the object is removed from the
-address space, and
-.Fa handle
-is rendered invalid.
-Just before removing a shared object in this way, the dynamic linker
-calls the object's
-.Fn _fini
-function, if such a function is defined by the object.
-As with
-.Ql _init ,
-.Ql _fini
-is the C language name of the function.
-If
-.Fn dlclose
-is successful, it returns a value of 0.
-Otherwise it returns -1, and sets an error condition that can be
-interrogated with
-.Fn dlerror .
-.Pp
-The object-intrinsic functions
-.Fn _init
-and
-.Fn _fini
-are called with no arguments, and are not expected to return values.
-.Sh ERRORS
-.Fn dlopen
-and
-.Fn dlsym
-return the null pointer in the event of errors.
-.Fn dlclose
-returns 0 on success, or -1 if an error occurred.
-Whenever an error has been detected, a message detailing it can be
-retrieved via a call to
-.Fn dlerror .
-.Sh SEE ALSO
-.Xr ld 1 ,
-.Xr rtld 1 ,
-.Xr link 5
-
OpenPOWER on IntegriCloud