diff --git a/include/dlfcn.h b/include/dlfcn.h index 41517ebfc074..0179278fc500 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 79021e76b1e4..38b9553679a4 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 @@ -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 9e848f9e8428..e56e3aeb9b98 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 @@ -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 f5bad8344e56..dc2c83b973ac 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 $ */ /* @@ -51,6 +51,14 @@ #include "debug.h" #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 }; @@ -1272,6 +1281,12 @@ dlsym(void *handle, const char *name) return NULL; } +int +dlversion(void) +{ + return DL_VERSION; +} + int dladdr(const void *addr, Dl_info *info) {