Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 9 May 2012 15:16:39 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r235191 - in stable/8: lib/libc/gen libexec/rtld-elf sys/sys
Message-ID:  <201205091516.q49FGdaL089889@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201205091516.q49FGdaL089889>