On Linux, executable files are encoded with DWARF information that tells the OS how to run the file.
This is not very accurate:
1) DWARF is used in other OS than Linux. Darwin also uses DWARF. gcc/clang on Windows also uses DWARF.
2) OS doesn't care about DWARF much. It's the debugger that cares. DWARF is something like a protocol between compiler and debugger (or some profiler/analyzer-thingy tools). Not OS. That's why you can use DWARF when compiling with gcc and debugging with gdb even on Windows!