| Hacking this stuff is so fun!! > Depending on your program, _start may be the only thing between the entrypoint and your main function I once developed a liblinux project entirely built around this idea. I wanted to get rid of libc and all of its initialization, complexity and global state. The C library is so complex it has a primitive form of package management built into it: https://blogs.oracle.com/solaris/post/init-and-fini-processi... So I made _start functions which did nothing but pass argc, argv, envp and auxv to the actual main function: https://github.com/matheusmoreira/liblinux/blob/master/start... https://github.com/matheusmoreira/liblinux/blob/master/start... You can get surprisingly far with just this, and it's actually possible to understand what's going on. Biggest pain point was the lack of C library utility functions like number/string conversion. I simply wrote my own. https://github.com/matheusmoreira/liblinux/tree/master/examp... Linux is the only operating system that lets us do this. In other systems, the C library is part of the kernel interface. Bypassing it like this can and does break things. Go developers once discovered this the hard way. https://www.matheusmoreira.com/articles/linux-system-calls The kernel has their own nolibc infrastructure now, no doubt much better than my project. https://github.com/torvalds/linux/tree/master/tools/include/... I encourage everyone to use it. Note also that _start is an arbitrary symbol. The name is not special at all. It's just some linker default. The ELF header contains a pointer to the entry point, not a symbol. Feel free to choose a nice name! |