They say that main() is a function like any other function, but “marked” as an entry point inside the binary, an entry point that the operating system may find (Don’t know how) and start the program from there. So, I’m trying to find out more about this function. What have I done? I created a simple .C file with this code inside:
int main(int argc, char **argv) {
return (0);
}
I saved the file, installed the GCC compiler (in Windows, MingW environment) and created a batch file like this:
gcc -c test.c -nostartfiles -nodefaultlibs -nostdlib -nostdinc -o test.o
gcc -o test.exe -nostartfiles -nodefaultlibs -nostdlib -nostdinc -s -O2 test.o
@%comspec%
I did this to obtain a very simplistic compiler and linker, no library, no header, just the compiler. So, the compiling goes well but the linking stops with this error:
test.c:(.text+0xa): undefined reference to '___main'
collect2.exe: error: Id returned 1 exit status
I thought that the main function is exported by the linker but I believed that you didn’t need any library with additional information about it. But it looks like it does. In my case I supposed that it must be the standard GCC library, so I downloaded the source code of it and opened this file: libgcc2.c
Now, I don’t know if that is the file where the main function is constructed to be linked by GCC. In fact, I don’t understand how the main function is used by GCC. Why does the linker need the gcc standard libraries? To know what about main? I hope this has made my question quite specific and clear. Thanks!
When gcc puts together all object files (test.o) and libraries to form a binary it also prepends a small object (usually crt0.o or crt1.o), which is responsible for calling your
main(). You can see what gcc is doing, when you add-von the command line:crt0/crt1 does some setup and then calls into main. But the linker is finally responsible for building the executable according to the OS. With
-vyou can see also an option for the target system. In my case it’s for Linux 64 bit:-m elf_x86_64. For your system this will be something like-m windowsor-m mingw.