diff options
| author | Bruce Evans <bde@FreeBSD.org> | 2002-09-29 13:42:27 +0000 |
|---|---|---|
| committer | Bruce Evans <bde@FreeBSD.org> | 2002-09-29 13:42:27 +0000 |
| commit | fb0be37ded386f4b7d01ac35f4173a819e40c784 (patch) | |
| tree | 703f7918e90169ebbb2d144a3a1b5157b2db85d1 /lib/csu/amd64 | |
| parent | 7698537b29b53458d8296bf3969cdeff9a6a0d14 (diff) | |
Notes
Diffstat (limited to 'lib/csu/amd64')
| -rw-r--r-- | lib/csu/amd64/crt1.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/lib/csu/amd64/crt1.c b/lib/csu/amd64/crt1.c index a9caf9e40dab3..43adc10e95151 100644 --- a/lib/csu/amd64/crt1.c +++ b/lib/csu/amd64/crt1.c @@ -100,7 +100,40 @@ _start(char *ap, ...) monstartup(&eprol, &etext); #endif _init(); +#ifndef __GNUC__ exit( main(argc, argv, env) ); +#else + /* + * Some versions of gcc-2 expect the stack frame to be aligned as + * follows after it is set up in main(): + * + * +--------------+ <--- aligned by PREFERRED_STACK_BOUNDARY + * +%ebp (if any) + + * +--------------+ + * |return address| + * +--------------+ + * | arguments | + * | : | + * | : | + * +--------------+ + * + * We implement the above to fix just the usual case in FreeBSD-4. + * Alignment for main() is too compiler-dependent to handle correctly + * in all cases here (or in the kernel). E.g., a different alignment + * is required for at least gcc-2.95.4 even for the small variation + * of compiling main() with -fomit-frame-pointer. + */ + __asm__(" + andl $~0xf, %%esp # align stack to 16-byte boundary + subl $12+12, %%esp # space for args and padding + movl %0, 0(%%esp) + movl %1, 4(%%esp) + movl %2, 8(%%esp) + call main + movl %%eax, 0(%%esp) + call exit + " : : "r" (argc), "r" (argv), "r" (env) : "ax", "cx", "dx", "memory"); +#endif } #ifdef GCRT |
