gprofng: fix build issues on musl
authorVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Wed, 14 Sep 2022 08:11:45 +0000 (01:11 -0700)
committerVladimir Mezentsev <vladimir.mezentsev@oracle.com>
Thu, 15 Sep 2022 01:38:09 +0000 (18:38 -0700)
gprofng/ChangeLog
2022-09-14  Vladimir Mezentsev  <vladimir.mezentsev@oracle.com>

PR gprofng/29477
* configure.ac: Set __MUSL_LIBC.
* configure: Rebuild.
* common/config.h.in: Rebuild.
* src/collector_module.h: Fix compiler errors because mmap64, open64,
pwrite64 are macros and getcontext() is absent on musl.
* libcollector/collector.c: Likewise.
* libcollector/hwprofile.c: Likewise.
* libcollector/iolib.c: Likewise.
* libcollector/libcol_util.c: Likewise.
* libcollector/linetrace.c: Likewise.
* libcollector/memmgr.c: Likewise.
* libcollector/profile.c: Likewise.
* libcollector/unwind.c: Likewise.
* libcollector/dispatcher.c: Likewise.
* src/Experiment.cc: Likewise.
* libcollector/collector.h: Use dlsym() because dlvsym() is not defined
on musl.
* libcollector/iotrace.c: Remove interposition of versioned functions.
* libcollector/mmaptrace.c: Likewise.
* libcollector/libcol_util.h: Fix -Wint-to-pointer-cast warnings.
* libcollector/jprofile.c: Likewise.
* libcollector/synctrace.c: Include "collector.h".
* src/Print.cc: Use get_basename() because basename() is not defined
on musl.
* common/hwcdrv.c: Fix -Wformat= warnings.

22 files changed:
gprofng/common/config.h.in
gprofng/common/hwcdrv.c
gprofng/configure
gprofng/configure.ac
gprofng/libcollector/collector.c
gprofng/libcollector/collector.h
gprofng/libcollector/dispatcher.c
gprofng/libcollector/hwprofile.c
gprofng/libcollector/iolib.c
gprofng/libcollector/iotrace.c
gprofng/libcollector/jprofile.c
gprofng/libcollector/libcol_util.c
gprofng/libcollector/libcol_util.h
gprofng/libcollector/linetrace.c
gprofng/libcollector/memmgr.c
gprofng/libcollector/mmaptrace.c
gprofng/libcollector/profile.c
gprofng/libcollector/synctrace.c
gprofng/libcollector/unwind.c
gprofng/src/Experiment.cc
gprofng/src/Print.cc
gprofng/src/collector_module.h

index 8409ce74a57814345823e6a7b19d22f213b7f16f..f8484f238fd54d1b61847c0fc3a30aa751220a3a 100644 (file)
 
 /* Define to 1 if you need to in order for `stat' and other things to work. */
 #undef _POSIX_SOURCE
+
+/* Build with musl-libc. */
+#undef __MUSL_LIBC
index caab9839b499765a4591dac42ce1ac7ed2318497..05390e239df00b38e189f6e1c432ea614352019e 100644 (file)
@@ -440,7 +440,7 @@ typedef struct
 { // per-thread context
   counter_state_t *ctr_list;
   int signal_fd;                // fd that caused the most recent signal
-  pthread_t tid;                // for debugging signal delivery problems
+  pid_t tid;                   // for debugging signal delivery problems
 } hdrv_pcl_ctx_t;
 
 /*---------------------------------------------------------------------------*/
@@ -1321,7 +1321,7 @@ hwcdrv_free_counters () // note: only performs shutdown for this thread
   for (int ii = 0; ii < hdrv_pcl_state.hwcdef_cnt; ii++)
     if (stop_one_ctr (ii, ctr_list))
       hwc_rc = HWCFUNCS_ERROR_GENERIC;
-  TprintfT (DBG_LT1, "hwcdrv: hwcdrv_free_counters(tid=0x%lx).\n", pctx->tid);
+  TprintfT (DBG_LT1, "hwcdrv: hwcdrv_free_counters(tid=0x%lx).\n", (long) pctx->tid);
   pctx->ctr_list = NULL;
   return hwc_rc;
 }
@@ -1351,7 +1351,7 @@ hwcdrv_start (void) /* must be called from each thread ? */
       return HWCFUNCS_ERROR_UNEXPECTED;
     }
   pctx->tid = hwcdrv_gettid ();
-  TprintfT (DBG_LT1, "hwcdrv: hwcdrv_start(tid=0x%lx)\n", pctx->tid);
+  TprintfT (DBG_LT1, "hwcdrv: hwcdrv_start(tid=0x%lx)\n", (long) pctx->tid);
 
   /*
    * create per-thread counter list
index fad5b030072eb51714afe269f3860f961f282789..301ac10050b7a3613427484196182952005ae91f 100755 (executable)
@@ -16572,7 +16572,7 @@ class Simple{
   }
 }
 EOF
-      if { ac_try='$JAVAC conftest.java &5 2>&1'
+      if { ac_try='$JAVAC configtest.java &5 2>&1'
   { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
   (eval $ac_try) 2>&5
   ac_status=$?
@@ -16608,6 +16608,34 @@ $as_echo "#define DEBUG 1" >>confdefs.h
 
 fi
 
+cat > "dummy.c" << EOF
+#include <features.h>
+#if defined(__UCLIBC__)
+LIBC=uclibc
+#elif defined(__dietlibc__)
+LIBC=dietlibc
+#elif defined(__GLIBC__)
+LIBC=gnu
+#else
+#include <stdarg.h>
+/* First heuristic to detect musl libc.  */
+#ifdef __DEFINED_va_list
+LIBC=musl
+#else
+LIBC=gnu
+#endif
+#endif
+EOF
+cc_set_libc=`$CC -E "dummy.c" 2>/dev/null | grep '^LIBC=' | sed 's, ,,g'`
+eval "$cc_set_libc"
+echo "cc_set_libc=$cc_set_libc;"
+if test "$LIBC" = musl; then
+
+$as_echo "#define __MUSL_LIBC 1" >>confdefs.h
+
+fi
+
+
 # Check if linker supports --as-needed and --no-as-needed options.
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking linker --as-needed support" >&5
 $as_echo_n "checking linker --as-needed support... " >&6; }
index e945310960289d5cb67d79f35364876c689190ce..2d7640dfdc8fe0b4c04de9b75be1007abc0a4e56 100644 (file)
@@ -142,7 +142,7 @@ class Simple{
   }
 }
 EOF
-      if AC_TRY_COMMAND($JAVAC conftest.java &AS_MESSAGE_LOG_FD 2>&1); then
+      if AC_TRY_COMMAND($JAVAC configtest.java &AS_MESSAGE_LOG_FD 2>&1); then
        GPROFNG_BROKEN_JAVAC=no
       else
        GPROFNG_BROKEN_JAVAC=yes
