svn commit: r320872 - in head: contrib/mdocml lib lib/libc/gen lib/libdl share/mk
Konstantin Belousov
kib at FreeBSD.org
Mon Jul 10 14:59:23 UTC 2017
Author: kib
Date: Mon Jul 10 14:59:21 2017
New Revision: 320872
URL: https://svnweb.freebsd.org/changeset/base/320872
Log:
Provide libdl.
Create libdl.so.1 as a filter for libc.so.7 which exports public dl*
functions. The functions are resolved from the rtld instead, the goal
of creating library is to avoid errors from the static linker due to
missed libdl. For static binaries, an empty .o is compiled into
libdl.a so that static binaries still get dl stubs from libc.a.
Right now lld cannot create filter objects, disable libdl on arm64
when binutils are not used.
Reviewed by: bdrewery, dim (previos version); emaste
Exp run: PR 220525, done by antoine
Sponsored by: The FreeBSD Foundation
MFC after: 1 month
Differential revision: https://reviews.freebsd.org/D11504
Added:
head/lib/libdl/
head/lib/libdl/Makefile (contents, props changed)
head/lib/libdl/Symbol.map (contents, props changed)
Modified:
head/contrib/mdocml/lib.in
head/lib/Makefile
head/lib/libc/gen/dlfcn.c
head/lib/libc/gen/dlopen.3
head/share/mk/bsd.libnames.mk
head/share/mk/bsd.linker.mk
head/share/mk/src.libnames.mk
Modified: head/contrib/mdocml/lib.in
==============================================================================
--- head/contrib/mdocml/lib.in Mon Jul 10 12:52:18 2017 (r320871)
+++ head/contrib/mdocml/lib.in Mon Jul 10 14:59:21 2017 (r320872)
@@ -46,6 +46,7 @@ LINE("libdevctl", "Device Control Library (libdevctl,
LINE("libdevinfo", "Device and Resource Information Utility Library (libdevinfo, \\-ldevinfo)")
LINE("libdevstat", "Device Statistics Library (libdevstat, \\-ldevstat)")
LINE("libdisk", "Interface to Slice and Partition Labels Library (libdisk, \\-ldisk)")
+LINE("libdl", "Dynamic Linker Services Filter (libdl, \\-ldl)")
LINE("libdm", "Device Mapper Library (libdm, \\-ldm)")
LINE("libdwarf", "DWARF Access Library (libdwarf, \\-ldwarf)")
LINE("libedit", "Command Line Editor Library (libedit, \\-ledit)")
Modified: head/lib/Makefile
==============================================================================
--- head/lib/Makefile Mon Jul 10 12:52:18 2017 (r320871)
+++ head/lib/Makefile Mon Jul 10 14:59:21 2017 (r320872)
@@ -40,6 +40,7 @@ SUBDIR= ${SUBDIR_BOOTSTRAP} \
libdevctl \
libdevinfo \
libdevstat \
+ ${_libdl} \
libdwarf \
libedit \
libevent \
@@ -181,6 +182,10 @@ SUBDIR.${MK_BHYVE}+= libvmmapi
.if ${MACHINE_CPUARCH} != "sparc64"
_libproc= libproc
_librtld_db= librtld_db
+.endif
+
+.if defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mfilter}
+_libdl= libdl
.endif
SUBDIR.${MK_OPENSSL}+= libmp
Modified: head/lib/libc/gen/dlfcn.c
==============================================================================
--- head/lib/libc/gen/dlfcn.c Mon Jul 10 12:52:18 2017 (r320871)
+++ head/lib/libc/gen/dlfcn.c Mon Jul 10 14:59:21 2017 (r320872)
@@ -27,6 +27,8 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#if !defined(IN_LIBDL) || defined(PIC)
+
/*
* Linkage to services provided by the dynamic linker.
*/
@@ -157,6 +159,7 @@ _rtld_thread_init(void *li __unused)
_rtld_error(sorry);
}
+#ifndef IN_LIBDL
static pthread_once_t dl_phdr_info_once = PTHREAD_ONCE_INIT;
static struct dl_phdr_info phdr_info;
@@ -192,6 +195,7 @@ dl_init_phdr_info(void)
}
phdr_info.dlpi_adds = 1;
}
+#endif
#pragma weak dl_iterate_phdr
int
@@ -199,11 +203,15 @@ dl_iterate_phdr(int (*callback)(struct dl_phdr_info *,
void *data __unused)
{
+#ifndef IN_LIBDL
__init_elf_aux_vector();
if (__elf_aux_vector == NULL)
return (1);
_once(&dl_phdr_info_once, dl_init_phdr_info);
return (callback(&phdr_info, sizeof(phdr_info), data));
+#else
+ return (0);
+#endif
}
#pragma weak fdlopen
@@ -251,3 +259,5 @@ _rtld_is_dlopened(void *arg __unused)
return (0);
}
+
+#endif /* !defined(IN_LIBDL) || defined(PIC) */
Modified: head/lib/libc/gen/dlopen.3
==============================================================================
--- head/lib/libc/gen/dlopen.3 Mon Jul 10 12:52:18 2017 (r320871)
+++ head/lib/libc/gen/dlopen.3 Mon Jul 10 14:59:21 2017 (r320872)
@@ -32,7 +32,7 @@
.\" @(#) dlopen.3 1.6 90/01/31 SMI
.\" $FreeBSD$
.\"
-.Dd February 14, 2015
+.Dd July 7, 2017
.Dt DLOPEN 3
.Os
.Sh NAME
@@ -376,6 +376,14 @@ option to
.Xr ld 1
for symbols defined in the executable to become visible to
.Fn dlsym .
+.Pp
+Other ELF platforms require linking with
+.Lb libdl
+to provide
+.Fn dlopen
+and other functions.
+.Fx
+does not require linking with the library, but supports it for compatibility.
.Pp
In previous implementations, it was necessary to prepend an underscore
to all external symbols in order to gain symbol
Added: head/lib/libdl/Makefile
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/lib/libdl/Makefile Mon Jul 10 14:59:21 2017 (r320872)
@@ -0,0 +1,15 @@
+# $FreeBSD$
+
+LIB=dl
+SHLIB_MAJOR=1
+
+.PATH: ${SRCTOP}/lib/libc/gen
+CFLAGS+=-I${SRCTOP}/lib/libc/include
+CFLAGS+=-DIN_LIBDL
+LDFLAGS+=-Wl,-F,libc.so.7
+VERSION_DEF=${SRCTOP}/lib/libc/Versions.def
+SYMBOL_MAPS=${.CURDIR}/Symbol.map
+
+SRCS = dlfcn.c
+
+.include <bsd.lib.mk>
Added: head/lib/libdl/Symbol.map
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ head/lib/libdl/Symbol.map Mon Jul 10 14:59:21 2017 (r320872)
@@ -0,0 +1,20 @@
+/*
+ * $FreeBSD$
+ */
+
+FBSD_1.0 {
+ dladdr;
+ dlclose;
+ dlerror;
+ dlfunc;
+ dlopen;
+ dlsym;
+ dlvsym;
+ dlinfo;
+ dl_iterate_phdr;
+};
+
+
+FBSD_1.3 {
+ fdlopen;
+};
Modified: head/share/mk/bsd.libnames.mk
==============================================================================
--- head/share/mk/bsd.libnames.mk Mon Jul 10 12:52:18 2017 (r320871)
+++ head/share/mk/bsd.libnames.mk Mon Jul 10 14:59:21 2017 (r320872)
@@ -56,6 +56,7 @@ LIBDEVDCTL?= ${LIBDESTDIR}${LIBDIR_BASE}/libdevdctl.a
LIBDEVINFO?= ${LIBDESTDIR}${LIBDIR_BASE}/libdevinfo.a
LIBDEVSTAT?= ${LIBDESTDIR}${LIBDIR_BASE}/libdevstat.a
LIBDIALOG?= ${LIBDESTDIR}${LIBDIR_BASE}/libdialog.a
+LIBDL?= ${LIBDESTDIR}${LIBDIR_BASE}/libdl.a
LIBDNS?= ${LIBDESTDIR}${LIBDIR_BASE}/libdns.a
LIBDPV?= ${LIBDESTDIR}${LIBDIR_BASE}/libdpv.a
LIBDTRACE?= ${LIBDESTDIR}${LIBDIR_BASE}/libdtrace.a
Modified: head/share/mk/bsd.linker.mk
==============================================================================
--- head/share/mk/bsd.linker.mk Mon Jul 10 12:52:18 2017 (r320871)
+++ head/share/mk/bsd.linker.mk Mon Jul 10 14:59:21 2017 (r320872)
@@ -70,6 +70,9 @@ ${X_}LINKER_FEATURES=
.if ${${X_}LINKER_TYPE} != "bfd" || ${${X_}LINKER_VERSION} > 21750
${X_}LINKER_FEATURES+= build-id
.endif
+.if ${${X_}LINKER_TYPE} == "bfd"
+${X_}LINKER_FEATURES+= filter
+.endif
.endif
.else
# Use LD's values
Modified: head/share/mk/src.libnames.mk
==============================================================================
--- head/share/mk/src.libnames.mk Mon Jul 10 12:52:18 2017 (r320871)
+++ head/share/mk/src.libnames.mk Mon Jul 10 14:59:21 2017 (r320872)
@@ -88,6 +88,7 @@ _LIBRARIES= \
devinfo \
devstat \
dialog \
+ dl \
dpv \
dtrace \
dwarf \
More information about the svn-src-head
mailing list