.cfi GNU Assembler Directives

In Chapter 10, our first look at the assembly language generated by gcc included a lot of assembly directives that start with .cfi. I showed you the gcc command line options to eliminate these directives from the code so we could focus on the machine instructions. In case you’re curious, let’s look here at how these directives are used by the gdb debugger.

x86-64 Architecture

(gdb) l factorial
1       /* factorial.c
2        */
3       #include "factorial.h"
4
5       unsigned int factorial(unsigned int n)
6       {
7         unsigned int current = 1; /* assume base case */
8         if (n != 0)
9           current = n * factorial(n - 1);
10        return current;
(gdb) b 9
Breakpoint 1 at 0x11a5: file factorial.c, line 9.
(gdb) r
Starting program: /home/bob/GitHub/itco_x86-64/build/chapter_15/Text_Listings/factorial_C/threeFactorial 

Breakpoint 1, factorial (n=10) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) c
Continuing.

Breakpoint 1, factorial (n=9) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=8) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=7) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=6) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=5) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=4) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=3) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=2) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) 
Continuing.

Breakpoint 1, factorial (n=1) at factorial.c:9
9           current = n * factorial(n - 1);
(gdb) bt
#0  factorial (n=1) at factorial.c:9
#1  0x00005555555551b2 in factorial (n=2) at factorial.c:9
#2  0x00005555555551b2 in factorial (n=3) at factorial.c:9
#3  0x00005555555551b2 in factorial (n=4) at factorial.c:9
#4  0x00005555555551b2 in factorial (n=5) at factorial.c:9
#5  0x00005555555551b2 in factorial (n=6) at factorial.c:9
#6  0x00005555555551b2 in factorial (n=7) at factorial.c:9
#7  0x00005555555551b2 in factorial (n=8) at factorial.c:9
#8  0x00005555555551b2 in factorial (n=9) at factorial.c:9
#9  0x00005555555551b2 in factorial (n=10) at factorial.c:9
#10 0x0000555555555166 in main () at threeFactorial.c:11
(gdb)