summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/dlfcn.h3
-rw-r--r--lib/libc/gen/dlfcn.c17
-rw-r--r--lib/libc/gen/dlopen.319
-rw-r--r--libexec/rtld-elf/rtld.c17
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;
OpenPOWER on IntegriCloud