@@ -159,6 +159,31 @@ if test "${enable_gprofng_debug}" = yes; then
     AC_DEFINE(DEBUG, 1, [Enable debugging output.])
 fi
 
+cat > "dummy.c" << EOF
+#include <features.h>
+#if defined(__UCLIBC__)
+LIBC=uclibc
+#elif defined(__dietlibc__)
+LIBC=dietlibc
+#elif defined(__GLIBC__)
+LIBC=gnu
+#else
+#include <stdarg.h>
+/* First heuristic to detect musl libc.  */
+#ifdef __DEFINED_va_list
+LIBC=musl
+#else
+LIBC=gnu
+#endif
+#endif
+EOF
+cc_set_libc=`$CC -E "dummy.c" 2>/dev/null | grep '^LIBC=' | sed 's, ,,g'`
+eval "$cc_set_libc"
+if test "$LIBC" = musl; then
+  AC_DEFINE(__MUSL_LIBC, 1, [Build with musl-libc.])
+fi
+
+
 # Check if linker supports --as-needed and --no-as-needed options.
 AC_CACHE_CHECK(linker --as-needed support, bfd_cv_ld_as_needed,
        [bfd_cv_ld_as_needed=no
index ceff2c1caccb41b0e113abc8d6ae3f7abd20c95d..930153055877c54127ec2f6c9eff157b44788b55 100644 (file)
@@ -2155,7 +2155,7 @@ log_header_write (sp_origin_t origin)
   ucontext_t ucp;
   ucp.uc_stack.ss_sp = NULL;
   ucp.uc_stack.ss_size = 0;
-  if (getcontext (&ucp) == 0)
+  if (CALL_UTIL (getcontext) (&ucp) == 0)
     {
       (void) __collector_log_write ("<process stackbase=\"0x%lx\"></process>\n",
                                    (unsigned long) ucp.uc_stack.ss_sp + ucp.uc_stack.ss_size);
@@ -2413,10 +2413,9 @@ __collector_dlog (int tflag, int level, char *format, ...)
   int left = bufsz;
   if ((tflag & SP_DUMP_NOHEADER) == 0)
     {
-      p += CALL_UTIL (snprintf)(p, left, "P%d,L%02u,t%02lu",
-                               (int) getpid (),
-                               (unsigned int) __collector_lwp_self (),
-                               __collector_no_threads ? 0 : __collector_thr_self ());
+      p += CALL_UTIL (snprintf) (p, left, "P%ld,L%02lu,t%02lu",
+        (long) getpid (), (unsigned long) __collector_lwp_self (),
+        (unsigned long) (__collector_no_threads ? 0 : __collector_thr_self ()));
       left = bufsz - (p - buf);
       if (tflag)
        {
index c54568d891c8c40a21832ab9a02d0d8b5af50dd3..b589d3f3d182e65b7ad6e5bdee86f3042ada3a21 100644 (file)
@@ -21,7 +21,6 @@
 #ifndef _COLLECTOR_H
 #define _COLLECTOR_H
 
-#include <ucontext.h>
 #include <signal.h>
 
 #include "gp-defs.h"
 
 #define GETRELTIME()    (__collector_gethrtime() - __collector_start_time)
 
+#if defined(__MUSL_LIBC)
+#define dlvsym(f, nm, v)  dlsym (f, nm)
+#define SIGEV_THREAD_ID   4
+#endif
+
 extern hrtime_t __collector_start_time;
 
 /* ========================================================== */
index f0308605d766f7f358327735f3de0ff57a3dfd95..d3e4c52d6671d45338c5844aea106978e14f016b 100644 (file)
@@ -30,9 +30,7 @@
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
-#include <ucontext.h>
 #include <sys/param.h>
-#include <sys/signal.h>
 #include <sys/syscall.h>
 #include <time.h>
 #include <signal.h>
@@ -575,7 +573,9 @@ collector_timer_create (timer_t * ptimerid)
   sigev.sigev_notify = SIGEV_THREAD_ID | SIGEV_SIGNAL;
   sigev.sigev_signo = SIGPROF;
   sigev.sigev_value.sival_ptr = ptimerid;
+#if !defined(__MUSL_LIBC)
   sigev._sigev_un._tid = __collector_gettid ();
+#endif
   if (CALL_REAL (timer_create)(CLOCK_THREAD_CPUTIME_ID, &sigev, ptimerid) == -1)
     {
       TprintfT (DBG_LT2, "collector_timer_settime() failed! errno=%d\n", errno);
index 6fdaf1bd8ff1cc9370498de72860a111a350c99d..e360068ea3058f27dac8822dfc1fb06935c12e4e 100644 (file)
@@ -29,7 +29,6 @@
 #include <errno.h>
 #include <sys/syscall.h>
 #include <signal.h>
-#include <ucontext.h>
 
 #include "gp-defs.h"
 #define _STRING_H 1  /* XXX MEZ: temporary workaround */
@@ -378,23 +377,23 @@ static void
 init_ucontexts (void)
 {
   /* initialize dummy context for "collector" frames */
-  getcontext (&expr_dummy_uc);
+  CALL_UTIL (getcontext) (&expr_dummy_uc);
   SETFUNCTIONCONTEXT (&expr_dummy_uc, NULL);
 
   /* initialize dummy context for "out-of-range" frames */
-  getcontext (&expr_out_of_range_uc);
+  CALL_UTIL (getcontext) (&expr_out_of_range_uc);
   SETFUNCTIONCONTEXT (&expr_out_of_range_uc, &__collector_hwcs_out_of_range);
 
   /* initialize dummy context for "frozen" frames */
-  getcontext (&expr_frozen_uc);
+  CALL_UTIL (getcontext) (&expr_frozen_uc);
   SETFUNCTIONCONTEXT (&expr_frozen_uc, &__collector_hwcs_frozen);
 
   /* initialize dummy context for non-program-related frames */
-  getcontext (&expr_nopc_uc);
+  CALL_UTIL (getcontext) (&expr_nopc_uc);
   SETFUNCTIONCONTEXT (&expr_nopc_uc, &__collector_not_program_related);
 
   /* initialize dummy context for lost-counts-related frames */
-  getcontext (&expr_lostcounts_uc);
+  CALL_UTIL (getcontext) (&expr_lostcounts_uc);
   SETFUNCTIONCONTEXT (&expr_lostcounts_uc, &__collector_hwc_samples_lost);
 }
 /* initialize the signal handler */
index 6881f02fd307471ba971a357110454662b8ea811..861843c183de9dab3e122852bec125e39221f901 100644 (file)
@@ -243,16 +243,14 @@ __collector_create_handle (char *descp)
     {
       /* allocate our buffers in virtual memory */
       /* later, we will remap buffers individually to the file */
-      uint8_t *memory = (uint8_t*) CALL_UTIL (mmap64)(0,
-                                                     (size_t) (NBUFS * blksz),
-                                                     PROT_READ | PROT_WRITE,
+      uint8_t *memory = (uint8_t*) CALL_UTIL (mmap64_) (0,
+             (size_t) (NBUFS * blksz), PROT_READ | PROT_WRITE,
 #if ARCH(SPARC)
              MAP_SHARED | MAP_ANON,
 #else
              MAP_PRIVATE | MAP_ANON,
 #endif
-             -1,
-                                                     (off64_t) 0);
+             -1, (off64_t) 0);
       if (memory == MAP_FAILED)
        {
          TprintfT (0, "create_handle: can't mmap MAP_ANON (for %s): %s\n", hndl->fname, CALL_UTIL (strerror)(errno));
@@ -516,9 +514,8 @@ allocateChunk (DataHandle *hndl, unsigned ichunk)
       if (__collector_cas_ptr (&hndl->chunks[ichunk], NULL, CHUNK_BUSY) == NULL)
        {
          /* allocate virtual memory */
-         uint8_t *newchunk = (uint8_t*) CALL_UTIL (mmap64)(0,
-                                                           (size_t) (blksz * hndl->nflow),
-                                                           PROT_READ | PROT_WRITE,
+         uint8_t *newchunk = (uint8_t*) CALL_UTIL (mmap64_) (0,
+                 (size_t) (blksz * hndl->nflow), PROT_READ | PROT_WRITE,
 #if ARCH(SPARC)
                  MAP_SHARED | MAP_ANON,
 #else
@@ -611,8 +608,10 @@ remapBlock (DataHandle *hndl, unsigned iflow, unsigned ichunk)
                  char errmsg[MAXPATHLEN + 50];
                  hrtime_t teo = __collector_gethrtime ();
                  double deltato = (double) (teo - tso) / 1000000.;
-                 (void) CALL_UTIL (snprintf) (errmsg, sizeof (errmsg), " t=%d, %s: open-retries-failed = %d, %3.6f ms.; remap",
-                                              __collector_thr_self (), hndl->fname, iter, deltato);
+                 (void) CALL_UTIL (snprintf) (errmsg, sizeof (errmsg),
+                       " t=%lu, %s: open-retries-failed=%d, %3.6f ms.; remap\n",
+                       (unsigned long) __collector_thr_self (), hndl->fname,
+                       iter, deltato);
                  __collector_log_write ("<event kind=\"%s\" id=\"%d\">%s</event>\n",
                                         SP_JCMD_COMMENT, COL_COMMENT_NONE, errmsg);
                  rc = 1;
@@ -623,9 +622,9 @@ remapBlock (DataHandle *hndl, unsigned iflow, unsigned ichunk)
            }
          deleteHandle (hndl);
          TprintfT (0, "remapBlock: can't open file: %s: %s\n", hndl->fname, STR (CALL_UTIL (strerror)(errno)));
-         __collector_log_write ("<event kind=\"%s\" id=\"%d\" ec=\"%d\">t=%llu, %s: remap </event>\n",
+         __collector_log_write ("<event kind=\"%s\" id=\"%d\" ec=\"%d\">t=%lu, %s: remap </event>\n",
                                 SP_JCMD_CERROR, COL_ERROR_FILEOPN, errno,
-                                (unsigned long long) __collector_thr_self (),
+                                (unsigned long) __collector_thr_self (),
                                 hndl->fname);
          rc = 1;
          goto exit;
@@ -640,15 +639,18 @@ remapBlock (DataHandle *hndl, unsigned iflow, unsigned ichunk)
       char errmsg[MAXPATHLEN + 50];
       hrtime_t teo = __collector_gethrtime ();
       double deltato = (double) (teo - tso) / 1000000.;
-      (void) CALL_UTIL (snprintf) (errmsg, sizeof (errmsg), " t=%d, %s: open-retries = %d, %3.6f ms.; remap",
-                                  __collector_thr_self (), hndl->fname, iter, deltato);
+      (void) CALL_UTIL (snprintf) (errmsg, sizeof (errmsg),
+             " t=%d, %s: open-retries=%lu, %3.6f ms.; remap\n",
+             (unsigned long) __collector_thr_self (), hndl->fname,
+             iter, deltato);
       __collector_log_write ("<event kind=\"%s\" id=\"%d\">%s</event>\n",
                             SP_JCMD_COMMENT, COL_COMMENT_NONE, errmsg);
     }
 
   /* Ensure disk space is allocated and the block offset is 0 */
   uint32_t zero = 0;
-  int n = CALL_UTIL (pwrite64)(fd, &zero, sizeof (zero), (off64_t) (offset + blksz - sizeof (zero)));
+  int n = CALL_UTIL (pwrite64_) (fd, &zero, sizeof (zero),
+                               (off64_t) (offset + blksz - sizeof (zero)));
   if (n <= 0)
     {
       deleteHandle (hndl);
@@ -663,13 +665,9 @@ remapBlock (DataHandle *hndl, unsigned iflow, unsigned ichunk)
 
   /* Map block to file */
   uint8_t *bptr = getBlock (hndl, iflow, ichunk);
-  uint8_t *vaddr = (uint8_t *) CALL_UTIL (mmap64)(
-                                                 (void*) bptr,
-                                                 (size_t) blksz,
-                                                 PROT_READ | PROT_WRITE,
-                                                 MAP_SHARED | MAP_FIXED,
-                                                 fd,
-                                                 offset);
+  uint8_t *vaddr = (uint8_t *) CALL_UTIL (mmap64_) ((void*) bptr,
+         (size_t) blksz, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED,
+         fd, offset);
 
   if (vaddr != bptr)
     {
@@ -784,8 +782,9 @@ __collector_write_packet (DataHandle *hndl, CM_Packet *pckt)
       TprintfT (0, "collector_write_packet: packet too long: %d (max %ld)\n", recsz, blksz);
       return 1;
     }
-  unsigned tid = (__collector_no_threads ? __collector_lwp_self () : __collector_thr_self ());
-  unsigned iflow = tid % hndl->nflow;
+  collector_thread_t tid = __collector_no_threads ? __collector_lwp_self ()
+                                                 : __collector_thr_self ();
+  unsigned iflow = (unsigned) (((unsigned long) tid) % hndl->nflow);
 
   /* Acquire block */
   uint32_t *sptr = &hndl->blkstate[iflow * NCHUNKS];
@@ -925,7 +924,8 @@ mapBuffer (char *fname, Buffer *buf, off64_t foff)
 
   /* ensure disk space is allocated */
   char nl = '\n';
-  int n = CALL_UTIL (pwrite64)(fd, &nl, sizeof (nl), (off64_t) (foff + blksz - sizeof (nl)));
+  int n = CALL_UTIL (pwrite64_) (fd, &nl, sizeof (nl),
+                                (off64_t) (foff + blksz - sizeof (nl)));
   if (n <= 0)
     {
       TprintfT (0, "mapBuffer ERROR: can't pwrite file %s at 0x%llx\n", fname,
@@ -937,7 +937,7 @@ mapBuffer (char *fname, Buffer *buf, off64_t foff)
       goto exit;
     }
   /* mmap buf->vaddr to fname at foff */
-  uint8_t *vaddr = CALL_UTIL (mmap64)(buf->vaddr, (size_t) blksz,
+  uint8_t *vaddr = CALL_UTIL (mmap64_) (buf->vaddr, (size_t) blksz,
          PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, fd, foff);
   if (vaddr != buf->vaddr)
     {
index 9b47724bab915b4de50a7b75b6e133569258b81e..d94daefa89bd2bf0c65e988a2077c3ffffd3fbf7 100644 (file)
@@ -34,7 +34,7 @@
 #include <fcntl.h>
 
 #include "gp-defs.h"
-#include "collector_module.h"
+#include "collector.h"
 #include "gp-experiment.h"
 #include "data_pckts.h"
 #include "tsd.h"
@@ -999,6 +999,22 @@ init_io_intf ()
   return rc;
 }
 
+static void
+write_io_packet (int fd, ssize_t ret, hrtime_t reqt, int iotype)
+{
+  IOTrace_packet iopkt;
+  collector_memset (&iopkt, 0, sizeof ( IOTrace_packet));
+  iopkt.comm.tsize = sizeof (IOTrace_packet);
+  iopkt.comm.tstamp = gethrtime ();
+  iopkt.requested = reqt;
+  iopkt.iotype = iotype;
+  iopkt.fd = fd;
+  iopkt.nbyte = ret;
+  iopkt.comm.frinfo = collector_interface->getFrameInfo (io_hndl,
+                       iopkt.comm.tstamp, FRINFO_FROM_STACK, &iopkt);
+  collector_interface->writeDataRecord (io_hndl, (Common_packet*) & iopkt);
+}
+
 /*------------------------------------------------------------- open */
 int
 open (const char *path, int oflag, ...)
@@ -2412,162 +2428,147 @@ pread (int fildes, void *buf, size_t nbyte, off_t offset)
 }
 
 /*------------------------------------------------------------- pwrite */
-#if ARCH(Intel) && WSIZE(32)
+
+#if !defined(__MUSL_LIBC) && ARCH(Intel) && WSIZE(32)
 // map interposed symbol versions
-static int
-__collector_pwrite_symver (int(real_pwrite) (), int fildes, const void *buf, size_t nbyte, off_t offset);
 
 SYMVER_ATTRIBUTE (__collector_pwrite_2_2, pwrite@@GLIBC_2.2)
 int
 __collector_pwrite_2_2 (int fildes, const void *buf, size_t nbyte, off_t offset)
 {
-  TprintfT (DBG_LTT, "iotrace: __collector_pwrite_2_2@%p(fildes=%d, buf=%p, nbyte=%lld, offset=%lld)\n",
-           CALL_REAL (pwrite_2_2), fildes, buf, (long long) nbyte, (long long) offset);
-  if (NULL_PTR (pwrite))
+  int *guard;
+  if (NULL_PTR (pwrite_2_2))
     init_io_intf ();
-  return __collector_pwrite_symver (CALL_REAL (pwrite_2_2), fildes, buf, nbyte, offset);
+  if (CHCK_REENTRANCE (guard))
+    return CALL_REAL (pwrite_2_2)(fildes, buf, nbyte, offset);
+  PUSH_REENTRANCE (guard);
+  hrtime_t reqt = gethrtime ();
+  ssize_t ret = CALL_REAL (pwrite_2_2)(fildes, buf, nbyte, offset);
+  if (RECHCK_REENTRANCE (guard))
+    {
+      POP_REENTRANCE (guard);
+      return ret;
+    }
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
+  POP_REENTRANCE (guard);
+  return ret;
 }
 
 SYMVER_ATTRIBUTE (__collector_pwrite_2_1, pwrite@GLIBC_2.1)
 int
 __collector_pwrite_2_1 (int fildes, const void *buf, size_t nbyte, off_t offset)
 {
-  TprintfT (DBG_LTT, "iotrace: __collector_pwrite_2_1@%p(fildes=%d, buf=%p, nbyte=%lld, offset=%lld)\n",
-           CALL_REAL (pwrite_2_1), fildes, buf, (long long) nbyte, (long long) offset);
-  if (NULL_PTR (pwrite))
+  int *guard;
+  if (NULL_PTR (pwrite_2_1))
     init_io_intf ();
-  return __collector_pwrite_symver (CALL_REAL (pwrite_2_1), fildes, buf, nbyte, offset);
+  if (CHCK_REENTRANCE (guard))
+    return CALL_REAL (pwrite_2_1)(fildes, buf, nbyte, offset);
+  PUSH_REENTRANCE (guard);
+  hrtime_t reqt = gethrtime ();
+  ssize_t ret = CALL_REAL (pwrite_2_1)(fildes, buf, nbyte, offset);
+  if (RECHCK_REENTRANCE (guard))
+    {
+      POP_REENTRANCE (guard);
+      return ret;
+    }
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
+  POP_REENTRANCE (guard);
+  return ret;
 }
-
-static int
-__collector_pwrite_symver (int(real_pwrite) (), int fildes, const void *buf, size_t nbyte, off_t offset)
-{
-#else /* ^ARCH(Intel) && WSIZE(32) */
+#endif /* !defined(__MUSL_LIBC) && ARCH(Intel) && WSIZE(32) */
 
 ssize_t
 pwrite (int fildes, const void *buf, size_t nbyte, off_t offset)
 {
-#endif /* ^ARCH(Intel) && WSIZE(32) */
   int *guard;
-  ssize_t ret;
-  IOTrace_packet iopkt;
   if (NULL_PTR (pwrite))
     init_io_intf ();
   if (CHCK_REENTRANCE (guard))
-    {
-#if ARCH(Intel) && WSIZE(32)
-      return (real_pwrite) (fildes, buf, nbyte, offset);
-#else
-      return CALL_REAL (pwrite)(fildes, buf, nbyte, offset);
-#endif
-    }
+    return CALL_REAL (pwrite)(fildes, buf, nbyte, offset);
   PUSH_REENTRANCE (guard);
   hrtime_t reqt = gethrtime ();
-#if ARCH(Intel) && WSIZE(32)
-  ret = (real_pwrite) (fildes, buf, nbyte, offset);
-#else
-  ret = CALL_REAL (pwrite)(fildes, buf, nbyte, offset);
-#endif
+  ssize_t ret = CALL_REAL (pwrite)(fildes, buf, nbyte, offset);
   if (RECHCK_REENTRANCE (guard))
     {
       POP_REENTRANCE (guard);
       return ret;
     }
-  hrtime_t grnt = gethrtime ();
-  collector_memset (&iopkt, 0, sizeof ( IOTrace_packet));
-  iopkt.comm.tsize = sizeof ( IOTrace_packet);
-  iopkt.comm.tstamp = grnt;
-  iopkt.requested = reqt;
-  if (ret >= 0)
-    iopkt.iotype = WRITE_TRACE;
-  else
-    iopkt.iotype = WRITE_TRACE_ERROR;
-  iopkt.fd = fildes;
-  iopkt.nbyte = ret;
-  iopkt.comm.frinfo = collector_interface->getFrameInfo (io_hndl, iopkt.comm.tstamp, FRINFO_FROM_STACK, &iopkt);
-  collector_interface->writeDataRecord (io_hndl, (Common_packet*) & iopkt);
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
   POP_REENTRANCE (guard);
   return ret;
 }
 
 /*------------------------------------------------------------- pwrite64 */
+#if !defined(__MUSL_LIBC)
 #if ARCH(Intel) && WSIZE(32)
 // map interposed symbol versions
-static int
-__collector_pwrite64_symver (int(real_pwrite64) (), int fildes, const void *buf, size_t nbyte, off64_t offset);
 
 SYMVER_ATTRIBUTE (__collector_pwrite64_2_2, pwrite64@@GLIBC_2.2)
-int
+ssize_t
 __collector_pwrite64_2_2 (int fildes, const void *buf, size_t nbyte, off64_t offset)
 {
-  TprintfT (DBG_LTT, "iotrace: __collector_pwrite64_2_2@%p(fildes=%d, buf=%p, nbyte=%lld, offset=%lld)\n",
-           CALL_REAL (pwrite64_2_2), fildes, buf, (long long) nbyte, (long long) offset);
-  if (NULL_PTR (pwrite64))
+  int *guard;
+  if (NULL_PTR (pwrite64_2_2))
     init_io_intf ();
-  return __collector_pwrite64_symver (CALL_REAL (pwrite64_2_2), fildes, buf, nbyte, offset);
+  if (CHCK_REENTRANCE (guard))
+    return CALL_REAL (pwrite64_2_2)(fildes, buf, nbyte, offset);
+  PUSH_REENTRANCE (guard);
+  hrtime_t reqt = gethrtime ();
+  ssize_t ret = CALL_REAL (pwrite64_2_2)(fildes, buf, nbyte, offset);
+  if (RECHCK_REENTRANCE (guard))
+    {
+      POP_REENTRANCE (guard);
+      return ret;
+    }
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
+  POP_REENTRANCE (guard);
+  return ret;
 }
 
 SYMVER_ATTRIBUTE (__collector_pwrite64_2_1, pwrite64@GLIBC_2.1)
 int
 __collector_pwrite64_2_1 (int fildes, const void *buf, size_t nbyte, off64_t offset)
 {
-  TprintfT (DBG_LTT, "iotrace: __collector_pwrite64_2_1@%p(fildes=%d, buf=%p, nbyte=%lld, offset=%lld)\n",
-           CALL_REAL (pwrite64_2_1), fildes, buf, (long long) nbyte, (long long) offset);
-  if (NULL_PTR (pwrite64))
+  int *guard;
+  if (NULL_PTR (pwrite64_2_1))
     init_io_intf ();
-  return __collector_pwrite64_symver (CALL_REAL (pwrite64_2_1), fildes, buf, nbyte, offset);
+  if (CHCK_REENTRANCE (guard))
+    return CALL_REAL (pwrite64_2_1)(fildes, buf, nbyte, offset);
+  PUSH_REENTRANCE (guard);
+  hrtime_t reqt = gethrtime ();
+  ssize_t ret = CALL_REAL (pwrite64_2_1)(fildes, buf, nbyte, offset);
+  if (RECHCK_REENTRANCE (guard))
+    {
+      POP_REENTRANCE (guard);
+      return ret;
+    }
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
+  POP_REENTRANCE (guard);
+  return ret;
 }
-
-static int
-__collector_pwrite64_symver (int(real_pwrite64) (), int fildes, const void *buf, size_t nbyte, off64_t offset)
-{
-#else /* ^ARCH(Intel) && WSIZE(32) */
+#endif
 
 ssize_t
 pwrite64 (int fildes, const void *buf, size_t nbyte, off64_t offset)
 {
-#endif /* ^ARCH(Intel) && WSIZE(32) */
   int *guard;
-  ssize_t ret;
-  IOTrace_packet iopkt;
   if (NULL_PTR (pwrite64))
     init_io_intf ();
   if (CHCK_REENTRANCE (guard))
-    {
-#if ARCH(Intel) && WSIZE(32)
-      return (real_pwrite64) (fildes, buf, nbyte, offset);
-#else
-      return CALL_REAL (pwrite64)(fildes, buf, nbyte, offset);
-#endif
-    }
+    return CALL_REAL (pwrite64)(fildes, buf, nbyte, offset);
   PUSH_REENTRANCE (guard);
   hrtime_t reqt = gethrtime ();
-#if ARCH(Intel) && WSIZE(32)
-  ret = (real_pwrite64) (fildes, buf, nbyte, offset);
-#else
-  ret = CALL_REAL (pwrite64)(fildes, buf, nbyte, offset);
-#endif
+  ssize_t ret = CALL_REAL (pwrite64)(fildes, buf, nbyte, offset);
   if (RECHCK_REENTRANCE (guard))
     {
       POP_REENTRANCE (guard);
       return ret;
     }
-  hrtime_t grnt = gethrtime ();
-  collector_memset (&iopkt, 0, sizeof ( IOTrace_packet));
-  iopkt.comm.tsize = sizeof ( IOTrace_packet);
-  iopkt.comm.tstamp = grnt;
-  iopkt.requested = reqt;
-  if (ret >= 0)
-    iopkt.iotype = WRITE_TRACE;
-  else
-    iopkt.iotype = WRITE_TRACE_ERROR;
-  iopkt.fd = fildes;
-  iopkt.nbyte = ret;
-  iopkt.comm.frinfo = collector_interface->getFrameInfo (io_hndl, iopkt.comm.tstamp, FRINFO_FROM_STACK, &iopkt);
-  collector_interface->writeDataRecord (io_hndl, (Common_packet*) & iopkt);
+  write_io_packet (fildes, ret, reqt, ret >= 0 ? WRITE_TRACE : WRITE_TRACE_ERROR);
   POP_REENTRANCE (guard);
   return ret;
 }
+#endif
 
 /*------------------------------------------------------------- fgets */
 char*
index 9daaa5a267edc3b87017641af7f941ca09cce391..5211406672610822b4d01637383195a5b602aad0 100644 (file)
@@ -285,12 +285,6 @@ __collector_jprofile_start_attach (void)
            {
              jthread thread;
              (*jvmti)->GetCurrentThread (jvmti, &thread);
-#ifdef DEBUG
-             collector_thread_t tid;
-             tid = __collector_thr_self ();
-             TprintfT (0, "jprofile attach: AttachCurrentThread: thread: %lu jni_env=%p jthread=%p\n",
-                       (unsigned long) tid, jni_env, thread);
-#endif /* DEBUG */
              jvmti_VMInit (jvmti, jni_env, thread);
              (*jvmti)->GenerateEvents (jvmti, JVMTI_EVENT_COMPILED_METHOD_LOAD);
              (*jvmti)->GenerateEvents (jvmti, JVMTI_EVENT_DYNAMIC_CODE_GENERATED);
index c709b3c5ed195efa7393e9c35b75d4bbf8d9b8ae..d682aa0ab29cc161ba3cc3832ccfcf0263a60136 100644 (file)
@@ -1116,9 +1116,9 @@ __collector_util_init ()
   /*    internal calls for mapping in libcollector call mmap64 */
   ptr = dlsym (libc, "mmap64");
   if (ptr)
-    __collector_util_funcs.mmap64 = (void*(*)(void *, size_t, int, int, int, off_t))ptr;
+    __collector_util_funcs.mmap64_ = (void*(*)(void *, size_t, int, int, int, off_t))ptr;
   else
-    __collector_util_funcs.mmap64 = __collector_util_funcs.mmap;
+    __collector_util_funcs.mmap64_ = __collector_util_funcs.mmap;
 
   ptr = dlsym (libc, "munmap");
   if (ptr)
@@ -1214,16 +1214,16 @@ __collector_util_init ()
 #if ARCH(Intel) && WSIZE(32)
   ptr = dlvsym (libc, "pwrite64", "GLIBC_2.2"); // it is in /lib/libpthread.so.0
   if (ptr)
-    __collector_util_funcs.pwrite64 = (ssize_t (*)())ptr;
+    __collector_util_funcs.pwrite64_ = (ssize_t (*)())ptr;
   else
     {
       Tprintf (DBG_LT0, "libcol_util: WARNING: dlvsym for %s@%s failed. Using dlsym() instead.", "pwrite64", "GLIBC_2.2");
 #endif /* ARCH(Intel) && WSIZE(32) */
       ptr = dlsym (libc, "pwrite64");
       if (ptr)
-       __collector_util_funcs.pwrite64 = (ssize_t (*)())ptr;
+       __collector_util_funcs.pwrite64_ = (ssize_t (*)())ptr;
       else
-       __collector_util_funcs.pwrite64 = __collector_util_funcs.pwrite;
+       __collector_util_funcs.pwrite64_ = __collector_util_funcs.pwrite;
 #if ARCH(Intel) && WSIZE(32)
     }
 #endif /* ARCH(Intel) && WSIZE(32) */
@@ -1319,6 +1319,15 @@ __collector_util_init ()
   __collector_util_funcs.getcpuid = __collector_getcpuid;
   __collector_util_funcs.memset = collector_memset;
 
+  ptr = dlsym (libc, "getcontext");
+  if (ptr)
+    __collector_util_funcs.getcontext = (int(*)())ptr;
+  else
+    {
+      CALL_UTIL (fprintf)(stderr, "collector_util_init COL_ERROR_UTIL_INIT getcontext: %s\n", dlerror ());
+      err = COL_ERROR_UTIL_INIT;
+    }
+
   ptr = dlsym (libc, "malloc");
   if (ptr)
     __collector_util_funcs.malloc = (void *(*)(size_t))ptr;
index e13a02ea6d772cb02313b3f3f38d246af6bcb2e6..c32c76f091b2ed80a210bb18a65757d915aa4161 100644 (file)
@@ -59,12 +59,11 @@ extern int __collector_xml_snprintf (char *s, size_t n, const char *format, ...)
 extern int __collector_xml_vsnprintf (char *s, size_t n, const char *format, va_list args);
 
 /* -------  collector_thread ----------------- */
-pid_t __collector_gettid ();
+extern pid_t __collector_gettid ();
 extern void __collector_ext_gettid_tsd_create_key ();
-#define collector_thread_t pthread_t            // not using pid_t, since tid is defined as pthread_t in package structures, and other codes assume this type
-#define statvfs_t  struct statvfs
-#define __collector_lwp_self() (collector_thread_t)__collector_gettid() // not using pthread_self()
-#define __collector_thr_self() (collector_thread_t)__collector_gettid() // not using pthread_self()
+typedef pthread_t collector_thread_t;
+#define __collector_lwp_self() ((collector_thread_t) ((unsigned long) __collector_gettid()))
+#define __collector_thr_self() ((collector_thread_t) ((unsigned long) __collector_gettid()))
 
 /* -------  collector_mutex ----------------- */
 /*
index 978c5503e2e80ce30fead797ba742226cefdc4ed..a209308c767d69d04439ed9b83fa7222511f6500 100644 (file)
@@ -29,6 +29,8 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/mman.h>
+#include <limits.h>
+
 
 #include "descendants.h"
 
@@ -360,7 +362,7 @@ check_fd_dynamic (int fd)
   size_t sz = (size_t) 8192; /* one page should suffice */
   if (sz > off)
     sz = off;
-  char *p = CALL_UTIL (mmap64)((char *) 0, sz, PROT_READ, MAP_PRIVATE, fd, (off64_t) 0);
+  char *p = CALL_UTIL (mmap64_)((char *) 0, sz, PROT_READ, MAP_PRIVATE, fd, (off64_t) 0);
   if (p == MAP_FAILED)
     {
       TprintfT (DBG_LT0, "check_fd_dynamic(): ERROR/WARNING: mmap failed for `%d'\n", fd);
index 5ada421f3f41ed22a64e91b248c20c70fbd66a8f..aa13ea778521434bd5d533100c01c350867b7aab 100644 (file)
@@ -131,7 +131,7 @@ alloc_chunk (unsigned sz, int log)
   if (log == 1)
     Tprintf (DBG_LT2, "alloc_chunk mapping %u, rounded up from %u\n", (unsigned int) chunksz, sz);
   /* mmap64 is only in 32-bits; this call goes to mmap in 64-bits */
-  ptr = (char*) CALL_UTIL (mmap64)(0, chunksz, PROT_READ | PROT_WRITE,
+  ptr = (char*) CALL_UTIL (mmap64_)(0, chunksz, PROT_READ | PROT_WRITE,
                                   MAP_PRIVATE | MAP_ANON, (int) -1, (off64_t) 0);
   if (ptr == MAP_FAILED)
     {
index ba5c9129f4c3c1a72e7475173cb22f8d9bd7e1fe..bd299e6f64f15dfdebf02a3d94949efde473c39b 100644 (file)
@@ -441,13 +441,9 @@ checksum_mapname (MapInfo* map)
 }
 
 
-#if (ARCH(Intel) && WSIZE(32)) || ARCH(SPARC)
-static void*
-dlopen_searchpath_symver (void*(real_dlopen) (), void* caller_addr, const char* basename, int mode)
-#else
 static void*
-dlopen_searchpath (void* caller_addr, const char* basename, int mode)
-#endif
+dlopen_searchpath (void*(real_dlopen) (const char *, int),
+               void *caller_addr, const char *basename, int mode)
 {
   TprintfT (DBG_LT2, "dlopen_searchpath(%p, %s, %d)\n", caller_addr, basename, mode);
   Dl_info dl_info;
@@ -458,7 +454,8 @@ dlopen_searchpath (void* caller_addr, const char* basename, int mode)
     }
   TprintfT (DBG_LT2, "dladdr(%p): %p fname=%s\n",
            caller_addr, dl_info.dli_fbase, dl_info.dli_fname);
-  int noload = RTLD_BINDING_MASK | RTLD_NOLOAD; //XXXX why RTLD_BINDING_MASK?
+  int noload = RTLD_LAZY | RTLD_NOW | RTLD_NOLOAD;
+  void *caller_hndl = NULL;
 #define WORKAROUND_RTLD_BUG 1
 #ifdef WORKAROUND_RTLD_BUG
   // A dynamic linker dlopen bug can result in corruption/closure of open streams
@@ -470,29 +467,20 @@ dlopen_searchpath (void* caller_addr, const char* basename, int mode)
 #endif
   const char* tmp_path =
          (dl_info.dli_fbase == (void*) MAINBASE) ? NULL : dl_info.dli_fname;
-  void* caller_hndl = NULL;
-#if ((ARCH(Intel) && WSIZE(32)) || ARCH(SPARC))
-  caller_hndl = (real_dlopen) (tmp_path, noload);
-#else
-  caller_hndl = CALL_REAL (dlopen)(tmp_path, noload);
-#endif
+  caller_hndl = real_dlopen (tmp_path, noload);
 
 #else //XXXX workaround should be removed once linker patches are all available
 
-  void* caller_hndl = NULL;
-#if (ARCH(Intel) && WSIZE(32) || ARCH(SPARC)
-  caller_hndl = (real_dlopen) (dl_info.dli_fname, noload);
-#else
-  caller_hndl = CALL_REAL (dlopen)(dl_info.dli_fname, noload);
-#endif
+  caller_hndl = real_dlopen (dl_info.dli_fname, noload);
 
 #endif //XXXX workaround should be removed once linker patches are all available
 
   if (!caller_hndl)
     {
       TprintfT (0, "ERROR: dlopen(%s,NOLOAD): %s\n", dl_info.dli_fname, dlerror ());
-      return 0;
+      return NULL;
     }
+#if !defined(__MUSL_LIBC)
   Dl_serinfo _info, *info = &_info;
   Dl_serpath *path;
 
@@ -546,7 +534,7 @@ dlopen_searchpath (void* caller_addr, const char* basename, int mode)
       I have already confirmed with our user that the workaround
       is working with his real application. Additionally,
       the dlopen_searchpath() function is called only by the
-      libcorrector init() function when the experiment is started.
+      libcollector init() function when the experiment is started.
       Therefore, allocating some extra bytes on the stack which
       is local to this routine is harmless.
    */
@@ -575,7 +563,8 @@ dlopen_searchpath (void* caller_addr, const char* basename, int mode)
       if (ret)
        return ret; // success!
     }
-  return 0;
+#endif
+  return NULL;
 }
 
 static void
@@ -1550,40 +1539,9 @@ munmap (void *start, size_t length)
 
 
 /*------------------------------------------------------------- dlopen */
-// map interposed symbol versions
-#if (ARCH(Intel) && WSIZE(32)) || ARCH(SPARC)
-
-static void *
-__collector_dlopen_symver (void*(real_dlopen) (), void *caller, const char *pathname, int mode);
-
-SYMVER_ATTRIBUTE (__collector_dlopen_2_1, dlopen@@GLIBC_2.1)
-void *
-__collector_dlopen_2_1 (const char *pathname, int mode)
-{
-  if (NULL_PTR (dlopen))
-    init_mmap_intf ();
-  void *caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
-  return __collector_dlopen_symver (CALL_REAL (dlopen_2_1), caller, pathname, mode);
-}
-
-SYMVER_ATTRIBUTE (__collector_dlopen_2_0, dlopen@GLIBC_2.0)
-void *
-__collector_dlopen_2_0 (const char *pathname, int mode)
-{
-  if (NULL_PTR (dlopen))
-    init_mmap_intf ();
-  void* caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
-  return __collector_dlopen_symver (CALL_REAL (dlopen_2_0), caller, pathname, mode);
-}
-#endif
-
-#if (ARCH(Intel) && WSIZE(32)) || ARCH(SPARC)
 static void *
-__collector_dlopen_symver (void*(real_dlopen) (), void *caller, const char *pathname, int mode)
-#else
-void *
-dlopen (const char *pathname, int mode)
-#endif
+__collector_dlopen_symver (void*(real_dlopen) (const char *, int),
+                          void *caller, const char *pathname, int mode)
 {
   const char * real_pathname = pathname;
   char new_pathname[MAXPATHLEN];
@@ -1595,10 +1553,6 @@ dlopen (const char *pathname, int mode)
     origin_offset = 10;
   if (origin_offset)
     {
-#if ! ((ARCH(Intel) && WSIZE(32)) || ARCH(SPARC))
-      // 'caller' is not passed as an argument
-      void * caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
-#endif
       Dl_info dl_info;
       if (caller && dladdr (caller, &dl_info) != 0)
        {
@@ -1619,37 +1573,18 @@ dlopen (const char *pathname, int mode)
     init_mmap_intf ();
   TprintfT (DBG_LT2, "libcollector.dlopen(%s,%d) interposing\n",
            pathname ? pathname : "", mode);
-  voidret = NULL;
+  void *ret = NULL;
 
   // set guard for duration of handling dlopen, since want to ensure
   // new mappings are resolved after the actual dlopen has occurred
   PUSH_REENTRANCE;
   hrtime_t hrt = GETRELTIME ();
 
-  if (real_pathname && !__collector_strchr (real_pathname, '/'))
-    { // got an unqualified name
-      // get caller and use its searchpath
-#if ! ((ARCH(Intel) && WSIZE(32)) || ARCH(SPARC))
-      void* caller = __builtin_return_address (0); // must be called inside dlopen
-#endif
-      if (caller)
-       {
-#if (ARCH(Intel) && WSIZE(32)) || ARCH(SPARC)
-         ret = dlopen_searchpath_symver (real_dlopen, caller, real_pathname, mode);
-#else
-         ret = dlopen_searchpath (caller, real_pathname, mode);
-#endif
-       }
-    }
+  if (caller && real_pathname && !__collector_strchr (real_pathname, '/'))
+    ret = dlopen_searchpath (real_dlopen, caller, real_pathname, mode);
 
   if (!ret)
-    {
-#if (ARCH(Intel) && WSIZE(32)) || ARCH(SPARC)
-      ret = (real_dlopen) (real_pathname, mode);
-#else
-      ret = CALL_REAL (dlopen)(real_pathname, mode);
-#endif
-    }
+    ret = real_dlopen (real_pathname, mode);
   TprintfT (DBG_LT2, "libcollector -- dlopen(%s) returning %p\n", pathname, ret);
 
   /* Don't call update if dlopen failed: preserve dlerror() */
@@ -1660,6 +1595,39 @@ dlopen (const char *pathname, int mode)
   return ret;
 }
 
+void *
+dlopen (const char *pathname, int mode)
+{
+  if (NULL_PTR (dlopen))
+    init_mmap_intf ();
+  void* caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
+  return __collector_dlopen_symver (CALL_REAL (dlopen), caller, pathname, mode);
+}
+
+#if !defined(__MUSL_LIBC) && ((ARCH(Intel) && WSIZE(32)) || ARCH(SPARC))
+// map interposed symbol versions
+
+SYMVER_ATTRIBUTE (__collector_dlopen_2_1, dlopen@@GLIBC_2.1)
+void *
+__collector_dlopen_2_1 (const char *pathname, int mode)
+{
+  if (NULL_PTR (dlopen_2_1))
+    init_mmap_intf ();
+  void *caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
+  return __collector_dlopen_symver (CALL_REAL (dlopen_2_1), caller, pathname, mode);
+}
+
+SYMVER_ATTRIBUTE (__collector_dlopen_2_0, dlopen@GLIBC_2.0)
+void *
+__collector_dlopen_2_0 (const char *pathname, int mode)
+{
+  if (NULL_PTR (dlopen_2_0))
+    init_mmap_intf ();
+  void* caller = __builtin_return_address (0); // must be called inside dlopen first layer interpostion
+  return __collector_dlopen_symver (CALL_REAL (dlopen_2_0), caller, pathname, mode);
+}
+#endif
+
 /*------------------------------------------------------------- dlclose */
 int
 dlclose (void *handle)
index 996d3f091981b049ffe2ada2db931e528823d954..ee9fb7d3b0c23444686d75f84ee976447b976cfc 100644 (file)
@@ -268,7 +268,7 @@ __collector_ext_profile_handler (siginfo_t *info, ucontext_t *context)
       /* assume this case is rare, and accept overhead of creating dummy_uc */
       TprintfT (0, "collector_profile_handler: ERROR: got NULL context!\n");
       context = &uctxmem;
-      getcontext (context);     /* initialize dummy context */
+      CALL_UTIL (getcontext) (context);     /* initialize dummy context */
       SETFUNCTIONCONTEXT (context, &__collector_lost_profile_context);
     }
   ClockPacket pckt;
index 492ef9993f70a0797f1cbaf2c8481d3dfc476e5a..d48aeaa2d2d42262328734bd5f842407acf611f1 100644 (file)
 #include <pthread.h>
 
 #include "gp-defs.h"
-#include "collector_module.h"
+#include "collector.h"
 #include "gp-experiment.h"
 #include "data_pckts.h"
-#include "i18n.h"
 #include "tsd.h"
 #include "cc_libcollector.h"
 
index f8e11823c81e4d5d7f643ff387cd04b0a0ad6c5a..009b5ab84561668e77d56b089cd9934c6ab4a255 100644 (file)
@@ -232,7 +232,7 @@ memory_error_func (int status ATTRIBUTE_UNUSED, bfd_vma addr ATTRIBUTE_UNUSED,
 
 #elif ARCH(Aarch64)
 #define FILL_CONTEXT(context) \
-    { getcontext(context);  \
+    { CALL_UTIL (getcontext) (context);  \
       context->uc_mcontext.sp = (__u64) __builtin_frame_address(0); \
     }
 
index c797724af07256073b8336ac1a0a72af26a62b2c..98aae9714ac3b1e00d556e38bd0f3ce3a2a2bcc8 100644 (file)
@@ -6466,7 +6466,7 @@ int
 Experiment::copy_file_to_archive (const char *name, const char *aname, int hide_msg)
 {
   errno = 0;
-  int fd_w = open64 (aname, O_WRONLY | O_CREAT | O_EXCL, 0644);
+  int fd_w = ::open64 (aname, O_WRONLY | O_CREAT | O_EXCL, 0644);
   if (fd_w == -1)
     {
       if (errno == EEXIST)
@@ -6484,7 +6484,7 @@ Experiment::copy_file_to_archive (const char *name, const char *aname, int hide_
       return 1;
     }
 
-  int fd_r = open64 (name, O_RDONLY);
+  int fd_r = ::open64 (name, O_RDONLY);
   if (fd_r == -1)
     {
       fprintf (stderr, GTXT ("er_archive: unable to open `%s': %s\n"),
index d415d591e1ebb328783c259c8968f9c89b7f57a0..039325309566f2a6455cbeaea1d1a94df8c71cc0 100644 (file)
@@ -2209,14 +2209,14 @@ print_anno_file (char *name, const char *sel, const char *srcFile,
            {
              fitem = func->getDefSrc ();
              found = (func->line_first > 0)
-                     && strcmp (basename (srcFile),
-                                basename (fitem->get_name ())) == 0;
+                     && strcmp (get_basename (srcFile),
+                                get_basename (fitem->get_name ())) == 0;
            }
          else
            {
              Vec_loop (SourceFile*, sources, index, fitem)
              {
-               if (strcmp (basename (srcFile), basename (fitem->get_name ())) == 0)
+               if (strcmp (get_basename (srcFile), get_basename (fitem->get_name ())) == 0)
                  {
                    found = true;
                    break;
index f608dab58314676bf3b69eb3ea2e06a2b198ca8b..6cf53d5b27fc1f735894e3c0d542622f2e8488b6 100644 (file)
@@ -25,6 +25,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <ucontext.h>
 #include <dirent.h>
 
 #include "gp-defs.h"
@@ -55,6 +56,7 @@ typedef struct CollectorUtilFuncs
   int (*fprintf)(FILE *stream, const char *format, ...);
   void (*free)(void *ptr);
   int (*fstat)(int fd, struct stat *buf);
+  int (*getcontext)(ucontext_t *ucp);
   int (*getcpuid)();
   char *(*getcwd)(char *buf, size_t size);
   char *(*getenv)(const char *name);
@@ -66,7 +68,7 @@ typedef struct CollectorUtilFuncs
   int (*mkdir)();
   time_t (*mktime)(struct tm *timeptr);
   void *(*mmap)(void *, size_t, int, int, int, off_t);
-  void *(*mmap64)();
+  void *(*mmap64_)();
   int (*munmap)();
   int (*open)(const char *, int, ...);
   int (*open_bare)(const char *, int, ...);
@@ -75,7 +77,7 @@ typedef struct CollectorUtilFuncs
   FILE *(*popen)(const char *command, const char *mode);
   int (*putenv)(char *string);
   ssize_t (*pwrite)();
-  ssize_t (*pwrite64)();
+  ssize_t (*pwrite64_)();
   ssize_t (*read)();
   int (*setenv)(const char *name, const char *value, int overwrite);
   int (*sigfillset)(sigset_t *set);