2003-03-10 Roland McGrath <roland@redhat.com>

* dlfcn/Makefile (libdl-routines): Add dladdr1.
	* dlfcn/dladdr1.c: New file.
	* dlfcn/dlfcn.h [__USE_GNU]: Declare dladdr1.
	[__USE_GNU] (RTLD_DL_SYMENT, RTLD_DL_LINKMAP): New enum constants.
	* elf/dl-addr.c (_dl_addr): Take new args, a struct link_map ** and
	a const ElfNN_Sym ** to fill in.
	* include/dlfcn.h: Update decl.  Include <link.h>.
	* dlfcn/dladdr.c (dladdr): Update caller.
	* malloc/mtrace.c (tr_where): Likewise.
	* sysdeps/generic/elf/backtracesyms.c: Likewise.
	* sysdeps/generic/elf/backtracesymsfd.c: Likewise.
	* dlfcn/Versions (libdl: GLIBC_2.3.3): New set, add dladdr1.
	* Versions.def (libdl): Define GLIBC_2.3.3 set.
This commit is contained in:
Roland McGrath 2003-03-10 09:12:11 +00:00
parent e48f96382f
commit 8dd569934c
11 changed files with 79 additions and 13 deletions

View File

@ -33,6 +33,7 @@ libcrypt {
libdl {
GLIBC_2.0
GLIBC_2.1
GLIBC_2.3.3
}
libm {
GLIBC_2.0

View File

@ -19,7 +19,7 @@
subdir := dlfcn
headers := bits/dlfcn.h dlfcn.h
extra-libs := libdl
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr eval
libdl-routines := dlopen dlclose dlsym dlvsym dlerror dladdr dladdr1 eval
distribute := dlopenold.c glreflib1.c glreflib2.c failtestmod.c eval.c \
defaultmod1.c defaultmod2.c errmsg1mod.c modatexit.c \
modcxaatexit.c modstatic.c \

View File

@ -5,4 +5,7 @@ libdl {
GLIBC_2.1 {
dlopen; dlvsym;
}
GLIBC_2.3.3 {
dladdr1;
}
}

View File

@ -1,5 +1,5 @@
/* Locate the shared object symbol nearest a given address.
Copyright (C) 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
Copyright (C) 1996, 1997, 1998, 1999, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -22,5 +22,5 @@
int
dladdr (const void *address, Dl_info *info)
{
return _dl_addr (address, info);
return _dl_addr (address, info, NULL, NULL);
}

35
dlfcn/dladdr1.c Normal file
View File

@ -0,0 +1,35 @@
/* Locate the shared object symbol nearest a given address.
Copyright (C) 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
#include <dlfcn.h>
int
dladdr1 (const void *address, Dl_info *info, void **extra, int flags)
{
switch (flags)
{
default: /* Make this an error? */
case 0:
return _dl_addr (address, info, NULL, NULL);
case RTLD_DL_SYMENT:
return _dl_addr (address, info, NULL, (const ElfW(Sym) **) extra);
case RTLD_DL_LINKMAP:
return _dl_addr (address, info, (struct link_map **) extra, NULL);
}
}

View File

@ -1,5 +1,5 @@
/* User functions for run-time dynamic loading.
Copyright (C) 1995-1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1995-1999,2000,2001,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -83,6 +83,23 @@ typedef struct
/* Fill in *INFO with the following information about ADDRESS.
Returns 0 iff no shared object's segments contain that address. */
extern int dladdr (__const void *__address, Dl_info *__info) __THROW;
/* Same as `dladdr', but additionally sets *EXTRA_INFO according to FLAGS. */
extern int dladdr1 (__const void *__address, Dl_info *__info,
void **__extra_info, int __flags) __THROW;
/* These are the possible values for the FLAGS argument to `dladdr1'.
This indicates what extra information is stored at *EXTRA_INFO.
It may also be zero, in which case the EXTRA_INFO argument is not used. */
enum
{
/* Matching symbol table entry (const ElfNN_Sym *). */
RTLD_DL_SYMENT = 1,
/* The object containing the address (struct link_map *). */
RTLD_DL_LINKMAP = 2
};
#endif
__END_DECLS

