mirror of
https://github.com/torvalds/linux.git
synced 2026-05-29 17:43:52 +02:00
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: Thomas Weißschuh <linux@weissschuh.net> Link: https://lore.kernel.org/lkml/20231012-nolibc-linkage-test-v1-1-315e682768b4@weissschuh.net/ Acked-by: Willy Tarreau <w@1wt.eu>
This commit is contained in:
parent
17362f3d0b
commit
b8c60e8fc6
|
|
@ -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
tools/testing/selftests/nolibc/nolibc-test-linkage.c
Normal file
26
tools/testing/selftests/nolibc/nolibc-test-linkage.c
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
/* 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
tools/testing/selftests/nolibc/nolibc-test-linkage.h
Normal file
9
tools/testing/selftests/nolibc/nolibc-test-linkage.h
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
/* 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 */
|
||||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user