svn commit: r277695 - in head: libexec/rtld-elf usr.bin/kdump
Dag-Erling Smørgrav
des at FreeBSD.org
Sun Jan 25 12:11:52 UTC 2015
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;
More information about the svn-src-head
mailing list