X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=liblttng-ust-dl%2Fustdl.c;h=b6abca7b6e13c7562bbb4d1b8fccbcaea64bdf2b;hb=f02baefb3ba4d5493816d63f65625ba4269224d2;hp=8baf9ee3ca2f58ab84bc0a8a8fcc55bfda2c4e25;hpb=b13d93c24dfd101dc7a7f8ea2567a2164f807cdc;p=lttng-ust.git diff --git a/liblttng-ust-dl/ustdl.c b/liblttng-ust-dl/ustdl.c index 8baf9ee3..b6abca7b 100644 --- a/liblttng-ust-dl/ustdl.c +++ b/liblttng-ust-dl/ustdl.c @@ -16,12 +16,16 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#define _LGPL_SOURCE #define _GNU_SOURCE +#include #include -#include #include #include #include +#include +#include +#include #include #include #include @@ -30,9 +34,11 @@ #include #include +#define TRACEPOINT_DEFINE +#include "ust_baddr.h" + static void *(*__lttng_ust_plibc_dlopen)(const char *filename, int flag); static int (*__lttng_ust_plibc_dlclose)(void *handle); -static void *__lttng_ust_baddr_handle; static void *_lttng_ust_dl_libc_dlopen(const char *filename, int flag) @@ -61,59 +67,30 @@ int _lttng_ust_dl_libc_dlclose(void *handle) } static -void *lttng_ust_baddr_handle(void) +void lttng_ust_baddr_push(void *so_base, const char *so_name) { - if (!__lttng_ust_baddr_handle) { - __lttng_ust_baddr_handle = _lttng_ust_dl_libc_dlopen( - "liblttng-ust-baddr.so.0", RTLD_NOW | RTLD_GLOBAL); - if (__lttng_ust_baddr_handle == NULL) - fprintf(stderr, "%s\n", dlerror()); - } - return __lttng_ust_baddr_handle; -} + char resolved_path[PATH_MAX]; + struct stat sostat; -static -int lttng_ust_baddr_push(void *so_base, const char *so_name) -{ - static int - (*lttng_ust_baddr_push_fn)(void *so_base, const char *so_name); - if (!lttng_ust_baddr_push_fn) { - void *baddr_handle = lttng_ust_baddr_handle(); - if (baddr_handle) { - lttng_ust_baddr_push_fn = dlsym(baddr_handle, - "lttng_ust_push_baddr"); - if (lttng_ust_baddr_push_fn == NULL) - fprintf(stderr, "%s\n", dlerror()); - } - if (!lttng_ust_baddr_push_fn) - return -1; + if (!realpath(so_name, resolved_path)) { + ERR("could not resolve path '%s'", so_name); + return; } - return lttng_ust_baddr_push_fn(so_base, so_name); -} -static -int lttng_ust_baddr_pop(void *so_base) -{ - static int - (*lttng_ust_baddr_pop_fn)(void *so_base); - if (!lttng_ust_baddr_pop_fn) { - void *baddr_handle = lttng_ust_baddr_handle(); - if (baddr_handle) { - lttng_ust_baddr_pop_fn = dlsym(baddr_handle, - "lttng_ust_pop_baddr"); - if (lttng_ust_baddr_pop_fn == NULL) - fprintf(stderr, "%s\n", dlerror()); - } - if (!lttng_ust_baddr_pop_fn) - return -1; + if (stat(resolved_path, &sostat)) { + ERR("could not access file status for %s", resolved_path); + return; } - return lttng_ust_baddr_pop_fn(so_base); + + tracepoint(ust_baddr, push, + so_base, resolved_path, sostat.st_size, sostat.st_mtime); + return; } void *dlopen(const char *filename, int flag) { void *handle = _lttng_ust_dl_libc_dlopen(filename, flag); - if (handle) { + if (__tracepoint_ptrs_registered && handle) { struct link_map *p = NULL; if (dlinfo(handle, RTLD_DI_LINKMAP, &p) != -1 && p != NULL && p->l_addr != 0) @@ -124,23 +101,11 @@ void *dlopen(const char *filename, int flag) int dlclose(void *handle) { - if (handle) { + if (__tracepoint_ptrs_registered && handle) { struct link_map *p = NULL; if (dlinfo(handle, RTLD_DI_LINKMAP, &p) != -1 && p != NULL && p->l_addr != 0) - lttng_ust_baddr_pop((void *) p->l_addr); + tracepoint(ust_baddr, pop, (void *) p->l_addr); } return _lttng_ust_dl_libc_dlclose(handle); } - -static void __attribute__((destructor)) -lttng_ust_baddr_handle_fini(void); -static void -lttng_ust_baddr_handle_fini(void) -{ - if (__lttng_ust_baddr_handle) { - int ret = _lttng_ust_dl_libc_dlclose(__lttng_ust_baddr_handle); - if (ret) - fprintf(stderr, "%s\n", dlerror()); - } -}