mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:54:41 +08:00
gprofng: fix build issues on musl
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.
This commit is contained in:
parent
8422cbe455
commit
fe39ffdc20
@ -118,3 +118,6 @@
|
||||
|
||||
/* 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
|
||||
|
@ -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
|
||||
|
30
gprofng/configure
vendored
30
gprofng/configure
vendored
@ -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; }
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -21,7 +21,6 @@
|
||||
#ifndef _COLLECTOR_H
|
||||
#define _COLLECTOR_H
|
||||
|
||||
#include <ucontext.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "gp-defs.h"
|
||||
@ -31,6 +30,11 @@
|
||||
|
||||
#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;
|
||||
|
||||
/* ========================================================== */
|
||||
|
@ -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);
|
||||
|
@ -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 */
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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))
|
||||
init_io_intf ();
|
||||
return __collector_pwrite_symver (CALL_REAL (pwrite_2_1), fildes, buf, nbyte, offset);
|
||||
}
|
||||
|
||||
static int
|
||||
__collector_pwrite_symver (int(real_pwrite) (), int fildes, const void *buf, size_t nbyte, off_t offset)
|
||||
{
|
||||
#else /* ^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))
|
||||
if (NULL_PTR (pwrite_2_1))
|
||||
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_2_1)(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_2_1)(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 /* !defined(__MUSL_LIBC) && ARCH(Intel) && WSIZE(32) */
|
||||
|
||||
ssize_t
|
||||
pwrite (int fildes, const void *buf, size_t nbyte, off_t offset)
|
||||
{
|
||||
int *guard;
|
||||
if (NULL_PTR (pwrite))
|
||||
init_io_intf ();
|
||||
if (CHCK_REENTRANCE (guard))
|
||||
return CALL_REAL (pwrite)(fildes, buf, nbyte, offset);
|
||||
PUSH_REENTRANCE (guard);
|
||||
hrtime_t reqt = gethrtime ();
|
||||
ssize_t ret = CALL_REAL (pwrite)(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;
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------- 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))
|
||||
init_io_intf ();
|
||||
return __collector_pwrite64_symver (CALL_REAL (pwrite64_2_1), fildes, buf, nbyte, offset);
|
||||
}
|
||||
|
||||
static int
|
||||
__collector_pwrite64_symver (int(real_pwrite64) (), int fildes, const void *buf, size_t nbyte, off64_t offset)
|
||||
{
|
||||
#else /* ^ARCH(Intel) && WSIZE(32) */
|
||||
|
||||
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))
|
||||
if (NULL_PTR (pwrite64_2_1))
|
||||
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_2_1)(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_2_1)(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
|
||||
|
||||
ssize_t
|
||||
pwrite64 (int fildes, const void *buf, size_t nbyte, off64_t offset)
|
||||
{
|
||||
int *guard;
|
||||
if (NULL_PTR (pwrite64))
|
||||
init_io_intf ();
|
||||
if (CHCK_REENTRANCE (guard))
|
||||
return CALL_REAL (pwrite64)(fildes, buf, nbyte, offset);
|
||||
PUSH_REENTRANCE (guard);
|
||||
hrtime_t reqt = gethrtime ();
|
||||
ssize_t ret = CALL_REAL (pwrite64)(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;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*------------------------------------------------------------- fgets */
|
||||
char*
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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 ----------------- */
|
||||
/*
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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);
|
||||
void* ret = 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)
|
||||
|
@ -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;
|
||||
|
@ -32,10 +32,9 @@
|
||||
#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"
|
||||
|
||||
|
@ -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); \
|
||||
}
|
||||
|
||||
|
@ -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"),
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user