41 lines
1.5 KiB
C
41 lines
1.5 KiB
C
/// @file libc_start.c
|
|
/// @brief Contains the programs initialization procedure.
|
|
|
|
#include "sys/unistd.h"
|
|
#include "stdlib.h"
|
|
#include "string.h"
|
|
#include "assert.h"
|
|
#include "system/syscall_types.h"
|
|
#include "sys/errno.h"
|
|
|
|
/// @brief Reference to the `environ` variable in `setenv.c`.
|
|
extern char **environ;
|
|
|
|
/// @brief The entry point to every program.
|
|
/// @param main Pointer to the main function.
|
|
/// @param argc The number of arguments.
|
|
/// @param argv The pointer to the arguments.
|
|
/// @param envp The pointer to the environmental variables.
|
|
/// @return The return of the `main` function.
|
|
int __libc_start_main(int (*main)(int, char **, char **), int argc, char *argv[], char *envp[])
|
|
{
|
|
//dbg_print("== START %-30s =======================================\n", argv[0]);
|
|
//dbg_print("__libc_start_main(%p, %d, %p, %p)\n", main, argc, argv, envp);
|
|
assert(main && "There is no `main` function.");
|
|
assert(argv && "There is no `argv` array.");
|
|
assert(envp && "There is no `envp` array.");
|
|
//dbg_print("environ : %p\n", environ);
|
|
// Copy the environ.
|
|
environ = envp;
|
|
// Call the main function.
|
|
int result = main(argc, argv, envp);
|
|
// Free the environ.
|
|
//dbg_print("== END %-30s =======================================\n", argv[0]);
|
|
return result;
|
|
}
|
|
|
|
// WARNING: This declaration must be here, because libc_start is compiled
|
|
// with all the programs, and all the programs NEED to have the `sigreturn`
|
|
// symbol. It must be this way, period.
|
|
_syscall0(int, sigreturn)
|