Commit b8c60e8f authored by Thomas Weißschuh's avatar Thomas Weißschuh
Browse files

selftests/nolibc: add tests for multi-object linkage



While uncommon, nolibc executables can be linked together from multiple
compilation units.
Add some tests to make sure everything works in that case.

Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
Link: https://lore.kernel.org/lkml/20231012-nolibc-linkage-test-v1-1-315e682768b4@weissschuh.net/


Acked-by: default avatarWilly Tarreau <w@1wt.eu>
parent 17362f3d
Loading
Loading
Loading
Loading
+6 −6
Original line number Diff line number Diff line
@@ -171,17 +171,17 @@ sysroot/$(ARCH)/include:
	$(Q)mv sysroot/sysroot sysroot/$(ARCH)

ifneq ($(NOLIBC_SYSROOT),0)
nolibc-test: nolibc-test.c sysroot/$(ARCH)/include
nolibc-test: nolibc-test.c nolibc-test-linkage.c sysroot/$(ARCH)/include
	$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \
	  -nostdlib -nostdinc -static -Isysroot/$(ARCH)/include $< -lgcc
	  -nostdlib -nostdinc -static -Isysroot/$(ARCH)/include nolibc-test.c nolibc-test-linkage.c -lgcc
else
nolibc-test: nolibc-test.c
nolibc-test: nolibc-test.c nolibc-test-linkage.c
	$(QUIET_CC)$(CC) $(CFLAGS) $(LDFLAGS) -o $@ \
	  -nostdlib -static -include ../../../include/nolibc/nolibc.h $< -lgcc
	  -nostdlib -static -include ../../../include/nolibc/nolibc.h nolibc-test.c nolibc-test-linkage.c -lgcc
endif

libc-test: nolibc-test.c
	$(QUIET_CC)$(HOSTCC) -o $@ $<
libc-test: nolibc-test.c nolibc-test-linkage.c
	$(QUIET_CC)$(HOSTCC) -o $@ nolibc-test.c nolibc-test-linkage.c

# local libc-test
run-libc-test: libc-test
+26 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#include "nolibc-test-linkage.h"

#ifndef NOLIBC
#include <errno.h>
#endif

void *linkage_test_errno_addr(void)
{
	return &errno;
}

int linkage_test_constructor_test_value;

__attribute__((constructor))
static void constructor1(void)
{
	linkage_test_constructor_test_value = 2;
}

__attribute__((constructor))
static void constructor2(void)
{
	linkage_test_constructor_test_value *= 3;
}
+9 −0
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

#ifndef _NOLIBC_TEST_LINKAGE_H
#define _NOLIBC_TEST_LINKAGE_H

void *linkage_test_errno_addr(void);
extern int linkage_test_constructor_test_value;

#endif /* _NOLIBC_TEST_LINKAGE_H */
+4 −0
Original line number Diff line number Diff line
@@ -41,6 +41,8 @@
#endif
#endif

#include "nolibc-test-linkage.h"

/* for the type of int_fast16_t and int_fast32_t, musl differs from glibc and nolibc */
#define SINT_MAX_OF_TYPE(type) (((type)1 << (sizeof(type) * 8 - 2)) - (type)1 + ((type)1 << (sizeof(type) * 8 - 2)))
#define SINT_MIN_OF_TYPE(type) (-SINT_MAX_OF_TYPE(type) - 1)
@@ -647,6 +649,8 @@ int run_startup(int min, int max)
		CASE_TEST(auxv_addr);        EXPECT_PTRGT(test_auxv != (void *)-1, test_auxv, brk); break;
		CASE_TEST(auxv_AT_UID);      EXPECT_EQ(1, getauxval(AT_UID), getuid()); break;
		CASE_TEST(constructor);      EXPECT_EQ(1, constructor_test_value, 2); break;
		CASE_TEST(linkage_errno);    EXPECT_PTREQ(1, linkage_test_errno_addr(), &errno); break;
		CASE_TEST(linkage_constr);   EXPECT_EQ(1, linkage_test_constructor_test_value, 6); break;
		case __LINE__:
			return ret; /* must be last */
		/* note: do not set any defaults so as to permit holes above */