diff options
Diffstat (limited to 'libc/sysdeps/linux/m68k/crt0.S')
-rw-r--r-- | libc/sysdeps/linux/m68k/crt0.S | 40 |
1 files changed, 16 insertions, 24 deletions
diff --git a/libc/sysdeps/linux/m68k/crt0.S b/libc/sysdeps/linux/m68k/crt0.S index 1c64ea960..c2e8a6c60 100644 --- a/libc/sysdeps/linux/m68k/crt0.S +++ b/libc/sysdeps/linux/m68k/crt0.S @@ -17,10 +17,14 @@ License along with the GNU C Library; see the file COPYING.LIB. If not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +/* + * NOTE: this file works for PIC and non-PIC code. Be very careful how + * you modify it ! + */ .global _start .global __main .global _end -/* .global __data_start */ + .global _sdata .bss .global environ @@ -32,30 +36,22 @@ _start: /* renamed from __start */ nop nop - movea.l %d5, %a5 - - lea __bss_start(%a5), %a0 - lea end(%a5), %a1 - - /* Copy 0 to %a0 until %a0 == %a1 */ - /* - From my understanding of linux/fs/binfmt_flat.c for uClinux, - this is not necessary anymore. The loader will clear out - the BSS for us. - jgraves@deltamobile.com - -L1: - movel #0, %a0@+ - cmpal %a0, %a1 - bhi L1 - */ + movea.l %d5, %a5 /* uClinux passes in data segment here */ move.l 8(%sp), %d5 - move.l %d5, environ(%a5) + + lea.l _sdata, %a1 /* set environ to point to the right place */ + lea.l environ, %a0 + sub.l %a1, %a0 + move.l %d5, %a5@(%a0) - bsr main + lea main-.-8, %a0 /* call main */ + jsr %pc@(%a0) move.l %d0,%sp@- - bsr exit /* Invoke exit() routine */ + + lea exit-.-8, %a0 /* call the exit routine */ + jsr %pc@(%a0) #ifdef NO_LIBGCC /* If that didn't kill us, ... */ @@ -68,8 +64,4 @@ __main: rts #else - .global _cleanup -_cleanup: - rts /* nothing to clean up */ - #endif /* NO_LIBGCC */ |