summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libc/gen/Makefile.inc2
-rw-r--r--lib/libc/gen/dlfcn.c8
-rw-r--r--lib/libc/gen/dlfunc.c30
-rw-r--r--libexec/rtld-elf/Symbol.map1
-rw-r--r--libexec/rtld-elf/rtld.c14
5 files changed, 24 insertions, 31 deletions
diff --git a/lib/libc/gen/Makefile.inc b/lib/libc/gen/Makefile.inc
index a7997ab..0ee2ffb 100644
--- a/lib/libc/gen/Makefile.inc
+++ b/lib/libc/gen/Makefile.inc
@@ -9,7 +9,7 @@ SRCS+= __getosreldate.c __xuname.c \
alarm.c arc4random.c assert.c basename.c check_utility_compat.c \
clock.c closedir.c confstr.c \
crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \
- dlfcn.c dlfunc.c drand48.c erand48.c err.c errlst.c errno.c \
+ dlfcn.c drand48.c erand48.c err.c errlst.c errno.c \
exec.c fdevname.c feature_present.c fmtcheck.c fmtmsg.c fnmatch.c \
fpclassify.c frexp.c fstab.c ftok.c fts.c fts-compat.c ftw.c \
getbootfile.c getbsize.c \
diff --git a/lib/libc/gen/dlfcn.c b/lib/libc/gen/dlfcn.c
index eac3f1a..4be8847 100644
--- a/lib/libc/gen/dlfcn.c
+++ b/lib/libc/gen/dlfcn.c
@@ -105,6 +105,14 @@ dlsym(void * __restrict handle, const char * __restrict name)
return NULL;
}
+#pragma weak dlfunc
+dlfunc_t
+dlfunc(void * __restrict handle, const char * __restrict name)
+{
+ _rtld_error(sorry);
+ return NULL;
+}
+
#pragma weak dlvsym
void *
dlvsym(void * __restrict handle, const char * __restrict name,
diff --git a/lib/libc/gen/dlfunc.c b/lib/libc/gen/dlfunc.c
deleted file mode 100644
index 72a683a..0000000
--- a/lib/libc/gen/dlfunc.c
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * This source file is in the public domain.
- * Garrett A. Wollman, 2002-05-28.
- *
- * $FreeBSD$
- */
-
-#include <dlfcn.h>
-
-/*
- * Implement the dlfunc() interface, which behaves exactly the same as
- * dlsym() except that it returns a function pointer instead of a data
- * pointer. This can be used by applications to avoid compiler warnings
- * about undefined behavior, and is intended as prior art for future
- * POSIX standardization. This function requires that all pointer types
- * have the same representation, which is true on all platforms FreeBSD
- * runs on, but is not guaranteed by the C standard.
- */
-dlfunc_t
-dlfunc(void * __restrict handle, const char * __restrict symbol)
-{
- union {
- void *d;
- dlfunc_t f;
- } rv;
-
- rv.d = dlsym(handle, symbol);
- return (rv.f);
-}
-
diff --git a/libexec/rtld-elf/Symbol.map b/libexec/rtld-elf/Symbol.map
index 20f8d60..ce1e3e5 100644
--- a/libexec/rtld-elf/Symbol.map
+++ b/libexec/rtld-elf/Symbol.map
@@ -8,6 +8,7 @@ FBSD_1.0 {
dlerror;
dlopen;
dlsym;
+ dlfunc;
dlvsym;
dladdr;
dllockinit;
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 07529b3..40ed6ed 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -200,6 +200,7 @@ static func_ptr_type exports[] = {
(func_ptr_type) &dlerror,
(func_ptr_type) &dlopen,
(func_ptr_type) &dlsym,
+ (func_ptr_type) &dlfunc,
(func_ptr_type) &dlvsym,
(func_ptr_type) &dladdr,
(func_ptr_type) &dllockinit,
@@ -2170,6 +2171,19 @@ dlsym(void *handle, const char *name)
SYMLOOK_DLSYM);
}
+dlfunc_t
+dlfunc(void *handle, const char *name)
+{
+ union {
+ void *d;
+ dlfunc_t f;
+ } rv;
+
+ rv.d = do_dlsym(handle, name, __builtin_return_address(0), NULL,
+ SYMLOOK_DLSYM);
+ return (rv.f);
+}
+
void *
dlvsym(void *handle, const char *name, const char *version)
{
OpenPOWER on IntegriCloud