From: Mathieu Desnoyers Date: Tue, 26 Apr 2011 16:18:45 +0000 (-0400) Subject: Tracepoint: make tracepoint ptrs section rw X-Git-Tag: v0.13~13 X-Git-Url: https://git.liburcu.org/?a=commitdiff_plain;h=332b3a18ea9e3be7ec5d65a4d75c5cf2b6a59525;hp=1c330d13895139a60bb47a0efba1f50af080cf59;p=ust.git 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 --- 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) \ { \