GCC 4.5 (and possibly some late 4.4) choose to align structures on large
multiples, which breaks the __marker section (adding extra padding between
object sections). Increase the structure alignment to fix this issue.
Note that kernel tracepoints have recently been changed to use an array of
pointers (which are pointing to the actual tracepoint structures), thus removing
the requirement for these odd structure alignments.
But given that markers are in "maintainance mode", let's do the quick fix and
just increase the minimum alignment size.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
const char *tp_name; /* Optional tracepoint name */
void *tp_cb; /* Optional tracepoint callback */
void *location; /* Address of marker in code */
const char *tp_name; /* Optional tracepoint name */
void *tp_cb; /* Optional tracepoint callback */
void *location; /* Address of marker in code */
-} __attribute__((aligned(8)));
+} __attribute__((aligned(128)));/*
+ * Aligned on 128 bytes because it is
+ * globally visible and gcc happily
+ * align these on the structure size.
+ */
#define GET_MARKER(channel, name) (__mark_##channel##_##name)
#define GET_MARKER(channel, name) (__mark_##channel##_##name)
__attribute__((section("__markers_strings"))) \
= #channel "\0" #name "\0" format; \
static struct marker GET_MARKER(channel, name) \
__attribute__((section("__markers_strings"))) \
= #channel "\0" #name "\0" format; \
static struct marker GET_MARKER(channel, name) \
- __attribute__((section("__markers"), aligned(8))) = \
+ __attribute__((section("__markers"), aligned(128))) = \
{ __mstrtab_##channel##_##name, \
&__mstrtab_##channel##_##name[sizeof(#channel)], \
&__mstrtab_##channel##_##name[sizeof(#channel) + sizeof(#name)], \
{ __mstrtab_##channel##_##name, \
&__mstrtab_##channel##_##name[sizeof(#channel)], \
&__mstrtab_##channel##_##name[sizeof(#channel) + sizeof(#name)], \