From 332b3a18ea9e3be7ec5d65a4d75c5cf2b6a59525 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Tue, 26 Apr 2011 12:18:45 -0400 Subject: [PATCH] Tracepoint: make tracepoint ptrs section rw The pointer section needs to be rw so that the linker can update the pointers at link-time, thus allowing the code to be compiled with -fPIC. The previous behavior would cause section flag mismatch, because TRACEPOINT_LIB declared the ptr with "= NULL", which is not a void * const, but rather a void *, which forces the element it is assigned to to become non-const. Signed-off-by: Mathieu Desnoyers --- include/ust/tracepoint.h | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/include/ust/tracepoint.h b/include/ust/tracepoint.h index b9557d5..b11d69d 100644 --- a/include/ust/tracepoint.h +++ b/include/ust/tracepoint.h @@ -116,13 +116,17 @@ struct tracepoint { data); \ } +/* + * __tracepoints_ptrs section is not const (read-only) to let the linker update + * the pointer, allowing PIC code. + */ #define DEFINE_TRACEPOINT_FN(name, reg, unreg) \ static const char __tpstrtab_##name[] \ __attribute__((section("__tracepoints_strings"))) = #name; \ struct tracepoint __tracepoint_##name \ __attribute__((section("__tracepoints"))) = \ { __tpstrtab_##name, 0, NULL }; \ - static struct tracepoint * const __tracepoint_ptr_##name \ + static struct tracepoint * __tracepoint_ptr_##name \ __attribute__((used, section("__tracepoints_ptrs"))) = \ &__tracepoint_##name; @@ -231,8 +235,8 @@ extern int tracepoint_unregister_lib(struct tracepoint * const *tracepoints_star #define TRACEPOINT_LIB \ extern struct tracepoint * const __start___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \ extern struct tracepoint * const __stop___tracepoints_ptrs[] __attribute__((weak, visibility("hidden"))); \ - static struct tracepoint * const __tracepoint_ptr_dummy \ - __attribute__((used, section("__tracepoints_ptrs"))) = NULL; \ + static struct tracepoint * __tracepoint_ptr_dummy \ + __attribute__((used, section("__tracepoints_ptrs"))); \ static void __attribute__((constructor)) __tracepoints__init(void) \ { \ tracepoint_register_lib(__start___tracepoints_ptrs, \ @@ -388,8 +392,8 @@ extern int trace_event_unregister_lib(struct trace_event * const *start_trace_ev __attribute__((weak, visibility("hidden"))); \ extern struct trace_event * const __stop___trace_events_ptrs[] \ __attribute__((weak, visibility("hidden"))); \ - static struct trace_event * const __event_ptrs_dummy \ - __attribute__((used, section("__trace_events_ptrs"))) = NULL; \ + static struct trace_event * __event_ptrs_dummy \ + __attribute__((used, section("__trace_events_ptrs"))); \ static void __attribute__((constructor)) \ __trace_events__init(void) \ { \ -- 2.34.1