2019-01-28 03:18:22 +00:00
|
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
|
|
|
|
extern int main(int argc, char* argv[]);
|
2019-03-06 15:26:20 +00:00
|
|
|
|
2019-01-28 03:18:22 +00:00
|
|
|
extern int __libc_start_main(int (*main)(int, char**),
|
|
|
|
int argc, char** argv,
|
|
|
|
void (*init)(void), void(*fini)(void),
|
|
|
|
void (*rtld_fini)(void),
|
|
|
|
void* stack) __attribute__((__noreturn__));
|
|
|
|
|
2019-01-30 23:14:36 +00:00
|
|
|
__attribute__((__externally_visible__, __section__(".text.startup._start"),
|
2019-03-06 15:26:20 +00:00
|
|
|
__noreturn__, __used__
|
|
|
|
#ifdef __x86_64__
|
|
|
|
, __naked__
|
|
|
|
#endif
|
|
|
|
))
|
2019-03-12 14:21:29 +00:00
|
|
|
int _start(void* stack
|
|
|
|
#ifdef USE_DL_FINI
|
|
|
|
, void (*dl_fini)(void)
|
|
|
|
#endif
|
|
|
|
) {
|
2019-01-30 23:14:36 +00:00
|
|
|
int argc=*(size_t*)stack;
|
|
|
|
char** argv=(void*)(&((size_t*)stack)[1]);
|
2019-01-28 03:18:22 +00:00
|
|
|
|
2019-03-06 15:26:20 +00:00
|
|
|
// avoid problems when -fno-plt is enabled
|
|
|
|
#ifdef __x86_64__
|
|
|
|
asm volatile("xor %%ecx, %%ecx\n"
|
|
|
|
"push %%rcx\n"
|
|
|
|
"push %%rcx\n"
|
|
|
|
"pop %%r8\n"
|
|
|
|
"pop %%r9\n"
|
2019-03-06 16:53:02 +00:00
|
|
|
"jmp *__libc_start_main@GOTPCREL(%%rip)\n"
|
2019-03-06 15:26:20 +00:00
|
|
|
:
|
|
|
|
:"S"(argc), "D" (main), "d" (argv)
|
|
|
|
:);
|
|
|
|
#else
|
2019-03-12 14:21:29 +00:00
|
|
|
__libc_start_main(main, argc, argv, NULL, NULL,
|
|
|
|
#ifdef USE_DL_FINI
|
|
|
|
dl_fini
|
|
|
|
#else
|
|
|
|
NULL
|
|
|
|
#endif
|
|
|
|
, (void*)stack);
|
2019-03-06 15:26:20 +00:00
|
|
|
#endif
|
2019-01-28 03:18:22 +00:00
|
|
|
|
|
|
|
__builtin_unreachable();
|
|
|
|
}
|
|
|
|
|