On Wed, 13 Jan 2021, Fredrik Noring wrote: > Hi, > > Compiler used is GCC m68k-elf version 10.2.0. A variant of the classic > memset > > void *memset2(void *s, int c, unsigned int n) > { > char *b = s; > for (unsigned int i = 0; i < n; i++) > b[i] = c; > return s; > } > > compiles into boundless recursion with O2 optimisation and the m68k-elf > target. This will, of course, exhaust the stack and crash badly. > > The commands > > m68k-elf-gcc -O2 -march=68000 -c -o memset2.o memset2.c > m68k-elf-objdump -d memset2.o Please invoke objdump with -dr instead to see the relocations. > > produce > > 00000000 <memset2>: > 0: 2f02 movel %d2,%sp@- > 2: 242f 0008 movel %sp@(8),%d2 > 6: 202f 0010 movel %sp@(16),%d0 > a: 6718 beqs 24 <memset2+0x24> > c: 2f00 movel %d0,%sp@- > e: 102f 0013 moveb %sp@(19),%d0 > 12: 4880 extw %d0 > 14: 3040 moveaw %d0,%a0 > 16: 2f08 movel %a0,%sp@- > 18: 2f02 movel %d2,%sp@- > 1a: 4eb9 0000 0000 jsr 0 <memset2> /* <<<--- recursion */ The relocation associated with this instruction should point to memset. Most likely the compiler is optimizing your memset2 function to call the standard function 'memset'. When implementing memset itself you need to pass -ffreestanding to GCC, which will disable this optimization. Alexander