Add a new function dlversion() which returns the version number of

the dynamic linker in the same form as __FreeBSD_version.  This is
mainly intended for checking the dynamic linker version during a make
world.
This commit is contained in:
John Polstra 1999-04-07 02:43:11 +00:00
parent b2e2337ba1
commit 14f5fa0596
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=45398
4 changed files with 52 additions and 4 deletions

View File

@ -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_ */

View File

@ -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__ */

View File

@ -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 .

View File

@ -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)
{