Change the samantic of struct link_map l_addr member.

It previously returned the object map base address, while all other
ELF operating systems return load offset, i.e. the difference between
map base and the link base.

Explain the meaning of the field in the man page.

Stop filling the mips-only l_offs member, which is apparently unused.

PR:	246561
Requested by:	Damjan Jovanovic <damjan.jov@gmail.com>
Reviewed by:	emaste, jhb, cem (previous version)
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D24918
This commit is contained in:
Konstantin Belousov 2020-05-20 22:08:26 +00:00
parent ea6020830c
commit 2c6d9dc0bb
3 changed files with 8 additions and 10 deletions

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd February 14, 2003
.Dd May 19, 2020
.Dt DLINFO 3
.Os
.Sh NAME
@ -105,7 +105,7 @@ structure is defined in
.In link.h
and has the following members:
.Bd -literal -offset indent
caddr_t l_addr; /* Base Address of library */
caddr_t l_addr; /* Load Offset 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 */
@ -113,7 +113,9 @@ struct link_map *l_next, /* linked list of mapped libs */
.Ed
.Bl -tag -width ".Va l_addr"
.It Va l_addr
The base address of the object loaded into memory.
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_name
The full name of the loaded shared object.
.It Va l_ld

View File

@ -4032,12 +4032,8 @@ linkmap_add(Obj_Entry *obj)
struct link_map *prev;
obj->linkmap.l_name = obj->path;
obj->linkmap.l_addr = obj->mapbase;
obj->linkmap.l_addr = obj->relocbase;
obj->linkmap.l_ld = obj->dynamic;
#ifdef __mips__
/* GDB needs load offset on MIPS to use the symbols */
obj->linkmap.l_offs = obj->relocbase;
#endif
if (r_debug.r_map == NULL) {
r_debug.r_map = l;

View File

@ -57,9 +57,9 @@
#define LA_SER_SECURE 0x80 /* default (secure) path prepended */
typedef struct link_map {
caddr_t l_addr; /* Base Address of library */
caddr_t l_addr; /* Load Offset of library */
#ifdef __mips__
caddr_t l_offs; /* Load Offset of library */
caddr_t l_xxx; /* unused */
#endif
const char *l_name; /* Absolute Path to Library */
const void *l_ld; /* Pointer to .dynamic in memory */