mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 20:12:43 +00:00 
			
		
		
		
	 c74e4d0c80
			
		
	
	
		c74e4d0c80
		
	
	
	
	
		
			
			After some very confused debugging, I discovered that GNU make has a
main() function with this signature:
    int main(int argc, char** argv, char** envp)
Apparently this is a non-standard but widely supported thing, so let's
do the same in Serenity so make works as expected.
This fixes an issue where you had to do "make PATH=..." instead of make
just picking up PATH from the environment. :^)
		
	
			
		
			
				
	
	
		
			54 lines
		
	
	
	
		
			986 B
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			54 lines
		
	
	
	
		
			986 B
		
	
	
	
		
			C++
		
	
	
	
	
	
| #include <assert.h>
 | |
| #include <stdio.h>
 | |
| #include <stdlib.h>
 | |
| 
 | |
| extern "C" {
 | |
| 
 | |
| int main(int, char**, char**);
 | |
| 
 | |
| __thread int errno;
 | |
| char** environ;
 | |
| bool __environ_is_malloced;
 | |
| 
 | |
| void __libc_init()
 | |
| {
 | |
|     void __malloc_init();
 | |
|     __malloc_init();
 | |
| 
 | |
|     void __stdio_init();
 | |
|     __stdio_init();
 | |
| }
 | |
| 
 | |
| int _start(int argc, char** argv, char** env)
 | |
| {
 | |
|     environ = env;
 | |
|     __environ_is_malloced = false;
 | |
| 
 | |
|     __libc_init();
 | |
| 
 | |
|     extern void _init();
 | |
|     _init();
 | |
| 
 | |
|     extern void (*__init_array_start[])(int, char**, char**) __attribute__((visibility("hidden")));
 | |
|     extern void (*__init_array_end[])(int, char**, char**) __attribute__((visibility("hidden")));
 | |
| 
 | |
|     const size_t size = __init_array_end - __init_array_start;
 | |
|     for (size_t i = 0; i < size; i++)
 | |
|         (*__init_array_start[i])(argc, argv, env);
 | |
| 
 | |
|     int status = main(argc, argv, environ);
 | |
| 
 | |
|     exit(status);
 | |
| 
 | |
|     return 20150614;
 | |
| }
 | |
| 
 | |
| [[noreturn]] void __cxa_pure_virtual()
 | |
| {
 | |
|     ASSERT_NOT_REACHED();
 | |
| }
 | |
| 
 | |
| void __cxa_atexit()
 | |
| {
 | |
| }
 | |
| }
 |