[lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2016-07-04 Thread Mathieu Desnoyers
Add missing dlmopen(3) instrumentation, and add the "flags" field to
dlopen instrumentation.

Link: http://man7.org/linux/man-pages/man3/dlopen.3.html
Signed-off-by: Mathieu Desnoyers 
---
 include/lttng/ust-dlfcn.h  |  10 
 liblttng-ust-dl/lttng-ust-dl.c | 114 ++---
 liblttng-ust-dl/ust_dl.c   |   1 +
 liblttng-ust-dl/ust_dl.h   |  19 ++-
 4 files changed, 135 insertions(+), 9 deletions(-)

diff --git a/include/lttng/ust-dlfcn.h b/include/lttng/ust-dlfcn.h
index 7471d94..7cd5bf4 100644
--- a/include/lttng/ust-dlfcn.h
+++ b/include/lttng/ust-dlfcn.h
@@ -47,7 +47,11 @@
 #define dlclose glibc_dlclose_proto_lies_about_leafness
 #define dlsym glibc_dlsym_proto_lies_about_leafness
 #define dlerror glibc_dlerror_proto_lies_about_leafness
+#define dlmopen glibc_dlmopen_proto_lies_about_leafness
+#define dlvsym glibc_dlvsym_proto_lies_about_leafness
 #include 
+#undef dlvsym
+#undef dlmopen
 #undef dlerror
 #undef dlsym
 #undef dlclose
@@ -58,6 +62,12 @@ extern int dlclose(void *__handle) __nonnull ((1));
 extern void *dlsym(void *__restrict __handle,
__const char *__restrict __name) __nonnull ((2));
 extern char *dlerror(void);
+#ifdef __USE_GNU
+extern void *dlmopen(Lmid_t __nsid, const char *__file, int __mode);
+extern void *dlvsym(void *__restrict __handle,
+   __const char *__restrict __name,
+   __const char *__restrict __version);
+#endif
 #else
 #include 
 #endif /* __GLIBC__ */
diff --git a/liblttng-ust-dl/lttng-ust-dl.c b/liblttng-ust-dl/lttng-ust-dl.c
index 81b5bec..b0737b6 100644
--- a/liblttng-ust-dl/lttng-ust-dl.c
+++ b/liblttng-ust-dl/lttng-ust-dl.c
@@ -37,11 +37,13 @@
 #define TRACEPOINT_DEFINE
 #include "ust_dl.h"
 
-static void *(*__lttng_ust_plibc_dlopen)(const char *filename, int flag);
+static void *(*__lttng_ust_plibc_dlopen)(const char *filename, int flags);
+static void *(*__lttng_ust_plibc_dlmopen)(Lmid_t nsid, const char *filename,
+   int flags);
 static int (*__lttng_ust_plibc_dlclose)(void *handle);
 
 static
-void *_lttng_ust_dl_libc_dlopen(const char *filename, int flag)
+void *_lttng_ust_dl_libc_dlopen(const char *filename, int flags)
 {
if (!__lttng_ust_plibc_dlopen) {
__lttng_ust_plibc_dlopen = dlsym(RTLD_NEXT, "dlopen");
@@ -50,7 +52,21 @@ void *_lttng_ust_dl_libc_dlopen(const char *filename, int 
flag)
return NULL;
}
}
-   return __lttng_ust_plibc_dlopen(filename, flag);
+   return __lttng_ust_plibc_dlopen(filename, flags);
+}
+
+static
+void *_lttng_ust_dl_libc_dlmopen(Lmid_t nsid, const char *filename,
+   int flags)
+{
+   if (!__lttng_ust_plibc_dlmopen) {
+   __lttng_ust_plibc_dlmopen = dlsym(RTLD_NEXT, "dlmopen");
+   if (!__lttng_ust_plibc_dlmopen) {
+   fprintf(stderr, "%s\n", dlerror());
+   return NULL;
+   }
+   }
+   return __lttng_ust_plibc_dlmopen(nsid, filename, flags);
 }
 
 static
