diff options
-rw-r--r-- | include/dlfcn.h | 3 | ||||
-rw-r--r-- | lib/libc/gen/dlfcn.c | 17 | ||||
-rw-r--r-- | lib/libc/gen/dlopen.3 | 19 | ||||
-rw-r--r-- | libexec/rtld-elf/rtld.c | 17 |
4 files changed, 52 insertions, 4 deletions
diff --git a/include/dlfcn.h b/include/dlfcn.h index 41517eb..0179278 100644 --- a/include/dlfcn.h +++ b/include/dlfcn.h @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: dlfcn.h,v 1.2 1998/02/11 05:19:10 jdp Exp $ */ #ifndef _DLFCN_H_ @@ -66,6 +66,7 @@ int dlclose __P((void *)); const char *dlerror __P((void)); void *dlopen __P((const char *, int)); void *dlsym __P((void *, const char *)); +int dlversion __P((void)); __END_DECLS #endif /* !_DLFCN_H_ */ diff --git a/lib/libc/gen/dlfcn.c b/lib/libc/gen/dlfcn.c index 79021e7..38b9553 100644 --- a/lib/libc/gen/dlfcn.c +++ b/lib/libc/gen/dlfcn.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: dlfcn.c,v 1.1 1998/02/09 06:05:24 jdp Exp $ + * $Id: dlfcn.c,v 1.2 1998/03/07 19:57:05 jdp Exp $ */ /* @@ -94,6 +94,14 @@ dlsym(void *handle, const char *name) return NULL; } +#pragma weak dlversion +int +dlversion(void) +{ + _rtld_error(sorry); + return 0; +} + #else /* a.out format */ #include <sys/types.h> @@ -165,4 +173,11 @@ dlsym(void *handle, const char *name) return (__ldso_entry->dlsym)(handle, name); } +/* We don't support dlversion() on a.out systems. */ +int +dlversion(void) +{ + return 0; +} + #endif /* __ELF__ */ diff --git a/lib/libc/gen/dlopen.3 b/lib/libc/gen/dlopen.3 index 9e848f9..e56e3ae 100644 --- a/lib/libc/gen/dlopen.3 +++ b/lib/libc/gen/dlopen.3 @@ -34,7 +34,7 @@ .Os FreeBSD .Dt DLOPEN 3 .Sh NAME -.Nm dlopen, dlsym, dlerror, dlclose +.Nm dlopen, dlsym, dlerror, dlclose, dlversion .Nd programmatic interface to the dynamic linker .Sh SYNOPSIS .Fd #include <dlfcn.h> @@ -46,6 +46,8 @@ .Fn dlerror "void" .Ft int .Fn dlclose "void *handle" +.Ft int +.Fn dlversion "void" .Sh DESCRIPTION These functions provide a simple programmatic interface to the services of the dynamic linker. @@ -219,6 +221,19 @@ The object-intrinsic functions and .Fn _fini are called with no arguments, and are not expected to return values. +.Pp +.Fn dlversion +returns the version number of the dynamic linker. Interpreted +as a decimal number, the version number has the form +.Em rrrsss . +.Em rrr +corresponds to the base operating system release version, e.g., 400 +for release 4.0.0. +.Em sss +is a serial number that increases monotonically within each release +version. If the installed dynamic linker is too old to support +.Fn dlversion , +0 is returned. .Sh NOTES ELF executables need to be linked using the @@ -234,6 +249,8 @@ and return the null pointer in the event of errors. .Fn dlclose returns 0 on success, or -1 if an error occurred. +.Fn dlversion +returns 0 if the dynamic linker is too old to support it. Whenever an error has been detected, a message detailing it can be retrieved via a call to .Fn dlerror . diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c index f5bad83..dc2c83b 100644 --- a/libexec/rtld-elf/rtld.c +++ b/libexec/rtld-elf/rtld.c @@ -22,7 +22,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: rtld.c,v 1.16 1999/04/04 06:01:09 peter Exp $ + * $Id: rtld.c,v 1.17 1999/04/05 02:36:40 jdp Exp $ */ /* @@ -52,6 +52,14 @@ #include "rtld.h" /* + * Version number queried by dlversion(). The first 3 digits represent + * the base FreeBSD release. The last 3 digits are a serial number. + * Increase this when you fix a significant bug or add a significant + * feature. + */ +#define DL_VERSION 400001 + +/* * Debugging support. */ @@ -152,6 +160,7 @@ static func_ptr_type exports[] = { (func_ptr_type) &dlopen, (func_ptr_type) &dlsym, (func_ptr_type) &dladdr, + (func_ptr_type) &dlversion, NULL }; @@ -1273,6 +1282,12 @@ dlsym(void *handle, const char *name) } int +dlversion(void) +{ + return DL_VERSION; +} + +int dladdr(const void *addr, Dl_info *info) { const Obj_Entry *obj; |