| COP4610: Operating Systems & Concurrent Programming | up ↑ |
There will be times when you may want to look at the assembly language code that is generated by a compiler. This can be helpful in understanding whether code is likely to be safe for concurrent execution. On rare occasions when a program is failing for no apparent reason, it may also be helpful in determining whether the failure is due to a compiler defect that is causing incorrect machine code to be generated.
With the gcc compiler, you can obtain a listing of the assembly language generated by the compiler by using the -s option. For example, "gcc -c -S filename.c" will produce the assembly language code on file filename.s.
Suppose the file filename.c contained the following code:
int f (int n) {
if (n < 2) return n;
return f (n - 1) * n;
}
Compiling this with gcc -c -s filename.c on an Intel Pentium platform produced the following code:
.file "filename.c"
.version "01.01"
gcc2_compiled.:
.text
.align 4
.globl A
.type A,@function
A:
pushl %ebp
movl %esp, %ebp
movl $1, X
movl $1, %eax
.p2align 2
.L5:
testl %eax, %eax
jne .L5
popl %ebp
ret
.Lfe1:
.size A,.Lfe1-A
.comm X,4,4
.ident "GCC: (GNU) 2.96 20000731 (Red Hat Linux 7.1 2.96-81)"
There will be times when you want to see what the C preprocessor did, by way of macro expansions and header files. This is sometimes the only way to debug problems with macro definitions, and problems with #include and #ifdef directives.
With the gcc compiler, you can obtain a listing of the source code just after it has been preprocessed, (i.e. after all macros have been expanded, and after all #include and #ifdef directives have been processed, just as the code is ready to go to the compiler-proper. You do this you use the -E option. For example, "gcc -c -E filename.c > filename.lst" will produce the preprocessed code on the file filename.lst. You may then examine it with a text editor.
Suppose the file "filename.c" contains the following text:
#ifdef YY #define XXXX XX #else #define XXXX ZZZZZZZ #endif XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The output from gcc -E filename.c< would be as follows:
# 6 "testit.c" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ZZZZZZZ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
| T. P. Baker. ($Id) |