@@ -67,7 +83,8 @@ int _lttng_ust_dl_libc_dlclose(void *handle)
 }
 
 static
-void lttng_ust_dl_dlopen(void *so_base, const char *so_name, void *ip)
+void lttng_ust_dl_dlopen(void *so_base, const char *so_name,
+   int flags, void *ip)
 {
char resolved_path[PATH_MAX];
struct lttng_ust_elf *elf;
@@ -106,7 +123,7 @@ void lttng_ust_dl_dlopen(void *so_base, const char 
*so_name, void *ip)
}
 
tracepoint(lttng_ust_dl, dlopen,
-   ip, so_base, resolved_path, memsz,
+   ip, so_base, resolved_path, flags, memsz,
has_build_id, has_debug_link);
 
if (has_build_id) {
@@ -126,11 +143,72 @@ end:
return;
 }
 
-void *dlopen(const char *filename, int flag)
+static
+void lttng_ust_dl_dlmopen(void *so_base, Lmid_t nsid, const char *so_name,
+   int flags, void *ip)
+{
+   char resolved_path[PATH_MAX];
+   struct lttng_ust_elf *elf;
+   uint64_t memsz;
+   uint8_t *build_id = NULL;
+   size_t build_id_len;
+   char *dbg_file = NULL;
+   uint32_t crc;
+   int has_build_id = 0, has_debug_link = 0;
+   int ret;
+
+   if (!realpath(so_name, resolved_path)) {
+   ERR("could not resolve path '%s'", so_name);
+   return;
+   }
+
+   elf = lttng_ust_elf_create(resolved_path);
+   if (!elf) {
+   ERR("could not acces file %s", resolved_path);
+   return;
+   }
+
+   ret = lttng_ust_elf_get_memsz(elf, &memsz);
+   if (ret) {
+   goto end;
+   }
+   ret = lttng_ust_elf_get_build_id(
+   elf, &build_id, &build_id_len, &has_build_id);
+   if (ret) {
+   goto end;
+   }
+   ret = lttng_ust_elf_get_debug_link(
+   elf, &dbg_file, &crc, &has_debug_link);
+   if (ret) {
+   goto end;
+   }
+
+   tracepoint(lttng_ust_dl, dlmopen,

Re: [lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2017-02-21 Thread Thomas Petazzoni
Hello,

On Mon,  4 Jul 2016 18:53:48 -0400, Mathieu Desnoyers wrote:
> Add missing dlmopen(3) instrumentation, and add the "flags" field to
> dlopen instrumentation.
> 
> Link: http://man7.org/linux/man-pages/man3/dlopen.3.html
> Signed-off-by: Mathieu Desnoyers 

FYI, this commit (7b0fdd83c137bea1d7302df1a45252dfdccd8172) breaks the
build with the musl C library, because it doesn't implement the
dlmopen() extension.

Perhaps there should be an autoconf test to check if the C library
provides dlmopen() functionality or not?

Best regards,

Thomas Petazzoni
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


Re: [lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2017-02-21 Thread Mathieu Desnoyers
- On Feb 21, 2017, at 4:03 AM, Thomas Petazzoni 
thomas.petazz...@free-electrons.com wrote:

> Hello,
> 
> On Mon,  4 Jul 2016 18:53:48 -0400, Mathieu Desnoyers wrote:
>> Add missing dlmopen(3) instrumentation, and add the "flags" field to
>> dlopen instrumentation.
>> 
>> Link: http://man7.org/linux/man-pages/man3/dlopen.3.html
>> Signed-off-by: Mathieu Desnoyers 
> 
> FYI, this commit (7b0fdd83c137bea1d7302df1a45252dfdccd8172) breaks the
> build with the musl C library, because it doesn't implement the
> dlmopen() extension.
> 
> Perhaps there should be an autoconf test to check if the C library
> provides dlmopen() functionality or not?

My expectation is that the dlmopen override symbol gets generated,
but it is never invoked in builds where the libc does not implement
it, so we never have to look it up dynamically through dlsym().

How does the build fail with musl ? Can you provide the build
output ?

Thanks,

Mathieu

> 
> Best regards,
> 
> Thomas Petazzoni
> --
> Thomas Petazzoni, CTO, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


Re: [lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2017-02-21 Thread Thomas Petazzoni
Hello,

On Tue, 21 Feb 2017 14:08:08 + (UTC), Mathieu Desnoyers wrote:

> My expectation is that the dlmopen override symbol gets generated,
> but it is never invoked in builds where the libc does not implement
> it, so we never have to look it up dynamically through dlsym().

The main issue is that the Lmid_t type doesn't exist I believe.

> How does the build fail with musl ? Can you provide the build
> output ?

Sure:

  
http://autobuild.buildroot.net/results/113/113fa95a054df183014b43ec36b329f9c59bd356/build-end.log

If you want to reproduce:

$ git clone git://git.busybox.net/buildroot
$ cd buildroot/
$ git checkout 2017.02-rc2
$ cat > .config
BR2_arm=y
BR2_cortex_a9=y
BR2_ARM_ENABLE_VFP=y
BR2_TOOLCHAIN_EXTERNAL=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.02-rc1-2-g133c5ac.tar.bz2";
BR2_TOOLCHAIN_EXTERNAL_GCC_5=y
BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
BR2_TOOLCHAIN_EXTERNAL_CXX=y
BR2_INIT_NONE=y
BR2_SYSTEM_BIN_SH_NONE=y
# BR2_PACKAGE_BUSYBOX is not set
BR2_PACKAGE_LTTNG_LIBUST=y
# BR2_TARGET_ROOTFS_TAR is not set
$ make olddefconfig
$ make

Takes ~5 minutes maybe for the all build to proceed until it breaks on
lttng-ust.

Thanks!

Thomas
-- 
Thomas Petazzoni, CTO, Free Electrons
Embedded Linux and Kernel engineering
http://free-electrons.com
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


Re: [lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2017-02-21 Thread Mathieu Desnoyers
- On Feb 21, 2017, at 9:19 AM, Thomas Petazzoni 
thomas.petazz...@free-electrons.com wrote:

> Hello,
> 
> On Tue, 21 Feb 2017 14:08:08 + (UTC), Mathieu Desnoyers wrote:
> 
>> My expectation is that the dlmopen override symbol gets generated,
>> but it is never invoked in builds where the libc does not implement
>> it, so we never have to look it up dynamically through dlsym().
> 
> The main issue is that the Lmid_t type doesn't exist I believe.

Ah yes, good point. This typedef is only there with glibc header
files.

So we'd have to add a configure.ac test that would detect if dlmopen()
is there, and expose a define to lttng-ust to skip the dlmopen() bits
accordingly.

Jonathan, can you have a look and prepare a patch please ?

Thanks,

Mathieu

> 
>> How does the build fail with musl ? Can you provide the build
>> output ?
> 
> Sure:
> 
>  
> http://autobuild.buildroot.net/results/113/113fa95a054df183014b43ec36b329f9c59bd356/build-end.log
> 
> If you want to reproduce:
> 
> $ git clone git://git.busybox.net/buildroot
> $ cd buildroot/
> $ git checkout 2017.02-rc2
> $ cat > .config
> BR2_arm=y
> BR2_cortex_a9=y
> BR2_ARM_ENABLE_VFP=y
> BR2_TOOLCHAIN_EXTERNAL=y
> BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
> BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
> BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.02-rc1-2-g133c5ac.tar.bz2";
> BR2_TOOLCHAIN_EXTERNAL_GCC_5=y
> BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
> BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
> BR2_TOOLCHAIN_EXTERNAL_CXX=y
> BR2_INIT_NONE=y
> BR2_SYSTEM_BIN_SH_NONE=y
> # BR2_PACKAGE_BUSYBOX is not set
> BR2_PACKAGE_LTTNG_LIBUST=y
> # BR2_TARGET_ROOTFS_TAR is not set
> $ make olddefconfig
> $ make
> 
> Takes ~5 minutes maybe for the all build to proceed until it breaks on
> lttng-ust.
> 
> Thanks!
> 
> Thomas
> --
> Thomas Petazzoni, CTO, Free Electrons
> Embedded Linux and Kernel engineering
> http://free-electrons.com

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev


Re: [lttng-dev] [RFC PATCH lttng-ust 2/2] dl instrumentation: add dlmopen event, trace dlopen flags

2017-02-21 Thread Jonathan Rajotte-Julien
On Tue, Feb 21, 2017 at 02:40:28PM +, Mathieu Desnoyers wrote:
> - On Feb 21, 2017, at 9:19 AM, Thomas Petazzoni 
> thomas.petazz...@free-electrons.com wrote:
> 
> > Hello,
> > 
> > On Tue, 21 Feb 2017 14:08:08 + (UTC), Mathieu Desnoyers wrote:
> > 
> >> My expectation is that the dlmopen override symbol gets generated,
> >> but it is never invoked in builds where the libc does not implement
> >> it, so we never have to look it up dynamically through dlsym().
> > 
> > The main issue is that the Lmid_t type doesn't exist I believe.
> 
> Ah yes, good point. This typedef is only there with glibc header
> files.
> 
> So we'd have to add a configure.ac test that would detect if dlmopen()
> is there, and expose a define to lttng-ust to skip the dlmopen() bits
> accordingly.
> 
> Jonathan, can you have a look and prepare a patch please ?

Sure.

> 
> Thanks,
> 
> Mathieu
> 
> > 
> >> How does the build fail with musl ? Can you provide the build
> >> output ?
> > 
> > Sure:
> > 
> >  
> > http://autobuild.buildroot.net/results/113/113fa95a054df183014b43ec36b329f9c59bd356/build-end.log
> > 
> > If you want to reproduce:
> > 
> > $ git clone git://git.busybox.net/buildroot
> > $ cd buildroot/
> > $ git checkout 2017.02-rc2
> > $ cat > .config
> > BR2_arm=y
> > BR2_cortex_a9=y
> > BR2_ARM_ENABLE_VFP=y
> > BR2_TOOLCHAIN_EXTERNAL=y
> > BR2_TOOLCHAIN_EXTERNAL_CUSTOM=y
> > BR2_TOOLCHAIN_EXTERNAL_DOWNLOAD=y
> > BR2_TOOLCHAIN_EXTERNAL_URL="http://autobuild.buildroot.org/toolchains/tarballs/br-arm-cortex-a9-musl-2017.02-rc1-2-g133c5ac.tar.bz2";
> > BR2_TOOLCHAIN_EXTERNAL_GCC_5=y
> > BR2_TOOLCHAIN_EXTERNAL_HEADERS_4_9=y
> > BR2_TOOLCHAIN_EXTERNAL_CUSTOM_MUSL=y
> > BR2_TOOLCHAIN_EXTERNAL_CXX=y
> > BR2_INIT_NONE=y
> > BR2_SYSTEM_BIN_SH_NONE=y
> > # BR2_PACKAGE_BUSYBOX is not set
> > BR2_PACKAGE_LTTNG_LIBUST=y
> > # BR2_TARGET_ROOTFS_TAR is not set
> > $ make olddefconfig
> > $ make
> > 
> > Takes ~5 minutes maybe for the all build to proceed until it breaks on
> > lttng-ust.
> > 
> > Thanks!
> > 
> > Thomas
> > --
> > Thomas Petazzoni, CTO, Free Electrons
> > Embedded Linux and Kernel engineering
> > http://free-electrons.com
> 
> -- 
> Mathieu Desnoyers
> EfficiOS Inc.
> http://www.efficios.com

-- 
Jonathan Rajotte-Julien
EfficiOS
___
lttng-dev mailing list
lttng-dev@lists.lttng.org
https://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev