The first thing I thought of when I saw the article title here was “How programs get run”[1], a series on LWN; the second installment[2] describes the ELF parts of the story.
(The exposition in his two-parter “Anatomy of a system call”[3,4] is similarly brilliant.)
If all you want is a non-Linux-specific description of how to write a static ELF loader (which is surprisingly simple), you can also take a look at the description on the OSDev Wiki[5] (but be mindful of the somewhat uneven code quality on that website) and at Libelf by example[6] (but libelf may be a bit too much abstraction than you really need if you’re trying to understand the format itself).
(The exposition in his two-parter “Anatomy of a system call”[3,4] is similarly brilliant.)
If all you want is a non-Linux-specific description of how to write a static ELF loader (which is surprisingly simple), you can also take a look at the description on the OSDev Wiki[5] (but be mindful of the somewhat uneven code quality on that website) and at Libelf by example[6] (but libelf may be a bit too much abstraction than you really need if you’re trying to understand the format itself).
[1] https://lwn.net/Articles/630727/
[2] https://lwn.net/Articles/631631/
[3] https://lwn.net/Articles/604287/
[4] https://lwn.net/Articles/604515/
[5] https://wiki.osdev.org/ELF
[6] https://sourceforge.net/projects/elftoolchain/files/Document...