diff options
author | Brian Robbins <brianrob@microsoft.com> | 2018-04-24 19:11:48 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-04-24 19:11:48 -0700 |
commit | 801882177f3c71b1c2b99ed581d62ad7c4fd18e5 (patch) | |
tree | 11a17b9a271937903ad4c5b690a9804d51a6c1ee /cross | |
parent | 482099f5fba1f1e4567d86ad57b79f99ad73ba65 (diff) | |
download | coreclr-801882177f3c71b1c2b99ed581d62ad7c4fd18e5.tar.gz coreclr-801882177f3c71b1c2b99ed581d62ad7c4fd18e5.tar.bz2 coreclr-801882177f3c71b1c2b99ed581d62ad7c4fd18e5.zip |
Patch LTTng ust-tracepoint.h on ARM/Trusty when building crossrootfs. (#17762)
Diffstat (limited to 'cross')
-rw-r--r-- | cross/arm/trusty-lttng-2.4.patch | 71 | ||||
-rwxr-xr-x | cross/build-rootfs.sh | 1 |
2 files changed, 72 insertions, 0 deletions
diff --git a/cross/arm/trusty-lttng-2.4.patch b/cross/arm/trusty-lttng-2.4.patch new file mode 100644 index 0000000000..8e4dd7ae71 --- /dev/null +++ b/cross/arm/trusty-lttng-2.4.patch @@ -0,0 +1,71 @@ +From e72c9d7ead60e3317bd6d1fade995c07021c947b Mon Sep 17 00:00:00 2001 +From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> +Date: Thu, 7 May 2015 13:25:04 -0400 +Subject: [PATCH] Fix: building probe providers with C++ compiler + +Robert Daniels wrote: +> > I'm attempting to use lttng userspace tracing with a C++ application +> > on an ARM platform. I'm using GCC 4.8.4 on Linux 3.14 with the 2.6 +> > release of lttng. I've compiled lttng-modules, lttng-ust, and +> > lttng-tools and have been able to get a simple test working with C +> > code. When I attempt to run the hello.cxx test on my target it will +> > segfault. +> +> +> I spent a little time digging into this issue and finally discovered the +> cause of my segfault with ARM C++ tracepoints. +> +> There is a struct called 'lttng_event' in ust-events.h which contains an +> empty union 'u'. This was the cause of my issue. Under C, this empty union +> compiles to a zero byte member while under C++ it compiles to a one byte +> member, and in my case was four-byte aligned which caused my C++ code to +> have the 'cds_list_head node' offset incorrectly by four bytes. This lead +> to an incorrect linked list structure which caused my issue. +> +> Since this union is empty, I simply removed it from the struct and everything +> worked correctly. +> +> I don't know the history or purpose behind this empty union so I'd like to +> know if this is a safe fix. If it is I can submit a patch with the union +> removed. + +That's a very nice catch! + +We do not support building tracepoint probe provider with +g++ yet, as stated in lttng-ust(3): + +"- Note for C++ support: although an application instrumented with + tracepoints can be compiled with g++, tracepoint probes should be + compiled with gcc (only tested with gcc so far)." + +However, if it works fine with this fix, then I'm tempted to take it, +especially because removing the empty union does not appear to affect +the layout of struct lttng_event as seen from liblttng-ust, which must +be compiled with a C compiler, and from probe providers compiled with +a C compiler. So all we are changing is the layout of a probe provider +compiled with a C++ compiler, which is anyway buggy at the moment, +because it is not compatible with the layout expected by liblttng-ust +compiled with a C compiler. + +Reported-by: Robert Daniels <robert.daniels@vantagecontrols.com> +Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> +--- + include/lttng/ust-events.h | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/usr/include/lttng/ust-events.h b/usr/include/lttng/ust-events.h +index 328a875..3d7a274 100644 +--- a/usr/include/lttng/ust-events.h ++++ b/usr/include/lttng/ust-events.h +@@ -407,8 +407,6 @@ struct lttng_event { + void *_deprecated1; + struct lttng_ctx *ctx; + enum lttng_ust_instrumentation instrumentation; +- union { +- } u; + struct cds_list_head node; /* Event list in session */ + struct cds_list_head _deprecated2; + void *_deprecated3; +-- +2.7.4 + diff --git a/cross/build-rootfs.sh b/cross/build-rootfs.sh index e3fb02973c..1f42c75578 100755 --- a/cross/build-rootfs.sh +++ b/cross/build-rootfs.sh @@ -155,6 +155,7 @@ if [[ -n $__LinuxCodeName ]]; then if [[ "$__BuildArch" == "arm" && "$__LinuxCodeName" == "trusty" ]]; then pushd $__RootfsDir patch -p1 < $__CrossDir/$__BuildArch/trusty.patch + patch -p1 < $__CrossDir/$__BuildArch/trusty-lttng-2.4.patch popd fi elif [ "$__Tizen" == "tizen" ]; then |