summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2020-05-21 22:24:23 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2020-05-21 22:24:23 +0000
commitd0ca9a7fe4450aaa19ad281a9cef37f413bd9e5c (patch)
tree3157709def91a36554b53c9e0dcc29a742579887
parente68cde59c392635d615971c61a1fa26abcc66754 (diff)
downloadsrc-test-d0ca9a7fe4450aaa19ad281a9cef37f413bd9e5c.tar.gz
src-test-d0ca9a7fe4450aaa19ad281a9cef37f413bd9e5c.zip
Restore the binary compatibility for link_map l_addr.
Keep link_map l_addr binary layout compatible, rename l_addr to l_base where rtld returns map base. Provide relocbase in newly added l_addr. This effectively reverts the patch to the initial version of D24918. Reported by: antoine (portmgr) Reviewed by: jhb, markj Tested by: markj Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D24946
Notes
Notes: svn path=/head/; revision=361349
-rw-r--r--cddl/contrib/opensolaris/lib/libdtrace/common/drti.c8
-rw-r--r--lib/libc/gen/dlinfo.313
-rw-r--r--libexec/rtld-elf/rtld.c3
-rw-r--r--sys/sys/link_elf.h3
4 files changed, 19 insertions, 8 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c b/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
index cd9294998454a..836eeccb8274a 100644
--- a/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
+++ b/cddl/contrib/opensolaris/lib/libdtrace/common/drti.c
@@ -143,12 +143,18 @@ dtrace_dof_init(void)
return;
}
+#ifdef __FreeBSD__
+ elf = (void *)lmp->l_base;
+#else
elf = (void *)lmp->l_addr;
+#endif
dh.dofhp_dof = (uintptr_t)dof;
- dh.dofhp_addr = elf->e_type == ET_DYN ? (uintptr_t) lmp->l_addr : 0;
#ifdef __FreeBSD__
+ dh.dofhp_addr = elf->e_type == ET_DYN ? (uintptr_t) lmp->l_base : 0;
dh.dofhp_pid = getpid();
+#else
+ dh.dofhp_addr = elf->e_type == ET_DYN ? (uintptr_t) lmp->l_addr : 0;
#endif
if (lmid == 0) {
diff --git a/lib/libc/gen/dlinfo.3 b/lib/libc/gen/dlinfo.3
index 7a6551dfe9ee2..a801b0bd005d3 100644
--- a/lib/libc/gen/dlinfo.3
+++ b/lib/libc/gen/dlinfo.3
@@ -105,17 +105,16 @@ structure is defined in
.In link.h
and has the following members:
.Bd -literal -offset indent
-caddr_t l_addr; /* Load Offset of library */
+caddr_t l_base; /* Base Address of library */
const char *l_name; /* Absolute Path to Library */
const void *l_ld; /* Pointer to .dynamic in memory */
struct link_map *l_next, /* linked list of mapped libs */
*l_prev;
+caddr_t l_addr; /* Load Offset of library */
.Ed
.Bl -tag -width ".Va l_addr"
-.It Va l_addr
-The load offset of the object, that is, the difference between
-the actual load address and the base virtual address the object
-was linked at.
+.It Va l_base
+The base address of the object loaded into memory.
.It Va l_name
The full name of the loaded shared object.
.It Va l_ld
@@ -130,6 +129,10 @@ structure on the link-map list.
The previous
.Vt Link_map
structure on the link-map list.
+.It Va l_addr
+The load offset of the object, that is, the difference between
+the actual load address and the base virtual address the object
+was linked at.
.El
.It Dv RTLD_DI_SERINFO
Retrieve the library search paths associated with the given
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 1af83f5dc18a3..1799d1893d281 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -4032,8 +4032,9 @@ linkmap_add(Obj_Entry *obj)
struct link_map *prev;
obj->linkmap.l_name = obj->path;
- obj->linkmap.l_addr = obj->relocbase;
+ obj->linkmap.l_base = obj->mapbase;
obj->linkmap.l_ld = obj->dynamic;
+ obj->linkmap.l_addr = obj->relocbase;
if (r_debug.r_map == NULL) {
r_debug.r_map = l;
diff --git a/sys/sys/link_elf.h b/sys/sys/link_elf.h
index 52ef4c84ea07a..7ea1b4e69ebcd 100644
--- a/sys/sys/link_elf.h
+++ b/sys/sys/link_elf.h
@@ -57,13 +57,14 @@
#define LA_SER_SECURE 0x80 /* default (secure) path prepended */
typedef struct link_map {
- caddr_t l_addr; /* Load Offset of library */
+ caddr_t l_base; /* Base Address of library */
#ifdef __mips__
caddr_t l_xxx; /* unused */
#endif
const char *l_name; /* Absolute Path to Library */
const void *l_ld; /* Pointer to .dynamic in memory */
struct link_map *l_next, *l_prev; /* linked list of of mapped libs */
+ caddr_t l_addr; /* Load Offset of library */
} Link_map;
struct r_debug {