Author: des
Date: Sun Jan 25 12:11:50 2015
New Revision: 277695
URL: https://svnweb.freebsd.org/changeset/base/277695

Log:
  Allow tracing dlfunc() / dlsym() events.
  
  MFC after:    1 week

Modified:
  head/libexec/rtld-elf/rtld.c
  head/usr.bin/kdump/kdump.c

Modified: head/libexec/rtld-elf/rtld.c
==============================================================================
--- head/libexec/rtld-elf/rtld.c        Sun Jan 25 12:02:38 2015        
(r277694)
+++ head/libexec/rtld-elf/rtld.c        Sun Jan 25 12:11:50 2015        
(r277695)
@@ -266,6 +266,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' */
@@ -3099,6 +3101,7 @@ do_dlsym(void *handle, const char *name,
     SymLook req;
     RtldLockState lockstate;
     tls_index ti;
+    void *sym;
     int res;
 
     def = NULL;
@@ -3108,6 +3111,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);
@@ -3117,6 +3121,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. */
@@ -3164,6 +3169,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;
        }
 
@@ -3207,19 +3213,22 @@ do_dlsym(void *handle, const char *name,
         * 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) {
            ti.ti_module = defobj->tlsindex;
            ti.ti_offset = def->st_value;
-           return (__tls_get_addr(&ti));
+           sym = __tls_get_addr(&ti);
        } 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: head/usr.bin/kdump/kdump.c
==============================================================================
--- head/usr.bin/kdump/kdump.c  Sun Jan 25 12:02:38 2015        (r277694)
+++ head/usr.bin/kdump/kdump.c  Sun Jan 25 12:11:50 2015        (r277695)
@@ -1531,6 +1531,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' */
@@ -1610,6 +1612,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-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to