svn commit: r235191 - in stable/8: lib/libc/gen libexec/rtld-elf
sys/sys
Konstantin Belousov
kib at FreeBSD.org
Wed May 9 15:16:39 UTC 2012
Author: kib
Date: Wed May 9 15:16:38 2012
New Revision: 235191
URL: http://svn.freebsd.org/changeset/base/235191
Log:
MFC r211705:
Introduce implementation-private rtld interface _rtld_addr_phdr, which
fills struct dl_phdr_info for the shared object that contains the
specified address, if any.
Requested and tested by: Peter Jeremy <peter rulingia com>
Modified:
stable/8/lib/libc/gen/Symbol.map
stable/8/lib/libc/gen/dlfcn.c
stable/8/libexec/rtld-elf/Symbol.map
stable/8/libexec/rtld-elf/rtld.c
stable/8/sys/sys/link_elf.h
Directory Properties:
stable/8/lib/libc/ (props changed)
stable/8/libexec/rtld-elf/ (props changed)
stable/8/sys/ (props changed)
Modified: stable/8/lib/libc/gen/Symbol.map
==============================================================================
--- stable/8/lib/libc/gen/Symbol.map Wed May 9 15:15:13 2012 (r235190)
+++ stable/8/lib/libc/gen/Symbol.map Wed May 9 15:16:38 2012 (r235191)
@@ -440,6 +440,7 @@ FBSDprivate_1.0 {
_spinlock;
_spinlock_debug;
_spinunlock;
+ _rtld_addr_phdr;
_rtld_atfork_pre;
_rtld_atfork_post;
_rtld_error; /* for private use */
Modified: stable/8/lib/libc/gen/dlfcn.c
==============================================================================
--- stable/8/lib/libc/gen/dlfcn.c Wed May 9 15:15:13 2012 (r235190)
+++ stable/8/lib/libc/gen/dlfcn.c Wed May 9 15:16:38 2012 (r235191)
@@ -157,3 +157,11 @@ void
_rtld_atfork_post(int *locks)
{
}
+
+#pragma weak _rtld_addr_phdr
+int
+_rtld_addr_phdr(const void *addr, struct dl_phdr_info *phdr_info)
+{
+
+ return (0);
+}
Modified: stable/8/libexec/rtld-elf/Symbol.map
==============================================================================
--- stable/8/libexec/rtld-elf/Symbol.map Wed May 9 15:15:13 2012 (r235190)
+++ stable/8/libexec/rtld-elf/Symbol.map Wed May 9 15:16:38 2012 (r235191)
@@ -24,4 +24,5 @@ FBSDprivate_1.0 {
_rtld_free_tls;
_rtld_atfork_pre;
_rtld_atfork_post;
+ _rtld_addr_phdr;
};
Modified: stable/8/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/8/libexec/rtld-elf/rtld.c Wed May 9 15:15:13 2012 (r235190)
+++ stable/8/libexec/rtld-elf/rtld.c Wed May 9 15:16:38 2012 (r235191)
@@ -143,6 +143,8 @@ static int rtld_verify_object_versions(
static void object_add_name(Obj_Entry *, const char *);
static int object_match_name(const Obj_Entry *, const char *);
static void ld_utrace_log(int, void *, void *, size_t, int, const char *);
+static void rtld_fill_dl_phdr_info(const Obj_Entry *obj,
+ struct dl_phdr_info *phdr_info);
void r_debug_state(struct r_debug *, struct link_map *);
@@ -214,6 +216,7 @@ static func_ptr_type exports[] = {
(func_ptr_type) &dl_iterate_phdr,
(func_ptr_type) &_rtld_atfork_pre,
(func_ptr_type) &_rtld_atfork_post,
+ (func_ptr_type) &_rtld_addr_phdr,
NULL
};
@@ -2266,6 +2269,24 @@ dlvsym(void *handle, const char *name, c
}
int
+_rtld_addr_phdr(const void *addr, struct dl_phdr_info *phdr_info)
+{
+ const Obj_Entry *obj;
+ int lockstate;
+
+ lockstate = rlock_acquire(rtld_bind_lock);
+ obj = obj_from_addr(addr);
+ if (obj == NULL) {
+ _rtld_error("No shared object contains address");
+ rlock_release(rtld_bind_lock, lockstate);
+ return (0);
+ }
+ rtld_fill_dl_phdr_info(obj, phdr_info);
+ rlock_release(rtld_bind_lock, lockstate);
+ return (1);
+}
+
+int
dladdr(const void *addr, Dl_info *info)
{
const Obj_Entry *obj;
@@ -2367,6 +2388,21 @@ dlinfo(void *handle, int request, void *
return (error);
}
+static void
+rtld_fill_dl_phdr_info(const Obj_Entry *obj, struct dl_phdr_info *phdr_info)
+{
+
+ phdr_info->dlpi_addr = (Elf_Addr)obj->relocbase;
+ phdr_info->dlpi_name = STAILQ_FIRST(&obj->names) ?
+ STAILQ_FIRST(&obj->names)->name : obj->path;
+ phdr_info->dlpi_phdr = obj->phdr;
+ phdr_info->dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]);
+ phdr_info->dlpi_tls_modid = obj->tlsindex;
+ phdr_info->dlpi_tls_data = obj->tlsinit;
+ phdr_info->dlpi_adds = obj_loads;
+ phdr_info->dlpi_subs = obj_loads - obj_count;
+}
+
int
dl_iterate_phdr(__dl_iterate_hdr_callback callback, void *param)
{
@@ -2380,16 +2416,7 @@ dl_iterate_phdr(__dl_iterate_hdr_callbac
error = 0;
for (obj = obj_list; obj != NULL; obj = obj->next) {
- phdr_info.dlpi_addr = (Elf_Addr)obj->relocbase;
- phdr_info.dlpi_name = STAILQ_FIRST(&obj->names) ?
- STAILQ_FIRST(&obj->names)->name : obj->path;
- phdr_info.dlpi_phdr = obj->phdr;
- phdr_info.dlpi_phnum = obj->phsize / sizeof(obj->phdr[0]);
- phdr_info.dlpi_tls_modid = obj->tlsindex;
- phdr_info.dlpi_tls_data = obj->tlsinit;
- phdr_info.dlpi_adds = obj_loads;
- phdr_info.dlpi_subs = obj_loads - obj_count;
-
+ rtld_fill_dl_phdr_info(obj, &phdr_info);
if ((error = callback(&phdr_info, sizeof phdr_info, param)) != 0)
break;
Modified: stable/8/sys/sys/link_elf.h
==============================================================================
--- stable/8/sys/sys/link_elf.h Wed May 9 15:15:13 2012 (r235190)
+++ stable/8/sys/sys/link_elf.h Wed May 9 15:16:38 2012 (r235191)
@@ -92,6 +92,7 @@ __BEGIN_DECLS
typedef int (*__dl_iterate_hdr_callback)(struct dl_phdr_info *, size_t, void *);
extern int dl_iterate_phdr(__dl_iterate_hdr_callback, void *);
+int _rtld_addr_phdr(const void *, struct dl_phdr_info *);
__END_DECLS
More information about the svn-src-stable-8
mailing list