Signed-off-by: Jérémie Galarneau <[email protected]>
---
 liblttng-ust/Makefile.am      |  7 ++++
 liblttng-ust/lttng-ust-comm.c | 75 ++++++++++++++++++++++++++++---------------
 2 files changed, 56 insertions(+), 26 deletions(-)

diff --git a/liblttng-ust/Makefile.am b/liblttng-ust/Makefile.am
index e2e1baa..802d32d 100644
--- a/liblttng-ust/Makefile.am
+++ b/liblttng-ust/Makefile.am
@@ -83,4 +83,11 @@ liblttng_ust_la_LIBADD = \
        liblttng-ust-tracepoint.la \
        liblttng-ust-runtime.la liblttng-ust-support.la
 
+if LTTNG_UST_BUILD_WITH_LIBDL
+liblttng_ust_la_LIBADD += -ldl
+endif
+if LTTNG_UST_BUILD_WITH_LIBC_DL
+liblttng_ust_la_LIBADD += -lc
+endif
+
 liblttng_ust_la_CFLAGS = -DUST_COMPONENT="liblttng_ust" -fno-strict-aliasing
diff --git a/liblttng-ust/lttng-ust-comm.c b/liblttng-ust/lttng-ust-comm.c
index 3df2adc..8258e85 100644
--- a/liblttng-ust/lttng-ust-comm.c
+++ b/liblttng-ust/lttng-ust-comm.c
@@ -20,6 +20,7 @@
  */
 
 #define _LGPL_SOURCE
+#define _GNU_SOURCE
 #include <sys/types.h>
 #include <sys/socket.h>
 #include <sys/mman.h>
@@ -52,6 +53,7 @@
 #include "compat.h"
 #include "../libringbuffer/tlsfixup.h"
 #include "lttng-ust-baddr.h"
+#include <lttng/ust-dlfcn.h>
 
 /*
  * Has lttng ust comm constructor been called ?
@@ -1405,10 +1407,8 @@ void lttng_ust_malloc_wrapper_init(void)
  */
 void __attribute__((constructor)) lttng_ust_init(void)
 {
-       struct timespec constructor_timeout;
        sigset_t sig_all_blocked, orig_parent_mask;
        pthread_attr_t thread_attr;
-       int timeout_mode;
        int ret;
 
        if (uatomic_xchg(&initialized, 1) == 1)
@@ -1446,8 +1446,6 @@ void __attribute__((constructor)) lttng_ust_init(void)
         */
        lttng_ust_malloc_wrapper_init();
 
-       timeout_mode = get_constructor_timeout(&constructor_timeout);
-
        ret = sem_init(&constructor_wait, 0, 0);
        assert(!ret);
 
@@ -1507,28 +1505,6 @@ void __attribute__((constructor)) lttng_ust_init(void)
        if (ret) {
                ERR("pthread_sigmask: %s", strerror(ret));
        }
-
-       switch (timeout_mode) {
-       case 1: /* timeout wait */
-               do {
-                       ret = sem_timedwait(&constructor_wait,
-                                       &constructor_timeout);
-               } while (ret < 0 && errno == EINTR);
-               if (ret < 0 && errno == ETIMEDOUT) {
-                       ERR("Timed out waiting for lttng-sessiond");
-               } else {
-                       assert(!ret);
-               }
-               break;
-       case -1:/* wait forever */
-               do {
-                       ret = sem_wait(&constructor_wait);
-               } while (ret < 0 && errno == EINTR);
-               assert(!ret);
-               break;
-       case 0: /* no timeout */
-               break;
-       }
 }
 
 static
@@ -1703,3 +1679,50 @@ void lttng_ust_sockinfo_session_enabled(void *owner)
        struct sock_info *sock_info = owner;
        sock_info->statedump_pending = 1;
 }
+
+int __libc_start_main(int (*main) (int, char **, char **), int argc,
+       char **ubp_av, void (*init) (void), void (*fini) (void),
+       void (*rtld_fini) (void), void (*stack_end))
+{
+       int ret;
+       int timeout_mode;
+       struct timespec constructor_timeout;
+       int (*libc_main_func)(int (*main) (int, char **, char **),
+               int argc, char **ubp_av, void (*init) (void),
+               void (*fini) (void), void (*rtld_fini) (void),
+               void (*stack_end));
+
+       /* Retrieve the original __libc_start_main function */
+       libc_main_func = dlsym(RTLD_NEXT, "__libc_start_main");
+       if (libc_main_func == NULL) {
+               ERR("unable to find \"__libc_start_main\" symbol\n");
+               errno = ENOSYS;
+               return -1;
+       }
+
+       timeout_mode = get_constructor_timeout(&constructor_timeout);
+       switch (timeout_mode) {
+       case 1: /* timeout wait */
+               do {
+                       ret = sem_timedwait(&constructor_wait,
+                                       &constructor_timeout);
+               } while (ret < 0 && errno == EINTR);
+               if (ret < 0 && errno == ETIMEDOUT) {
+                       ERR("Timed out waiting for lttng-sessiond");
+               } else {
+                       assert(!ret);
+               }
+               break;
+       case -1:/* wait forever */
+               do {
+                       ret = sem_wait(&constructor_wait);
+               } while (ret < 0 && errno == EINTR);
+               assert(!ret);
+               break;
+       case 0: /* no timeout */
+               break;
+       }
+
+       /* Call the original function */
+       return libc_main_func(main, argc, ubp_av, init, fini, rtld_fini, 
stack_end);
+}
-- 
2.1.3


_______________________________________________
lttng-dev mailing list
[email protected]
http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

Reply via email to