Annotation of dietlibc/dyn_start.c, revision 1.15
1.2 olaf 1: #include "dietfeatures.h"
2:
3: #ifdef WANT_DYNAMIC
1.11 leitner 4: #include <sys/cdefs.h>
1.1 olaf 5: #include <stdlib.h>
6:
1.11 leitner 7: struct object {
8: void *detail[7]; /* see gcc sources unwind-dw2-fde.h */
9: };
10:
11: extern void __register_frame_info (const void *, struct object *) __attribute__((weak));
12: extern void __deregister_frame_info (const void *) __attribute__((weak));
13:
14:
1.1 olaf 15: typedef void(*structor)(void);
16:
17: __attribute__((section(".ctors")))
1.14 leitner 18: __attribute__((aligned(sizeof(structor))))
1.11 leitner 19: __attribute_used
1.1 olaf 20: static structor __CTOR_LIST__[1]={((structor)-1)};
21:
22: __attribute__((section(".dtors")))
1.14 leitner 23: __attribute__((aligned(sizeof(structor))))
1.11 leitner 24: __attribute_used
1.1 olaf 25: static structor __DTOR_LIST__[1]={((structor)-1)};
26:
1.13 leitner 27: /* see gcc-3.4/gcc/crtstuff.c */
28: #if !defined(EH_FRAME_SECTION_CONST)
29: #if defined(__s390__) || defined(__x86_64__)
30: # define EH_FRAME_SECTION_CONST const
31: #endif
32: #endif
33: #if !defined(EH_FRAME_SECTION_CONST)
34: # define EH_FRAME_SECTION_CONST
35: #endif
36:
1.12 sanjiyan 37: __attribute__((section(".eh_frame")))
1.14 leitner 38: __attribute__((aligned(sizeof(structor))))
1.11 leitner 39: __attribute_used
1.13 leitner 40: EH_FRAME_SECTION_CONST char __EH_FRAME_BEGIN__[] = { };
1.11 leitner 41:
42:
1.1 olaf 43: static void __do_global_dtors_aux(void)
44: {
45: structor *df=__CTOR_LIST__; /* ugly trick to prevent warning */
46: for (df=((__DTOR_LIST__)+1);(*df) != (structor)0; df++) (*df)();
47: }
48:
1.7 olaf 49: void _fini(void) __attribute__((section(".fini")));
1.1 olaf 50: __attribute__((section(".fini"))) void _fini(void)
51: {
52: __do_global_dtors_aux();
1.11 leitner 53: if (__deregister_frame_info)
54: __deregister_frame_info(__EH_FRAME_BEGIN__);
1.1 olaf 55: }
56:
1.9 leitner 57: #ifdef WANT_STACKGAP
58: int stackgap(int argc,char* argv[],char* envp[]);
59: #endif
60:
1.6 olaf 61: #ifndef __DYN_LIB_SHARED
1.3 olaf 62: /* pre main, post _start */
1.11 leitner 63: extern __attribute__((section(".init"))) void _init(void);
1.10 leitner 64:
1.5 olaf 65: int _dyn_start(int argc, char **argv, char **envp, structor dl_init);
1.3 olaf 66: int _dyn_start(int argc, char **argv, char **envp, structor dl_init)
1.1 olaf 67: {
68: int main(int argc, char **argv, char **envp);
69:
1.15 ! sanjiyan 70: #ifndef __arm__
! 71: /* GT: segfaults on arm, don't know why (for now) */
1.11 leitner 72: void _dl_aux_init_from_envp(char **envp);
73: _dl_aux_init_from_envp(envp);
1.15 ! sanjiyan 74: #endif
1.11 leitner 75:
1.1 olaf 76: if (dl_init) atexit(dl_init);
77: _init();
78: atexit(_fini);
1.11 leitner 79:
80: if (__register_frame_info) {
81: static struct object ob;
82: __register_frame_info(__EH_FRAME_BEGIN__, &ob);
83: }
84:
1.8 sanjiyan 85: #ifdef WANT_STACKGAP
86: return stackgap(argc, argv, envp);
87: #else
1.1 olaf 88: return main(argc, argv, envp);
1.8 sanjiyan 89: #endif
1.1 olaf 90: }
1.6 olaf 91: #endif
1.2 olaf 92: #endif
LinuxTV legacy CVS <linuxtv.org/cvs>