Skip to content

Commit 754283c

Browse files
committed
tools/nolibc: pass argc, argv and envp to constructors
Since 2005 glibc has passed argc, argv, and envp to all constructors. As it is cheap and easy to do so, mirror that behaviour in nolibc. This makes it easier to migrate applications to nolibc. Link: https://lore.kernel.org/r/20240728-nolibc-constructor-args-v1-1-36d0bf5cd4c0@weissschuh.net Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
1 parent ae1f550 commit 754283c

2 files changed

Lines changed: 15 additions & 13 deletions

File tree

tools/include/nolibc/crt.h

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@ const unsigned long *_auxv __attribute__((weak));
1313
static void __stack_chk_init(void);
1414
static void exit(int);
1515

16-
extern void (*const __preinit_array_start[])(void) __attribute__((weak));
17-
extern void (*const __preinit_array_end[])(void) __attribute__((weak));
16+
extern void (*const __preinit_array_start[])(int, char **, char**) __attribute__((weak));
17+
extern void (*const __preinit_array_end[])(int, char **, char**) __attribute__((weak));
1818

19-
extern void (*const __init_array_start[])(void) __attribute__((weak));
20-
extern void (*const __init_array_end[])(void) __attribute__((weak));
19+
extern void (*const __init_array_start[])(int, char **, char**) __attribute__((weak));
20+
extern void (*const __init_array_end[])(int, char **, char**) __attribute__((weak));
2121

2222
extern void (*const __fini_array_start[])(void) __attribute__((weak));
2323
extern void (*const __fini_array_end[])(void) __attribute__((weak));
@@ -29,7 +29,8 @@ void _start_c(long *sp)
2929
char **argv;
3030
char **envp;
3131
int exitcode;
32-
void (* const *func)(void);
32+
void (* const *ctor_func)(int, char **, char **);
33+
void (* const *dtor_func)(void);
3334
const unsigned long *auxv;
3435
/* silence potential warning: conflicting types for 'main' */
3536
int _nolibc_main(int, char **, char **) __asm__ ("main");
@@ -66,16 +67,16 @@ void _start_c(long *sp)
6667
;
6768
_auxv = auxv;
6869

69-
for (func = __preinit_array_start; func < __preinit_array_end; func++)
70-
(*func)();
71-
for (func = __init_array_start; func < __init_array_end; func++)
72-
(*func)();
70+
for (ctor_func = __preinit_array_start; ctor_func < __preinit_array_end; ctor_func++)
71+
(*ctor_func)(argc, argv, envp);
72+
for (ctor_func = __init_array_start; ctor_func < __init_array_end; ctor_func++)
73+
(*ctor_func)(argc, argv, envp);
7374

7475
/* go to application */
7576
exitcode = _nolibc_main(argc, argv, envp);
7677

77-
for (func = __fini_array_end; func > __fini_array_start;)
78-
(*--func)();
78+
for (dtor_func = __fini_array_end; dtor_func > __fini_array_start;)
79+
(*--dtor_func)();
7980

8081
exit(exitcode);
8182
}

tools/testing/selftests/nolibc/nolibc-test.c

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,9 +686,10 @@ static void constructor1(void)
686686
}
687687

688688
__attribute__((constructor))
689-
static void constructor2(void)
689+
static void constructor2(int argc, char **argv, char **envp)
690690
{
691-
constructor_test_value *= 2;
691+
if (argc && argv && envp)
692+
constructor_test_value *= 2;
692693
}
693694

694695
int run_startup(int min, int max)

0 commit comments

Comments
 (0)