diff options
author | Lennart Poettering <lennart@poettering.net> | 2018-12-03 13:22:15 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2018-12-03 13:28:26 +0100 |
commit | a898603563ffb21af5cf8dc91f9a516a41743991 (patch) | |
tree | 7c6fe76923f58283b598d95b722b8ef9afcf5ff7 /src | |
parent | 90b365cee03bab9b4925f2e918c362c4183f8e92 (diff) | |
download | systemd-a898603563ffb21af5cf8dc91f9a516a41743991.tar.gz |
sd-bus,static-destruct: clean up how we do our ELF section magic
This cleans up a bit how we set up things for the ELF section magic:
1. Let's always use our gcc macros, instead of __attribute__ directly
2. Align our structures to sizeof(void*), i.e. the pointer size, rather
than a fixed 8 or __BIGGEST_ALIGNMENT__. The former is unnecessarily
high for 32bit systems, the latter too high for 64bit systems. gcc
seems to use ptr alignment for static variables itself, hence this
should be good enough for us too. Moreover, the Linux kernel also
uses pointer alginment for all its ELF section registration magic,
hence this should be good enough for us too.
3. Let's always prefix the sections we create ourself with SYSTEMD_,
just to make clear where they come from.
4. Always align the pointer we start from when iterating through these
lists. This should be unnecessary, but makes things nicely
systematic, as we'll align all pointers we use to access these
sections properly.
Diffstat (limited to 'src')
-rw-r--r-- | src/basic/static-destruct.h | 10 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-error.c | 10 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/bus-error.h | 8 | ||||
-rw-r--r-- | src/libsystemd/sd-bus/test-bus-error.c | 10 |
4 files changed, 19 insertions, 19 deletions
diff --git a/src/basic/static-destruct.h b/src/basic/static-destruct.h index b780985d11..5c0bea31a6 100644 --- a/src/basic/static-destruct.h +++ b/src/basic/static-destruct.h @@ -22,9 +22,9 @@ typedef struct StaticDestructor { func(q); \ } \ /* The actual destructor structure */ \ - __attribute__ ((__section__("SYSTEMD_STATIC_DESTRUCT"))) \ - __attribute__ ((__aligned__(__BIGGEST_ALIGNMENT__))) \ - __attribute__ ((__used__)) \ + _section_("SYSTEMD_STATIC_DESTRUCT") \ + _alignptr_ \ + _used_ \ static const StaticDestructor UNIQ_T(static_destructor_entry, uq) = { \ .data = &(variable), \ .destroy = UNIQ_T(static_destructor_wrapper, uq), \ @@ -43,9 +43,9 @@ static inline void static_destruct(void) { if (!__start_SYSTEMD_STATIC_DESTRUCT) return; - d = ALIGN_TO_PTR(__start_SYSTEMD_STATIC_DESTRUCT, __BIGGEST_ALIGNMENT__); + d = ALIGN_TO_PTR(__start_SYSTEMD_STATIC_DESTRUCT, sizeof(void*)); while (d < __stop_SYSTEMD_STATIC_DESTRUCT) { d->destroy(d->data); - d = ALIGN_TO_PTR(d + 1, __BIGGEST_ALIGNMENT__); + d = ALIGN_TO_PTR(d + 1, sizeof(void*)); } } diff --git a/src/libsystemd/sd-bus/bus-error.c b/src/libsystemd/sd-bus/bus-error.c index 5ef643134e..06097d0b48 100644 --- a/src/libsystemd/sd-bus/bus-error.c +++ b/src/libsystemd/sd-bus/bus-error.c @@ -54,8 +54,8 @@ BUS_ERROR_MAP_ELF_REGISTER const sd_bus_error_map bus_standard_errors[] = { }; /* GCC maps this magically to the beginning and end of the BUS_ERROR_MAP section */ -extern const sd_bus_error_map __start_BUS_ERROR_MAP[]; -extern const sd_bus_error_map __stop_BUS_ERROR_MAP[]; +extern const sd_bus_error_map __start_SYSTEMD_BUS_ERROR_MAP[]; +extern const sd_bus_error_map __stop_SYSTEMD_BUS_ERROR_MAP[]; /* Additional maps registered with sd_bus_error_add_map() are in this * NULL terminated array */ @@ -89,9 +89,9 @@ static int bus_error_name_to_errno(const char *name) { return m->code; } - m = __start_BUS_ERROR_MAP; + m = ALIGN_TO_PTR(__start_SYSTEMD_BUS_ERROR_MAP, sizeof(void*)); #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - while (m < __stop_BUS_ERROR_MAP) { + while (m < __stop_SYSTEMD_BUS_ERROR_MAP) { /* For magic ELF error maps, the end marker might * appear in the middle of things, since multiple maps * might appear in the same section. Hence, let's skip @@ -99,7 +99,7 @@ static int bus_error_name_to_errno(const char *name) { * boundary, which is the selected alignment for the * arrays. */ if (m->code == BUS_ERROR_MAP_END_MARKER) { - m = ALIGN8_PTR(m+1); + m = ALIGN_TO_PTR(m + 1, sizeof(void*)); continue; } diff --git a/src/libsystemd/sd-bus/bus-error.h b/src/libsystemd/sd-bus/bus-error.h index e8e743c0d7..c1758c46bb 100644 --- a/src/libsystemd/sd-bus/bus-error.h +++ b/src/libsystemd/sd-bus/bus-error.h @@ -31,13 +31,13 @@ int bus_error_set_errnofv(sd_bus_error *e, int error, const char *format, va_lis */ #define BUS_ERROR_MAP_ELF_REGISTER \ - __attribute__ ((__section__("BUS_ERROR_MAP"))) \ - __attribute__ ((__used__)) \ - __attribute__ ((__aligned__(8))) + _section_("SYSTEMD_BUS_ERROR_MAP") \ + _used_ \ + _alignptr_ #define BUS_ERROR_MAP_ELF_USE(errors) \ extern const sd_bus_error_map errors[]; \ - __attribute__ ((__used__)) \ + _used_ \ static const sd_bus_error_map * const CONCATENATE(errors ## _copy_, __COUNTER__) = errors; /* We use something exotic as end marker, to ensure people build the diff --git a/src/libsystemd/sd-bus/test-bus-error.c b/src/libsystemd/sd-bus/test-bus-error.c index 8f1fc54520..f464b5b23d 100644 --- a/src/libsystemd/sd-bus/test-bus-error.c +++ b/src/libsystemd/sd-bus/test-bus-error.c @@ -113,18 +113,18 @@ static void test_error(void) { assert_se(!sd_bus_error_is_set(&error)); } -extern const sd_bus_error_map __start_BUS_ERROR_MAP[]; -extern const sd_bus_error_map __stop_BUS_ERROR_MAP[]; +extern const sd_bus_error_map __start_SYSTEMD_BUS_ERROR_MAP[]; +extern const sd_bus_error_map __stop_SYSTEMD_BUS_ERROR_MAP[]; static void dump_mapping_table(void) { const sd_bus_error_map *m; printf("----- errno mappings ------\n"); - m = __start_BUS_ERROR_MAP; - while (m < __stop_BUS_ERROR_MAP) { + m = ALIGN_TO_PTR(__start_SYSTEMD_BUS_ERROR_MAP, sizeof(void*)); + while (m < __stop_SYSTEMD_BUS_ERROR_MAP) { if (m->code == BUS_ERROR_MAP_END_MARKER) { - m = ALIGN8_PTR(m+1); + m = ALIGN_TO_PTR(m + 1, sizeof(void*)); continue; } |