View File

@ -1,5 +1,5 @@
/* Locate the shared object symbol nearest a given address.
Copyright (C) 1996-2000, 2001, 2002 Free Software Foundation, Inc.
Copyright (C) 1996-2000,2001,2002,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@ -24,7 +24,8 @@
int
internal_function
_dl_addr (const void *address, Dl_info *info)
_dl_addr (const void *address, Dl_info *info,
struct link_map **mapp, const ElfW(Sym) **symbolp)
{
const ElfW(Addr) addr = DL_LOOKUP_ADDRESS (address);
struct link_map *l, *match;
@ -93,6 +94,11 @@ _dl_addr (const void *address, Dl_info *info)
|| ELFW(ST_BIND) (symtab->st_info) == STB_WEAK))
matchsym = (ElfW(Sym) *) symtab;
if (mapp)
*mapp = match;
if (symbolp)
*symbolp = matchsym;
if (matchsym)
{
/* We found a symbol close by. Fill in its name and exact address. */

View File

@ -1,5 +1,6 @@
#ifndef _DLFCN_H
#include <dlfcn/dlfcn.h>
#include <link.h> /* For ElfW. */
/* Internally used flag. */
#define __RTLD_DLOPEN 0x80000000
@ -15,9 +16,12 @@ extern void *__libc_dlsym (void *__map, __const char *__name);
extern int __libc_dlclose (void *__map);
/* Locate shared object containing the given address. */
extern int _dl_addr (const void *address, Dl_info *info)
#ifdef ElfW
extern int _dl_addr (const void *address, Dl_info *info,
struct link_map **mapp, const ElfW(Sym) **symbolp)
internal_function;
libc_hidden_proto (_dl_addr)
#endif
/* Open the shared object NAME, relocate it, and run its initializer if it
hasn't already been run. MODE is as for `dlopen' (see <dlfcn.h>). If

View File

@ -1,5 +1,5 @@
/* More debugging hooks for `malloc'.
Copyright (C) 1991-1994,1996-2001,2002 Free Software Foundation, Inc.
Copyright (C) 1991-1994,1996-2001,2002, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Written April 2, 1991 by John Gilmore of Cygnus Support.
Based on mcheck.c by Mike Haertel.
@ -103,7 +103,7 @@ tr_where (caller)
{
#ifdef HAVE_ELF
Dl_info info;
if (_dl_addr (caller, &info))
if (_dl_addr (caller, &info, NULL, NULL))
{
char *buf = (char *) "";
if (info.dli_sname != NULL)

View File

@ -1,5 +1,5 @@
/* Return list with names for address in backtrace.
Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
Copyright (C) 1998,1999,2000,2001,2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -48,7 +48,7 @@ __backtrace_symbols (array, size)
/* Fill in the information we can get from `dladdr'. */
for (cnt = 0; cnt < size; ++cnt)
{
status[cnt] = _dl_addr (array[cnt], &info[cnt]);
status[cnt] = _dl_addr (array[cnt], &info[cnt], NULL, NULL);
if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
/* We have some info, compute the length of the string which will be
"<file-name>(<sym-name>) [+offset]. */

View File

@ -1,5 +1,5 @@
/* Write formatted list with names for addresses in backtrace to a file.
Copyright (C) 1998, 2000 Free Software Foundation, Inc.
Copyright (C) 1998, 2000, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
@ -48,7 +48,7 @@ __backtrace_symbols_fd (array, size, fd)
Dl_info info;
size_t last = 0;
if (_dl_addr (array[cnt], &info)
if (_dl_addr (array[cnt], &info, NULL, NULL)
&& info.dli_fname && info.dli_fname[0] != '\0')
{
/* Name of the file. */