From: Michael Jeanson Date: Fri, 9 Apr 2021 18:17:48 +0000 (-0400) Subject: Move liblttng-ust-cyg-profile to 'src/lib/' X-Git-Tag: v2.13.0-rc1~138 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=18a76df9471a85f29dcf1ed4dbce5e1db5e6e675;p=lttng-ust.git Move liblttng-ust-cyg-profile to 'src/lib/' Move all public libraries under 'src/lib/'. This is part of an effort to standardize our autotools setup across projects to simplify maintenance. Change-Id: Ia06cfce8b57db814dc17ba01829e1498c4cb7aea Signed-off-by: Michael Jeanson Signed-off-by: Mathieu Desnoyers --- diff --git a/.gitignore b/.gitignore index 92966cc8..714646dd 100644 --- a/.gitignore +++ b/.gitignore @@ -128,10 +128,10 @@ cscope.* /src/libcounter/Makefile /src/liblttng-ust-comm/Makefile /src/liblttng-ust-ctl/Makefile -/src/liblttng-ust-cyg-profile/Makefile +/src/lib/lttng-ust-cyg-profile/Makefile /src/liblttng-ust-dl/Makefile /src/liblttng-ust-fd/Makefile -/src/liblttng-ust-fork/Makefile +/src/lib/lttng-ust-fork/Makefile /src/liblttng-ust-java-agent/Makefile /src/liblttng-ust-java-agent/java/Makefile /src/liblttng-ust-java-agent/java/lttng-ust-agent-all/Makefile diff --git a/configure.ac b/configure.ac index c81e17e4..7c2dd902 100644 --- a/configure.ac +++ b/configure.ac @@ -522,10 +522,10 @@ AC_CONFIG_FILES([ src/libcounter/Makefile src/liblttng-ust-comm/Makefile src/liblttng-ust-ctl/Makefile - src/liblttng-ust-cyg-profile/Makefile + src/lib/lttng-ust-cyg-profile/Makefile src/liblttng-ust-dl/Makefile src/liblttng-ust-fd/Makefile - src/liblttng-ust-fork/Makefile + src/lib/lttng-ust-fork/Makefile src/liblttng-ust-java-agent/java/lttng-ust-agent-all/Makefile src/liblttng-ust-java-agent/java/lttng-ust-agent-common/Makefile src/liblttng-ust-java-agent/java/lttng-ust-agent-jul/Makefile diff --git a/src/Makefile.am b/src/Makefile.am index 38c640bb..33f9ed14 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -8,9 +8,7 @@ SUBDIRS = \ liblttng-ust \ liblttng-ust-ctl \ lib \ - liblttng-ust-fd \ - liblttng-ust-fork \ - liblttng-ust-cyg-profile + liblttng-ust-fd if ENABLE_UST_DL SUBDIRS += liblttng-ust-dl diff --git a/src/lib/Makefile.am b/src/lib/Makefile.am index 384b8481..bbaf9a01 100644 --- a/src/lib/Makefile.am +++ b/src/lib/Makefile.am @@ -1,6 +1,8 @@ # SPDX-License-Identifier: LGPL-2.1-only SUBDIRS = \ + lttng-ust-fork \ + lttng-ust-cyg-profile \ lttng-ust-libc-wrapper if ENABLE_PYTHON_AGENT diff --git a/src/lib/lttng-ust-cyg-profile/Makefile.am b/src/lib/lttng-ust-cyg-profile/Makefile.am new file mode 100644 index 00000000..7e8b226f --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/Makefile.am @@ -0,0 +1,28 @@ +# SPDX-License-Identifier: LGPL-2.1-only + +AM_CFLAGS += -I$(srcdir) -fno-strict-aliasing + +lib_LTLIBRARIES = liblttng-ust-cyg-profile.la \ + liblttng-ust-cyg-profile-fast.la + +liblttng_ust_cyg_profile_la_SOURCES = \ + lttng-ust-cyg-profile.c \ + lttng-ust-cyg-profile.h + +liblttng_ust_cyg_profile_la_LIBADD = \ + $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ + $(DL_LIBS) + +liblttng_ust_cyg_profile_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) + +liblttng_ust_cyg_profile_fast_la_SOURCES = \ + lttng-ust-cyg-profile-fast.c \ + lttng-ust-cyg-profile-fast.h + +liblttng_ust_cyg_profile_fast_la_LIBADD = \ + $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ + $(DL_LIBS) + +liblttng_ust_cyg_profile_fast_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) + +dist_noinst_SCRIPTS = run run-fast diff --git a/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c new file mode 100644 index 00000000..bee7ac04 --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * Copyright (C) 2011-2013 Mathieu Desnoyers + */ + +#define _LGPL_SOURCE +#include +#include +#include + +#define TRACEPOINT_DEFINE +#define TRACEPOINT_CREATE_PROBES +#define TP_IP_PARAM func_addr +#include "lttng-ust-cyg-profile-fast.h" + +void __cyg_profile_func_enter(void *this_fn, void *call_site) + __attribute__((no_instrument_function)); + +void __cyg_profile_func_exit(void *this_fn, void *call_site) + __attribute__((no_instrument_function)); + +void __cyg_profile_func_enter(void *this_fn, void *call_site __attribute__((unused))) +{ + tracepoint(lttng_ust_cyg_profile_fast, func_entry, this_fn); +} + +void __cyg_profile_func_exit(void *this_fn, void *call_site __attribute__((unused))) +{ + tracepoint(lttng_ust_cyg_profile_fast, func_exit, this_fn); +} diff --git a/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h new file mode 100644 index 00000000..f2cdaabe --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h @@ -0,0 +1,50 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (C) 2011-2013 Mathieu Desnoyers + */ + +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER lttng_ust_cyg_profile_fast + +#if !defined(_TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +TRACEPOINT_EVENT(lttng_ust_cyg_profile_fast, func_entry, + TP_ARGS(void *, func_addr), + TP_FIELDS( + ctf_integer_hex(unsigned long, addr, + (unsigned long) func_addr) + ) +) + +TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile_fast, func_entry, + TRACE_DEBUG_FUNCTION) + +TRACEPOINT_EVENT(lttng_ust_cyg_profile_fast, func_exit, + TP_ARGS(void *, func_addr), + TP_FIELDS( + ctf_unused(func_addr) + ) +) + +TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile_fast, func_exit, + TRACE_DEBUG_FUNCTION) + +#endif /* _TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H */ + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./lttng-ust-cyg-profile-fast.h" + +/* This part must be outside ifdef protection */ +#include + +#ifdef __cplusplus +} +#endif diff --git a/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.c b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.c new file mode 100644 index 00000000..e81e1154 --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.c @@ -0,0 +1,31 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-or-later + * + * Copyright (C) 2011-2013 Mathieu Desnoyers + */ + +#define _LGPL_SOURCE +#include +#include +#include + +#define TRACEPOINT_DEFINE +#define TRACEPOINT_CREATE_PROBES +#define TP_IP_PARAM func_addr +#include "lttng-ust-cyg-profile.h" + +void __cyg_profile_func_enter(void *this_fn, void *call_site) + __attribute__((no_instrument_function)); + +void __cyg_profile_func_exit(void *this_fn, void *call_site) + __attribute__((no_instrument_function)); + +void __cyg_profile_func_enter(void *this_fn, void *call_site) +{ + tracepoint(lttng_ust_cyg_profile, func_entry, this_fn, call_site); +} + +void __cyg_profile_func_exit(void *this_fn, void *call_site) +{ + tracepoint(lttng_ust_cyg_profile, func_exit, this_fn, call_site); +} diff --git a/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.h b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.h new file mode 100644 index 00000000..8e98237a --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/lttng-ust-cyg-profile.h @@ -0,0 +1,55 @@ +/* + * SPDX-License-Identifier: MIT + * + * Copyright (C) 2011-2013 Mathieu Desnoyers + */ + +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER lttng_ust_cyg_profile + +#if !defined(_TRACEPOINT_LTTNG_UST_CYG_PROFILE_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TRACEPOINT_LTTNG_UST_CYG_PROFILE_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +TRACEPOINT_EVENT_CLASS(lttng_ust_cyg_profile, func_class, + TP_ARGS(void *, func_addr, void *, call_site), + TP_FIELDS( + ctf_integer_hex(unsigned long, addr, + (unsigned long) func_addr) + ctf_integer_hex(unsigned long, call_site, + (unsigned long) call_site) + ) +) + +TRACEPOINT_EVENT_INSTANCE(lttng_ust_cyg_profile, func_class, + func_entry, + TP_ARGS(void *, func_addr, void *, call_site) +) + +TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile, func_entry, + TRACE_DEBUG_FUNCTION) + +TRACEPOINT_EVENT_INSTANCE(lttng_ust_cyg_profile, func_class, + func_exit, + TP_ARGS(void *, func_addr, void *, call_site) +) + +TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile, func_exit, + TRACE_DEBUG_FUNCTION) + +#endif /* _TRACEPOINT_LTTNG_UST_CYG_PROFILE_H */ + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./lttng-ust-cyg-profile.h" + +/* This part must be outside ifdef protection */ +#include + +#ifdef __cplusplus +} +#endif diff --git a/src/lib/lttng-ust-cyg-profile/run b/src/lib/lttng-ust-cyg-profile/run new file mode 100755 index 00000000..8df97ff8 --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/run @@ -0,0 +1,5 @@ +#!/bin/sh +# +# SPDX-License-Identifier: LGPL-2.1-only + +LD_VERBOSE=1 LD_PRELOAD=.libs/liblttng-ust-cyg-profile.so ${*} diff --git a/src/lib/lttng-ust-cyg-profile/run-fast b/src/lib/lttng-ust-cyg-profile/run-fast new file mode 100755 index 00000000..3506bb8b --- /dev/null +++ b/src/lib/lttng-ust-cyg-profile/run-fast @@ -0,0 +1,5 @@ +#!/bin/sh +# +# SPDX-License-Identifier: LGPL-2.1-only + +LD_VERBOSE=1 LD_PRELOAD=.libs/liblttng-ust-cyg-profile-fast.so ${*} diff --git a/src/lib/lttng-ust-fork/Makefile.am b/src/lib/lttng-ust-fork/Makefile.am new file mode 100644 index 00000000..b5feca4b --- /dev/null +++ b/src/lib/lttng-ust-fork/Makefile.am @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: LGPL-2.1-only + +AM_CFLAGS += -fno-strict-aliasing + +lib_LTLIBRARIES = liblttng-ust-fork.la +liblttng_ust_fork_la_SOURCES = ustfork.c +liblttng_ust_fork_la_LIBADD = \ + $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ + $(DL_LIBS) + +liblttng_ust_fork_la_CFLAGS = -DUST_COMPONENT=liblttng-ust-fork $(AM_CFLAGS) + +liblttng_ust_fork_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) diff --git a/src/lib/lttng-ust-fork/ustfork.c b/src/lib/lttng-ust-fork/ustfork.c new file mode 100644 index 00000000..3eb62d2a --- /dev/null +++ b/src/lib/lttng-ust-fork/ustfork.c @@ -0,0 +1,442 @@ +/* + * SPDX-License-Identifier: LGPL-2.1-only + * + * Copyright (C) 2009 Pierre-Marc Fournier + * Copyright (C) 2011-2012 Mathieu Desnoyers + */ + +/* Has to be included first to override dlfcn.h */ +#include + +#include +#include +#include +#include +#include +#include + +#include + +pid_t fork(void) +{ + static pid_t (*plibc_func)(void) = NULL; + sigset_t sigset; + pid_t retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "fork"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"fork\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + lttng_ust_before_fork(&sigset); + /* Do the real fork */ + retval = plibc_func(); + saved_errno = errno; + if (retval == 0) { + /* child */ + lttng_ust_after_fork_child(&sigset); + } else { + lttng_ust_after_fork_parent(&sigset); + } + errno = saved_errno; + return retval; +} + +int daemon(int nochdir, int noclose) +{ + static int (*plibc_func)(int nochdir, int noclose) = NULL; + sigset_t sigset; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "daemon"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"daemon\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + lttng_ust_before_fork(&sigset); + /* Do the real daemon call */ + retval = plibc_func(nochdir, noclose); + saved_errno = errno; + if (retval == 0) { + /* child, parent called _exit() directly */ + lttng_ust_after_fork_child(&sigset); + } else { + /* on error in the parent */ + lttng_ust_after_fork_parent(&sigset); + } + errno = saved_errno; + return retval; +} + +int setuid(uid_t uid) +{ + static int (*plibc_func)(uid_t uid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setuid */ + retval = plibc_func(uid); + saved_errno = errno; + + lttng_ust_after_setuid(); + + errno = saved_errno; + return retval; +} + +int setgid(gid_t gid) +{ + static int (*plibc_func)(gid_t gid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setgid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setgid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setgid */ + retval = plibc_func(gid); + saved_errno = errno; + + lttng_ust_after_setgid(); + + errno = saved_errno; + return retval; +} + +int seteuid(uid_t euid) +{ + static int (*plibc_func)(uid_t euid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "seteuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"seteuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real seteuid */ + retval = plibc_func(euid); + saved_errno = errno; + + lttng_ust_after_seteuid(); + + errno = saved_errno; + return retval; +} + +int setegid(gid_t egid) +{ + static int (*plibc_func)(gid_t egid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setegid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setegid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setegid */ + retval = plibc_func(egid); + saved_errno = errno; + + lttng_ust_after_setegid(); + + errno = saved_errno; + return retval; +} + +int setreuid(uid_t ruid, uid_t euid) +{ + static int (*plibc_func)(uid_t ruid, uid_t euid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setreuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setreuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setreuid */ + retval = plibc_func(ruid, euid); + saved_errno = errno; + + lttng_ust_after_setreuid(); + + errno = saved_errno; + return retval; +} + +int setregid(gid_t rgid, gid_t egid) +{ + static int (*plibc_func)(gid_t rgid, gid_t egid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setregid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setregid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setregid */ + retval = plibc_func(rgid, egid); + saved_errno = errno; + + lttng_ust_after_setregid(); + + errno = saved_errno; + return retval; +} + +#ifdef __linux__ + +struct user_desc; + +struct ustfork_clone_info { + int (*fn)(void *); + void *arg; + sigset_t sigset; +}; + +static int clone_fn(void *arg) +{ + struct ustfork_clone_info *info = (struct ustfork_clone_info *) arg; + + /* clone is now done and we are in child */ + lttng_ust_after_fork_child(&info->sigset); + return info->fn(info->arg); +} + +int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...) +{ + static int (*plibc_func)(int (*fn)(void *), void *child_stack, + int flags, void *arg, pid_t *ptid, + struct user_desc *tls, pid_t *ctid) = NULL; + /* var args */ + pid_t *ptid; + struct user_desc *tls; + pid_t *ctid; + /* end of var args */ + va_list ap; + int retval; + int saved_errno; + + va_start(ap, arg); + ptid = va_arg(ap, pid_t *); + tls = va_arg(ap, struct user_desc *); + ctid = va_arg(ap, pid_t *); + va_end(ap); + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "clone"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"clone\" symbol.\n"); + errno = ENOSYS; + return -1; + } + } + + if (flags & CLONE_VM) { + /* + * Creating a thread, no need to intervene, just pass on + * the arguments. + */ + retval = plibc_func(fn, child_stack, flags, arg, ptid, + tls, ctid); + saved_errno = errno; + } else { + /* Creating a real process, we need to intervene. */ + struct ustfork_clone_info info = { .fn = fn, .arg = arg }; + + lttng_ust_before_fork(&info.sigset); + retval = plibc_func(clone_fn, child_stack, flags, &info, + ptid, tls, ctid); + saved_errno = errno; + /* The child doesn't get here. */ + lttng_ust_after_fork_parent(&info.sigset); + } + errno = saved_errno; + return retval; +} + +int setns(int fd, int nstype) +{ + static int (*plibc_func)(int fd, int nstype) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setns"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setns\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setns */ + retval = plibc_func(fd, nstype); + saved_errno = errno; + + lttng_ust_after_setns(); + + errno = saved_errno; + return retval; +} + +int unshare(int flags) +{ + static int (*plibc_func)(int flags) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "unshare"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"unshare\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setns */ + retval = plibc_func(flags); + saved_errno = errno; + + lttng_ust_after_unshare(); + + errno = saved_errno; + return retval; +} + +int setresuid(uid_t ruid, uid_t euid, uid_t suid) +{ + static int (*plibc_func)(uid_t ruid, uid_t euid, uid_t suid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setresuid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setresuid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setresuid */ + retval = plibc_func(ruid, euid, suid); + saved_errno = errno; + + lttng_ust_after_setresuid(); + + errno = saved_errno; + return retval; +} + +int setresgid(gid_t rgid, gid_t egid, gid_t sgid) +{ + static int (*plibc_func)(gid_t rgid, gid_t egid, gid_t sgid) = NULL; + int retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "setresgid"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"setresgid\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + /* Do the real setresgid */ + retval = plibc_func(rgid, egid, sgid); + saved_errno = errno; + + lttng_ust_after_setresgid(); + + errno = saved_errno; + return retval; +} + +#elif defined (__FreeBSD__) + +pid_t rfork(int flags) +{ + static pid_t (*plibc_func)(void) = NULL; + sigset_t sigset; + pid_t retval; + int saved_errno; + + if (plibc_func == NULL) { + plibc_func = dlsym(RTLD_NEXT, "rfork"); + if (plibc_func == NULL) { + fprintf(stderr, "libustfork: unable to find \"rfork\" symbol\n"); + errno = ENOSYS; + return -1; + } + } + + lttng_ust_before_fork(&sigset); + /* Do the real rfork */ + retval = plibc_func(); + saved_errno = errno; + if (retval == 0) { + /* child */ + lttng_ust_after_fork_child(&sigset); + } else { + lttng_ust_after_fork_parent(&sigset); + } + errno = saved_errno; + return retval; +} + +/* + * On BSD, no need to override vfork, because it runs in the context of + * the parent, with parent waiting until execve or exit is executed in + * the child. + */ + +#else +#warning "Unknown OS. You might want to ensure that fork/clone/vfork/fork handling is complete." +#endif diff --git a/src/liblttng-ust-cyg-profile/Makefile.am b/src/liblttng-ust-cyg-profile/Makefile.am deleted file mode 100644 index 7e8b226f..00000000 --- a/src/liblttng-ust-cyg-profile/Makefile.am +++ /dev/null @@ -1,28 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-only - -AM_CFLAGS += -I$(srcdir) -fno-strict-aliasing - -lib_LTLIBRARIES = liblttng-ust-cyg-profile.la \ - liblttng-ust-cyg-profile-fast.la - -liblttng_ust_cyg_profile_la_SOURCES = \ - lttng-ust-cyg-profile.c \ - lttng-ust-cyg-profile.h - -liblttng_ust_cyg_profile_la_LIBADD = \ - $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ - $(DL_LIBS) - -liblttng_ust_cyg_profile_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) - -liblttng_ust_cyg_profile_fast_la_SOURCES = \ - lttng-ust-cyg-profile-fast.c \ - lttng-ust-cyg-profile-fast.h - -liblttng_ust_cyg_profile_fast_la_LIBADD = \ - $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ - $(DL_LIBS) - -liblttng_ust_cyg_profile_fast_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) - -dist_noinst_SCRIPTS = run run-fast diff --git a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c b/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c deleted file mode 100644 index bee7ac04..00000000 --- a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-License-Identifier: LGPL-2.1-or-later - * - * Copyright (C) 2011-2013 Mathieu Desnoyers - */ - -#define _LGPL_SOURCE -#include -#include -#include - -#define TRACEPOINT_DEFINE -#define TRACEPOINT_CREATE_PROBES -#define TP_IP_PARAM func_addr -#include "lttng-ust-cyg-profile-fast.h" - -void __cyg_profile_func_enter(void *this_fn, void *call_site) - __attribute__((no_instrument_function)); - -void __cyg_profile_func_exit(void *this_fn, void *call_site) - __attribute__((no_instrument_function)); - -void __cyg_profile_func_enter(void *this_fn, void *call_site __attribute__((unused))) -{ - tracepoint(lttng_ust_cyg_profile_fast, func_entry, this_fn); -} - -void __cyg_profile_func_exit(void *this_fn, void *call_site __attribute__((unused))) -{ - tracepoint(lttng_ust_cyg_profile_fast, func_exit, this_fn); -} diff --git a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h b/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h deleted file mode 100644 index f2cdaabe..00000000 --- a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile-fast.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * SPDX-License-Identifier: MIT - * - * Copyright (C) 2011-2013 Mathieu Desnoyers - */ - -#undef TRACEPOINT_PROVIDER -#define TRACEPOINT_PROVIDER lttng_ust_cyg_profile_fast - -#if !defined(_TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H) || defined(TRACEPOINT_HEADER_MULTI_READ) -#define _TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -TRACEPOINT_EVENT(lttng_ust_cyg_profile_fast, func_entry, - TP_ARGS(void *, func_addr), - TP_FIELDS( - ctf_integer_hex(unsigned long, addr, - (unsigned long) func_addr) - ) -) - -TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile_fast, func_entry, - TRACE_DEBUG_FUNCTION) - -TRACEPOINT_EVENT(lttng_ust_cyg_profile_fast, func_exit, - TP_ARGS(void *, func_addr), - TP_FIELDS( - ctf_unused(func_addr) - ) -) - -TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile_fast, func_exit, - TRACE_DEBUG_FUNCTION) - -#endif /* _TRACEPOINT_LTTNG_UST_CYG_PROFILE_FAST_H */ - -#undef TRACEPOINT_INCLUDE -#define TRACEPOINT_INCLUDE "./lttng-ust-cyg-profile-fast.h" - -/* This part must be outside ifdef protection */ -#include - -#ifdef __cplusplus -} -#endif diff --git a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.c b/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.c deleted file mode 100644 index e81e1154..00000000 --- a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * SPDX-License-Identifier: LGPL-2.1-or-later - * - * Copyright (C) 2011-2013 Mathieu Desnoyers - */ - -#define _LGPL_SOURCE -#include -#include -#include - -#define TRACEPOINT_DEFINE -#define TRACEPOINT_CREATE_PROBES -#define TP_IP_PARAM func_addr -#include "lttng-ust-cyg-profile.h" - -void __cyg_profile_func_enter(void *this_fn, void *call_site) - __attribute__((no_instrument_function)); - -void __cyg_profile_func_exit(void *this_fn, void *call_site) - __attribute__((no_instrument_function)); - -void __cyg_profile_func_enter(void *this_fn, void *call_site) -{ - tracepoint(lttng_ust_cyg_profile, func_entry, this_fn, call_site); -} - -void __cyg_profile_func_exit(void *this_fn, void *call_site) -{ - tracepoint(lttng_ust_cyg_profile, func_exit, this_fn, call_site); -} diff --git a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.h b/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.h deleted file mode 100644 index 8e98237a..00000000 --- a/src/liblttng-ust-cyg-profile/lttng-ust-cyg-profile.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * SPDX-License-Identifier: MIT - * - * Copyright (C) 2011-2013 Mathieu Desnoyers - */ - -#undef TRACEPOINT_PROVIDER -#define TRACEPOINT_PROVIDER lttng_ust_cyg_profile - -#if !defined(_TRACEPOINT_LTTNG_UST_CYG_PROFILE_H) || defined(TRACEPOINT_HEADER_MULTI_READ) -#define _TRACEPOINT_LTTNG_UST_CYG_PROFILE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -TRACEPOINT_EVENT_CLASS(lttng_ust_cyg_profile, func_class, - TP_ARGS(void *, func_addr, void *, call_site), - TP_FIELDS( - ctf_integer_hex(unsigned long, addr, - (unsigned long) func_addr) - ctf_integer_hex(unsigned long, call_site, - (unsigned long) call_site) - ) -) - -TRACEPOINT_EVENT_INSTANCE(lttng_ust_cyg_profile, func_class, - func_entry, - TP_ARGS(void *, func_addr, void *, call_site) -) - -TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile, func_entry, - TRACE_DEBUG_FUNCTION) - -TRACEPOINT_EVENT_INSTANCE(lttng_ust_cyg_profile, func_class, - func_exit, - TP_ARGS(void *, func_addr, void *, call_site) -) - -TRACEPOINT_LOGLEVEL(lttng_ust_cyg_profile, func_exit, - TRACE_DEBUG_FUNCTION) - -#endif /* _TRACEPOINT_LTTNG_UST_CYG_PROFILE_H */ - -#undef TRACEPOINT_INCLUDE -#define TRACEPOINT_INCLUDE "./lttng-ust-cyg-profile.h" - -/* This part must be outside ifdef protection */ -#include - -#ifdef __cplusplus -} -#endif diff --git a/src/liblttng-ust-cyg-profile/run b/src/liblttng-ust-cyg-profile/run deleted file mode 100755 index 8df97ff8..00000000 --- a/src/liblttng-ust-cyg-profile/run +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -# -# SPDX-License-Identifier: LGPL-2.1-only - -LD_VERBOSE=1 LD_PRELOAD=.libs/liblttng-ust-cyg-profile.so ${*} diff --git a/src/liblttng-ust-cyg-profile/run-fast b/src/liblttng-ust-cyg-profile/run-fast deleted file mode 100755 index 3506bb8b..00000000 --- a/src/liblttng-ust-cyg-profile/run-fast +++ /dev/null @@ -1,5 +0,0 @@ -#!/bin/sh -# -# SPDX-License-Identifier: LGPL-2.1-only - -LD_VERBOSE=1 LD_PRELOAD=.libs/liblttng-ust-cyg-profile-fast.so ${*} diff --git a/src/liblttng-ust-fork/Makefile.am b/src/liblttng-ust-fork/Makefile.am deleted file mode 100644 index b5feca4b..00000000 --- a/src/liblttng-ust-fork/Makefile.am +++ /dev/null @@ -1,13 +0,0 @@ -# SPDX-License-Identifier: LGPL-2.1-only - -AM_CFLAGS += -fno-strict-aliasing - -lib_LTLIBRARIES = liblttng-ust-fork.la -liblttng_ust_fork_la_SOURCES = ustfork.c -liblttng_ust_fork_la_LIBADD = \ - $(top_builddir)/src/liblttng-ust/liblttng-ust.la \ - $(DL_LIBS) - -liblttng_ust_fork_la_CFLAGS = -DUST_COMPONENT=liblttng-ust-fork $(AM_CFLAGS) - -liblttng_ust_fork_la_LDFLAGS = -version-info $(LTTNG_UST_LIBRARY_VERSION) diff --git a/src/liblttng-ust-fork/ustfork.c b/src/liblttng-ust-fork/ustfork.c deleted file mode 100644 index 3eb62d2a..00000000 --- a/src/liblttng-ust-fork/ustfork.c +++ /dev/null @@ -1,442 +0,0 @@ -/* - * SPDX-License-Identifier: LGPL-2.1-only - * - * Copyright (C) 2009 Pierre-Marc Fournier - * Copyright (C) 2011-2012 Mathieu Desnoyers - */ - -/* Has to be included first to override dlfcn.h */ -#include - -#include -#include -#include -#include -#include -#include - -#include - -pid_t fork(void) -{ - static pid_t (*plibc_func)(void) = NULL; - sigset_t sigset; - pid_t retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "fork"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"fork\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - lttng_ust_before_fork(&sigset); - /* Do the real fork */ - retval = plibc_func(); - saved_errno = errno; - if (retval == 0) { - /* child */ - lttng_ust_after_fork_child(&sigset); - } else { - lttng_ust_after_fork_parent(&sigset); - } - errno = saved_errno; - return retval; -} - -int daemon(int nochdir, int noclose) -{ - static int (*plibc_func)(int nochdir, int noclose) = NULL; - sigset_t sigset; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "daemon"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"daemon\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - lttng_ust_before_fork(&sigset); - /* Do the real daemon call */ - retval = plibc_func(nochdir, noclose); - saved_errno = errno; - if (retval == 0) { - /* child, parent called _exit() directly */ - lttng_ust_after_fork_child(&sigset); - } else { - /* on error in the parent */ - lttng_ust_after_fork_parent(&sigset); - } - errno = saved_errno; - return retval; -} - -int setuid(uid_t uid) -{ - static int (*plibc_func)(uid_t uid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setuid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setuid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setuid */ - retval = plibc_func(uid); - saved_errno = errno; - - lttng_ust_after_setuid(); - - errno = saved_errno; - return retval; -} - -int setgid(gid_t gid) -{ - static int (*plibc_func)(gid_t gid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setgid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setgid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setgid */ - retval = plibc_func(gid); - saved_errno = errno; - - lttng_ust_after_setgid(); - - errno = saved_errno; - return retval; -} - -int seteuid(uid_t euid) -{ - static int (*plibc_func)(uid_t euid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "seteuid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"seteuid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real seteuid */ - retval = plibc_func(euid); - saved_errno = errno; - - lttng_ust_after_seteuid(); - - errno = saved_errno; - return retval; -} - -int setegid(gid_t egid) -{ - static int (*plibc_func)(gid_t egid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setegid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setegid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setegid */ - retval = plibc_func(egid); - saved_errno = errno; - - lttng_ust_after_setegid(); - - errno = saved_errno; - return retval; -} - -int setreuid(uid_t ruid, uid_t euid) -{ - static int (*plibc_func)(uid_t ruid, uid_t euid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setreuid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setreuid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setreuid */ - retval = plibc_func(ruid, euid); - saved_errno = errno; - - lttng_ust_after_setreuid(); - - errno = saved_errno; - return retval; -} - -int setregid(gid_t rgid, gid_t egid) -{ - static int (*plibc_func)(gid_t rgid, gid_t egid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setregid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setregid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setregid */ - retval = plibc_func(rgid, egid); - saved_errno = errno; - - lttng_ust_after_setregid(); - - errno = saved_errno; - return retval; -} - -#ifdef __linux__ - -struct user_desc; - -struct ustfork_clone_info { - int (*fn)(void *); - void *arg; - sigset_t sigset; -}; - -static int clone_fn(void *arg) -{ - struct ustfork_clone_info *info = (struct ustfork_clone_info *) arg; - - /* clone is now done and we are in child */ - lttng_ust_after_fork_child(&info->sigset); - return info->fn(info->arg); -} - -int clone(int (*fn)(void *), void *child_stack, int flags, void *arg, ...) -{ - static int (*plibc_func)(int (*fn)(void *), void *child_stack, - int flags, void *arg, pid_t *ptid, - struct user_desc *tls, pid_t *ctid) = NULL; - /* var args */ - pid_t *ptid; - struct user_desc *tls; - pid_t *ctid; - /* end of var args */ - va_list ap; - int retval; - int saved_errno; - - va_start(ap, arg); - ptid = va_arg(ap, pid_t *); - tls = va_arg(ap, struct user_desc *); - ctid = va_arg(ap, pid_t *); - va_end(ap); - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "clone"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"clone\" symbol.\n"); - errno = ENOSYS; - return -1; - } - } - - if (flags & CLONE_VM) { - /* - * Creating a thread, no need to intervene, just pass on - * the arguments. - */ - retval = plibc_func(fn, child_stack, flags, arg, ptid, - tls, ctid); - saved_errno = errno; - } else { - /* Creating a real process, we need to intervene. */ - struct ustfork_clone_info info = { .fn = fn, .arg = arg }; - - lttng_ust_before_fork(&info.sigset); - retval = plibc_func(clone_fn, child_stack, flags, &info, - ptid, tls, ctid); - saved_errno = errno; - /* The child doesn't get here. */ - lttng_ust_after_fork_parent(&info.sigset); - } - errno = saved_errno; - return retval; -} - -int setns(int fd, int nstype) -{ - static int (*plibc_func)(int fd, int nstype) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setns"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setns\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setns */ - retval = plibc_func(fd, nstype); - saved_errno = errno; - - lttng_ust_after_setns(); - - errno = saved_errno; - return retval; -} - -int unshare(int flags) -{ - static int (*plibc_func)(int flags) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "unshare"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"unshare\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setns */ - retval = plibc_func(flags); - saved_errno = errno; - - lttng_ust_after_unshare(); - - errno = saved_errno; - return retval; -} - -int setresuid(uid_t ruid, uid_t euid, uid_t suid) -{ - static int (*plibc_func)(uid_t ruid, uid_t euid, uid_t suid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setresuid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setresuid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setresuid */ - retval = plibc_func(ruid, euid, suid); - saved_errno = errno; - - lttng_ust_after_setresuid(); - - errno = saved_errno; - return retval; -} - -int setresgid(gid_t rgid, gid_t egid, gid_t sgid) -{ - static int (*plibc_func)(gid_t rgid, gid_t egid, gid_t sgid) = NULL; - int retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "setresgid"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"setresgid\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - /* Do the real setresgid */ - retval = plibc_func(rgid, egid, sgid); - saved_errno = errno; - - lttng_ust_after_setresgid(); - - errno = saved_errno; - return retval; -} - -#elif defined (__FreeBSD__) - -pid_t rfork(int flags) -{ - static pid_t (*plibc_func)(void) = NULL; - sigset_t sigset; - pid_t retval; - int saved_errno; - - if (plibc_func == NULL) { - plibc_func = dlsym(RTLD_NEXT, "rfork"); - if (plibc_func == NULL) { - fprintf(stderr, "libustfork: unable to find \"rfork\" symbol\n"); - errno = ENOSYS; - return -1; - } - } - - lttng_ust_before_fork(&sigset); - /* Do the real rfork */ - retval = plibc_func(); - saved_errno = errno; - if (retval == 0) { - /* child */ - lttng_ust_after_fork_child(&sigset); - } else { - lttng_ust_after_fork_parent(&sigset); - } - errno = saved_errno; - return retval; -} - -/* - * On BSD, no need to override vfork, because it runs in the context of - * the parent, with parent waiting until execve or exit is executed in - * the child. - */ - -#else -#warning "Unknown OS. You might want to ensure that fork/clone/vfork/fork handling is complete." -#endif