From owner-svn-src-stable@FreeBSD.ORG Wed May 9 15:16:39 2012 Return-Path: Delivered-To: svn-src-stable@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [69.147.83.52]) by hub.freebsd.org (Postfix) with ESMTP id 8605F106566B; Wed, 9 May 2012 15:16:39 +0000 (UTC) (envelope-from kib@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 65D978FC14; Wed, 9 May 2012 15:16:39 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id q49FGdK0089895; Wed, 9 May 2012 15:16:39 GMT (envelope-from kib@svn.freebsd.org) Received: (from kib@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id q49FGdaL089889; Wed, 9 May 2012 15:16:39 GMT (envelope-from kib@svn.freebsd.org) Message-Id: <201205091516.q49FGdaL089889@svn.freebsd.org> From: Konstantin Belousov Date: Wed, 9 May 2012 15:16:39 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org X-SVN-Group: stable-8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r235191 - in stable/8: lib/libc/gen libexec/rtld-elf sys/sys X-BeenThere: svn-src-stable@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for all the -stable branches of the src tree List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 09 May 2012 15:16:39 -0000 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 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