So, compiling an executable file in GCC consists of 4 parts:
1.) Preprocessing (gcc -E main.c> main.i; converts * .c to * .i) Enables extension, processes marcos. Deletes comments.
2.) Compilation (gcc -S main.i; converts * .i to * .s if successful) Compiles the C code for the assembler (on the target x86 architecture it is the x86 assembly, on the target x86_64 architecture it is the x64 assembly on target hand architecture — hand assembly, etc.) Most warnings and errors occur during this part (for example, error and warning reports)
3.) Assembly (as main.s -o main.o; converts * .i to * .o, again if successful) Assemblies generate assembler for machine code. Although there is still a relative address of the procedures, etc.
4.) Binding (gcc main.o) Replaces relative addresses with absolute addresses. Removes useless text. Binding errors and warnings at this point. And in the end (if successful) we get an executable file.
So, to answer your question, the intermediate conclusion that you have in mind is actually called assembly language - see the wiki about this assembler assembly language .
Zarakikenpachi
source share