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:
parent
e48f96382f
commit
8dd569934c
@ -33,6 +33,7 @@ libcrypt {
|
||||
libdl {
|
||||
GLIBC_2.0
|
||||
GLIBC_2.1
|
||||
GLIBC_2.3.3
|
||||
}
|
||||
libm {
|
||||
GLIBC_2.0
|
||||
|
@ -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 \
|
||||
|
@ -5,4 +5,7 @@ libdl {
|
||||
GLIBC_2.1 {
|
||||
dlopen; dlvsym;
|
||||
}
|
||||
GLIBC_2.3.3 {
|
||||
dladdr1;
|
||||
}
|
||||
}
|
||||
|
@ -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
35
dlfcn/dladdr1.c
Normal 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);
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -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. */
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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]. */
|
||||
|
@ -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. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user