117336755SZhangjin Wu /* SPDX-License-Identifier: LGPL-2.1 OR MIT */ 217336755SZhangjin Wu /* 317336755SZhangjin Wu * C Run Time support for NOLIBC 417336755SZhangjin Wu * Copyright (C) 2023 Zhangjin Wu <falcon@tinylab.org> 517336755SZhangjin Wu */ 617336755SZhangjin Wu 717336755SZhangjin Wu #ifndef _NOLIBC_CRT_H 817336755SZhangjin Wu #define _NOLIBC_CRT_H 917336755SZhangjin Wu 1017336755SZhangjin Wu char **environ __attribute__((weak)); 1117336755SZhangjin Wu const unsigned long *_auxv __attribute__((weak)); 1217336755SZhangjin Wu 13dcb677c3SZhangjin Wu static void __stack_chk_init(void); 1417336755SZhangjin Wu static void exit(int); 1517336755SZhangjin Wu 16*92199222SThomas Weißschuh __attribute__((weak)) _start_c(long * sp)1717336755SZhangjin Wuvoid _start_c(long *sp) 1817336755SZhangjin Wu { 1917336755SZhangjin Wu long argc; 2017336755SZhangjin Wu char **argv; 2117336755SZhangjin Wu char **envp; 2217336755SZhangjin Wu const unsigned long *auxv; 2317336755SZhangjin Wu /* silence potential warning: conflicting types for 'main' */ 2417336755SZhangjin Wu int _nolibc_main(int, char **, char **) __asm__ ("main"); 2517336755SZhangjin Wu 2606f2a62cSZhangjin Wu /* initialize stack protector */ 2706f2a62cSZhangjin Wu __stack_chk_init(); 2806f2a62cSZhangjin Wu 2917336755SZhangjin Wu /* 3017336755SZhangjin Wu * sp : argc <-- argument count, required by main() 3117336755SZhangjin Wu * argv: argv[0] <-- argument vector, required by main() 3217336755SZhangjin Wu * argv[1] 3317336755SZhangjin Wu * ... 3417336755SZhangjin Wu * argv[argc-1] 3517336755SZhangjin Wu * null 3617336755SZhangjin Wu * environ: environ[0] <-- environment variables, required by main() and getenv() 3717336755SZhangjin Wu * environ[1] 3817336755SZhangjin Wu * ... 3917336755SZhangjin Wu * null 4017336755SZhangjin Wu * _auxv: _auxv[0] <-- auxiliary vector, required by getauxval() 4117336755SZhangjin Wu * _auxv[1] 4217336755SZhangjin Wu * ... 4317336755SZhangjin Wu * null 4417336755SZhangjin Wu */ 4517336755SZhangjin Wu 4617336755SZhangjin Wu /* assign argc and argv */ 4717336755SZhangjin Wu argc = *sp; 4817336755SZhangjin Wu argv = (void *)(sp + 1); 4917336755SZhangjin Wu 5017336755SZhangjin Wu /* find environ */ 5117336755SZhangjin Wu environ = envp = argv + argc + 1; 5217336755SZhangjin Wu 5317336755SZhangjin Wu /* find _auxv */ 5417336755SZhangjin Wu for (auxv = (void *)envp; *auxv++;) 5517336755SZhangjin Wu ; 5617336755SZhangjin Wu _auxv = auxv; 5717336755SZhangjin Wu 5817336755SZhangjin Wu /* go to application */ 5917336755SZhangjin Wu exit(_nolibc_main(argc, argv, envp)); 6017336755SZhangjin Wu } 6117336755SZhangjin Wu 6217336755SZhangjin Wu #endif /* _NOLIBC_CRT_H */ 63