SOLVED: なぜセグフォ?

最近現実逃避が捗りすぎて困っている.

最近は低レベルのコードとかよくわからないので勉強している(遊んでいるだけ).

このC言語ソースコードは, x86_64のLinuxなら動く環境があると思う.

const unsigned char main[] = { 72, 199, 192, 1, 0, 0, 0, 72, 199, 195, 1, 0, 0, 0, 72, 141, 53, 21, 0, 0, 0, 72, 199, 194, 21, 0, 0, 0, 15, 5, 72, 199, 192, 60, 0, 0, 0, 72, 49, 255, 15, 5, 97, 108, 119, 97, 121, 115, 32, 109, 105, 115, 115, 32, 116, 104, 101, 32, 109, 97, 114, 107, 10 };

Wandboxでは動作した: https://wandbox.org/permlink/KeSJ6KkTDQGUXc3z

しかし自分の環境(Arch Linux)ではセグフォで落ちてしまう. main()に入った瞬間に落ちているようだ.

$ gdb ./a.out 
GNU gdb (GDB) 8.2
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
...
(gdb) r
Starting program: /tmp/tmp.lX2FcrqB9C/a.out 

Program received signal SIGSEGV, Segmentation fault.
0x0000555555556020 in main ()
(gdb) disass 0x0000555555556020
Dump of assembler code for function main:
=> 0x0000555555556020 <+0>:     mov    $0x1,%rax
   0x0000555555556027 <+7>:     mov    $0x1,%rbx
...
End of assembler dump.
(gdb) 

なんもわからん.完全に理解した.

おそらくExec Shieldが働いている(?)のでコンパイル時に-z execstackを渡す必要がある.