Allow tracing dlfunc() / dlsym() events.
MFC after: 1 week
This commit is contained in:
parent
d4ff1726f9
commit
4ac1e0a9fc
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=277695
@ -266,6 +266,8 @@ bool ld_library_path_rpath = false;
|
|||||||
#define UTRACE_PRELOAD_FINISHED 8
|
#define UTRACE_PRELOAD_FINISHED 8
|
||||||
#define UTRACE_INIT_CALL 9
|
#define UTRACE_INIT_CALL 9
|
||||||
#define UTRACE_FINI_CALL 10
|
#define UTRACE_FINI_CALL 10
|
||||||
|
#define UTRACE_DLSYM_START 11
|
||||||
|
#define UTRACE_DLSYM_STOP 12
|
||||||
|
|
||||||
struct utrace_rtld {
|
struct utrace_rtld {
|
||||||
char sig[4]; /* 'RTLD' */
|
char sig[4]; /* 'RTLD' */
|
||||||
@ -3099,6 +3101,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
|
|||||||
SymLook req;
|
SymLook req;
|
||||||
RtldLockState lockstate;
|
RtldLockState lockstate;
|
||||||
tls_index ti;
|
tls_index ti;
|
||||||
|
void *sym;
|
||||||
int res;
|
int res;
|
||||||
|
|
||||||
def = NULL;
|
def = NULL;
|
||||||
@ -3108,6 +3111,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
|
|||||||
req.flags = flags | SYMLOOK_IN_PLT;
|
req.flags = flags | SYMLOOK_IN_PLT;
|
||||||
req.lockstate = &lockstate;
|
req.lockstate = &lockstate;
|
||||||
|
|
||||||
|
LD_UTRACE(UTRACE_DLSYM_START, handle, NULL, 0, 0, name);
|
||||||
rlock_acquire(rtld_bind_lock, &lockstate);
|
rlock_acquire(rtld_bind_lock, &lockstate);
|
||||||
if (sigsetjmp(lockstate.env, 0) != 0)
|
if (sigsetjmp(lockstate.env, 0) != 0)
|
||||||
lock_upgrade(rtld_bind_lock, &lockstate);
|
lock_upgrade(rtld_bind_lock, &lockstate);
|
||||||
@ -3117,6 +3121,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
|
|||||||
if ((obj = obj_from_addr(retaddr)) == NULL) {
|
if ((obj = obj_from_addr(retaddr)) == NULL) {
|
||||||
_rtld_error("Cannot determine caller's shared object");
|
_rtld_error("Cannot determine caller's shared object");
|
||||||
lock_release(rtld_bind_lock, &lockstate);
|
lock_release(rtld_bind_lock, &lockstate);
|
||||||
|
LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (handle == NULL) { /* Just the caller's shared object. */
|
if (handle == NULL) { /* Just the caller's shared object. */
|
||||||
@ -3164,6 +3169,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
|
|||||||
} else {
|
} else {
|
||||||
if ((obj = dlcheck(handle)) == NULL) {
|
if ((obj = dlcheck(handle)) == NULL) {
|
||||||
lock_release(rtld_bind_lock, &lockstate);
|
lock_release(rtld_bind_lock, &lockstate);
|
||||||
|
LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3207,19 +3213,22 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
|
|||||||
* symbol.
|
* symbol.
|
||||||
*/
|
*/
|
||||||
if (ELF_ST_TYPE(def->st_info) == STT_FUNC)
|
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)
|
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) {
|
else if (ELF_ST_TYPE(def->st_info) == STT_TLS) {
|
||||||
ti.ti_module = defobj->tlsindex;
|
ti.ti_module = defobj->tlsindex;
|
||||||
ti.ti_offset = def->st_value;
|
ti.ti_offset = def->st_value;
|
||||||
return (__tls_get_addr(&ti));
|
sym = __tls_get_addr(&ti);
|
||||||
} else
|
} 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);
|
_rtld_error("Undefined symbol \"%s\"", name);
|
||||||
lock_release(rtld_bind_lock, &lockstate);
|
lock_release(rtld_bind_lock, &lockstate);
|
||||||
|
LD_UTRACE(UTRACE_DLSYM_STOP, handle, NULL, 0, 0, name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1531,6 +1531,8 @@ ktrcsw(struct ktr_csw *cs)
|
|||||||
#define UTRACE_PRELOAD_FINISHED 8
|
#define UTRACE_PRELOAD_FINISHED 8
|
||||||
#define UTRACE_INIT_CALL 9
|
#define UTRACE_INIT_CALL 9
|
||||||
#define UTRACE_FINI_CALL 10
|
#define UTRACE_FINI_CALL 10
|
||||||
|
#define UTRACE_DLSYM_START 11
|
||||||
|
#define UTRACE_DLSYM_STOP 12
|
||||||
|
|
||||||
struct utrace_rtld {
|
struct utrace_rtld {
|
||||||
char sig[4]; /* '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,
|
printf("RTLD: fini %p for %p (%s)\n", ut->mapbase, ut->handle,
|
||||||
ut->name);
|
ut->name);
|
||||||
break;
|
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:
|
default:
|
||||||
cp = p;
|
cp = p;
|
||||||
cp += 4;
|
cp += 4;
|
||||||
|
Loading…
Reference in New Issue
Block a user