Skip to content

Commit

Permalink
libsel4test: retain _test_type and _test_case sections
Browse files Browse the repository at this point in the history
unused attribute does not prevent the sections from being
garbage-collected during link-time optimisation. This may trigger
undefined references errors to [__start|__stop]_test_case symbols
that are expected to be emitted by the linker anyway.

Adding "retain" attribute makes sure that the section and its
associated symbols are kept regardless of linker's garbage
collection. Another fix could be adding "nostart-stop-gc" to the
linker flags, but since it is only one section (_test_case)
where its __start/__stop symbols are references, adding retain to
it makes more sense. This additional functionality requires
binutils version 2.36 or later.

Sponsored by: DARPA.

Signed-off-by: Hesham Almatary <hesham.almatary@cl.cam.ac.uk>
  • Loading branch information
heshamelmatary committed Aug 2, 2023
1 parent bb87a71 commit a47f3b6
Showing 1 changed file with 2 additions and 2 deletions.
4 changes: 2 additions & 2 deletions libsel4test/include/sel4test/test.h
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ typedef struct test_type {
/* Declare a test type.
* For now, we put the test types in a separate elf section. */
#define DEFINE_TEST_TYPE(_name, _id, _set_up_test_type, _tear_down_test_type, _set_up, _tear_down, _run_test) \
__attribute__((used)) __attribute__((section("_test_type"))) struct test_type TEST_TYPE_ ##_name = { \
__attribute__((used,retain)) __attribute__((section("_test_type"))) struct test_type TEST_TYPE_ ##_name = { \
.name = #_name, \
.id = _id, \
.set_up_test_type = _set_up_test_type, \
Expand Down Expand Up @@ -131,7 +131,7 @@ typedef struct testcase ALIGN(sizeof(struct testcase)) testcase_t;
* that it is accepted by C++ compilers.
*/
#define DEFINE_TEST_WITH_TYPE(_name, _description, _function, _test_type, _enabled) \
__attribute__((used)) __attribute__((section("_test_case"))) struct testcase TEST_ ## _name = { \
__attribute__((used,retain)) __attribute__((section("_test_case"))) struct testcase TEST_ ## _name = { \
#_name, \
_description, \
(test_fn)_function, \
Expand Down

0 comments on commit a47f3b6

Please sign in to comment.