summaryrefslogtreecommitdiffstats
path: root/libexec
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2015-06-30 14:17:02 +0000
committerdes <des@FreeBSD.org>2015-06-30 14:17:02 +0000
commit1bc136b874e52bbefbe932a5c36ae46da7e71075 (patch)
tree6c165b3d4154c65b1f44615820b4ec7e8534ab47 /libexec
parent292ef7b1577f3249e9c916893130a4f9f7db381b (diff)
downloadFreeBSD-src-1bc136b874e52bbefbe932a5c36ae46da7e71075.zip
FreeBSD-src-1bc136b874e52bbefbe932a5c36ae46da7e71075.tar.gz
MFH (r277695): allow tracing dlfunc() / dlsym() events
Diffstat (limited to 'libexec')
-rw-r--r--libexec/rtld-elf/rtld.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 2157abd..9ebfbca 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -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, void *retaddr, const Ver_Entry *ve,
#ifndef __ia64__
tls_index ti;
#endif
+ void *sym;
int res;
def = NULL;
@@ -3064,6 +3067,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
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, void *retaddr, const Ver_Entry *ve,
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, void *retaddr, const Ver_Entry *ve,
} 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, void *retaddr, const Ver_Entry *ve,
* 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;
}
OpenPOWER on IntegriCloud