How does Linux start a process(iq.thc.org)
iq.thc.org
How does Linux start a process
https://iq.thc.org/how-does-linux-start-a-process
30 comments
A good walkthrough, but it doesn't mention how the ELF headers are interpreted and how the corresponding file sections (code, data, rodata) are mapped into the virtual address space of the process. It only covers the setup of the stack and the invocation of main.
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).
[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...
(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...
Any good resources to learn about that?
The source code to the kernel's elf "binfmt"[0] is very readable. The elf binfmt is registered (along with a few others like `binfmt_misc`) and you get dispatched there via `exec_binprm`[1] which is invoked by the `execve` syscall[2]. When loading a shared library, you also dispatch to a binfmt via the `uselib`[3] syscall.
[0] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[1] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[2] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[3] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[0] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[1] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[2] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
[3] https://github.com/torvalds/linux/blob/9fdfb15a3dbf818e06be5...
CPU Land is an accessible introduction. This chapter covers ELF https://cpu.land/becoming-an-elf-lord
The book "Linkers an Loaders" by Levine is the Bible on the subject
It used to be available online for free at <https://www.iecc.com/linker/>, but isn't any more.
You could get it from archive.org though, and I think I've seen mirrors in other formats on Hacker News in previous discussions about the book.
Yes; but there's also descriptions of legacy container formats no one cares about any more. I still recommend it and have my own copy, I just recall skipping over quite a bit of material.
There's a great summary from LWN[1] with lots of references and links to other articles for further reading.
[1] https://lwn.net/Articles/631631
[1] https://lwn.net/Articles/631631
If you're interested in or already comfortable with Rust, Amos (fasterthanlime) has a nice long-form series that goes into this, basically building a custom ELF loader in the end. The writing style isn't everyone's cup of tea, but maybe you like it: https://fasterthanli.me/series/making-our-own-executable-pac...
"man 5 elf" should be the ultimate source of truth :-)
the elf specification is:
https://refspecs.linuxfoundation.org/elf/elf.pdf
No reference to fork anywhere?
This could be deliberate. Either to not derail focus from `execve` or perhaps the author assumed that the readers are already well-versed with `fork`.
jklinger410(4)