Author: des
Date: Tue Jun 30 14:17:02 2015
New Revision: 284954
URL: https://svnweb.freebsd.org/changeset/base/284954

Log:
  MFH (r277695): allow tracing dlfunc() / dlsym() events

Modified:
  stable/10/libexec/rtld-elf/rtld.c
  stable/10/usr.bin/kdump/kdump.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/libexec/rtld-elf/rtld.c
==============================================================================
--- stable/10/libexec/rtld-elf/rtld.c   Tue Jun 30 13:34:46 2015        
(r284953)
+++ stable/10/libexec/rtld-elf/rtld.c   Tue Jun 30 14:17:02 2015        
(r284954)
@@ -279,6 +279,8 @@ bool ld_library_path_rpath = false;
 #define        UTRACE_PRELOAD_FINISHED         8
 #define        UTRACE_INIT_CALL                9
 #define        UTRACE_FINI_CALL                10
+#define        UTRACE_DLSYM_START              11
+#define        UTRACE_DLSYM_STOP               12
 
 struct utrace_rtld {
        char sig[4];                    /* 'RTLD' */
@@ -3055,6 +3057,7 @@ do_dlsym(void *handle, const char *name,
 #ifndef __ia64__
     tls_index ti;
 #endif
+    void *sym;
     int res;
 
     def = NULL;
@@ -3064,6 +3067,7 @@ do_dlsym(void *handle, const char *name,
     req.flags = flags | SYMLOOK_IN_PLT;
     req.lockstate = &lockstate;
 
+    LD_UTRACE(UTRACE_DLSYM_START, handle, NULL, 0, 0, name);
     rlock_acquire(rtld_bind_lock, &lockstate);
     if (sigsetjmp(lockstate.env, 0) != 0)
            lock_upgrade(rtld_bind_lock, &lockstate);
@@ -3073,6 +3077,7 @@ do_dlsym(void *handle, const char *name,
        if ((obj = obj_from_addr(retaddr)) == NULL) {
            _rtld_error("Cannot determine caller's shared object");
            lock_release(rtld_bind_lock, &lockstate);
+           LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
            return NULL;
        }
        if (handle == NULL) {   /* Just the caller's shared object. */
@@ -3120,6 +3125,7 @@ do_dlsym(void *handle, const char *name,
     } else {
        if ((obj = dlcheck(handle)) == NULL) {
            lock_release(rtld_bind_lock, &lockstate);
+           LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
            return NULL;
        }
 
@@ -3166,23 +3172,26 @@ do_dlsym(void *handle, const char *name,
         * the relocated value of the symbol.
         */
        if (ELF_ST_TYPE(def->st_info) == STT_FUNC)
-           return (make_function_pointer(def, defobj));
+           sym = make_function_pointer(def, defobj);
        else if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC)
-           return (rtld_resolve_ifunc(defobj, def));
+           sym = rtld_resolve_ifunc(defobj, def);
        else if (ELF_ST_TYPE(def->st_info) == STT_TLS) {
 #ifdef __ia64__
            return (__tls_get_addr(defobj->tlsindex, def->st_value));
 #else
            ti.ti_module = defobj->tlsindex;
            ti.ti_offset = def->st_value;
-           return (__tls_get_addr(&ti));
+           sym = __tls_get_addr(&ti);
 #endif
        } else
-           return (defobj->relocbase + def->st_value);
+           sym = defobj->relocbase + def->st_value;
+       LD_UTRACE(UTRACE_DLSYM_STOP, handle, sym, 0, 0, name);
+       return (sym);
     }
 
     _rtld_error("Undefined symbol \"%s\"", name);
     lock_release(rtld_bind_lock, &lockstate);
+    LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
     return NULL;
 }
 

Modified: stable/10/usr.bin/kdump/kdump.c
==============================================================================
--- stable/10/usr.bin/kdump/kdump.c     Tue Jun 30 13:34:46 2015        
(r284953)
+++ stable/10/usr.bin/kdump/kdump.c     Tue Jun 30 14:17:02 2015        
(r284954)
@@ -1452,6 +1452,8 @@ ktrcsw(struct ktr_csw *cs)
 #define        UTRACE_PRELOAD_FINISHED         8
 #define        UTRACE_INIT_CALL                9
 #define        UTRACE_FINI_CALL                10
+#define        UTRACE_DLSYM_START              11
+#define        UTRACE_DLSYM_STOP               12
 
 struct utrace_rtld {
        char sig[4];                            /* 'RTLD' */
@@ -1531,6 +1533,13 @@ ktruser_rtld(int len, void *p)
                printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
                    ut->name);
                break;
+       case UTRACE_DLSYM_START:
+               printf("RTLD: dlsym(%p, %s)\n", ut->handle, ut->name);
+               break;
+       case UTRACE_DLSYM_STOP:
+               printf("RTLD: %p = dlsym(%p, %s)\n", ut->mapbase, ut->handle,
+                   ut->name);
+               break;
        default:
                cp = p;
                cp += 4;
_______________________________________________
svn-src-stable-10@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "svn-src-stable-10-unsubscr...@freebsd.org"

Reply via email to