Shortest code to throw SIGILL
PDP-11 Assembler (UNIX Sixth Edition), 1 byte
9
Instruction 9 is not a valid instruction on the PDP-11 (in octal, it would be 000011
, which does not appear on the list of instructions (PDF)). The PDP-11 assembler that ships with UNIX Sixth Edition apparently echoes everything it doesn't understand into the file directly; in this case, 9 is a number, so it generates a literal instruction 9. It also has the odd property (unusual in assembly languages nowadays) that files start running from the start, so we don't need any declarations to make the program work.
You can test out the program using this emulator, although you'll have to fight with it somewhat to input the program.
Here's how things end up once you've figured out how to use the filesystem, the editor, the terminal, and similar things that you thought you already knew how to use:
% a.out
Illegal instruction -- Core dumped
I've confirmed with the documentation that this is a genuine SIGILL
signal (and it even had the same signal number, 4, all the way back then!)
C (x86_64, tcc), 7 bytes
main=6;
Inspired by this answer.
Try it online!
How it works
The generated assembly looks like this.
.globl main
main:
.long 6
Note that TCC doesn't place the defined "function" in a data segment.
After compilation, _start will point to main as usual. When the resulting program is executed, it expects code in main and finds the little-endian(!) 32-bit integer 6, which is encoded as 0x06 0x00 0x00 0x00. The first byte – 0x06 – is an invalid opcode, so the program terminates with SIGILL.
C (x86_64, gcc), 13 bytes
const main=6;
Try it online!
How it works
Without the const modifier, the generated assembly looks like this.
.globl main
.data
main:
.long 6
.section .note.GNU-stack,"",@progbits
GCC's linker treats the last line as a hint that the generated object does not require an executable stack. Since main is explicitly placed in a data section, the opcode it contains isn't executable, so the program terminates will SIGSEGV (segmentation fault).
Removing either the second or the last line will make the generated executable work as intended. The last line could be ignored with the compiler flag -zexecstack
(Try it online!), but this costs 12 bytes.
A shorter alternative is to declare main with the const modifier, resulting in the following assembly.
.globl main
.section .rodata
main:
.long 6
.section .note.GNU-stack,"",@progbits
This works without any compiler flags. Note that main=6;
would write the defined "function" in data, but the const modifier makes GCC write it in rodata instead, which (at least on my platform) is allowed to contain code.
Swift, 5 bytes
[][0]
Access index 0 of an empty array. This calls fatalError()
, which prints an error message and crashes with a SIGILL. You can try it here.