What are CFI directives in Gnu Assembler (GAS) used for?

AssemblyCallstackGnu AssemblerStack UnwindingDebug Information

Assembly Problem Overview


There seem to be a .CFI directive after every line and also there are wide varities of these ex.,.cfi_startproc , .cfi_endproc etc.. more here.

	.file	"temp.c"
	.text
.globl main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	movq	%rsp, %rbp
	.cfi_offset 6, -16
	.cfi_def_cfa_register 6
	movl	$0, %eax
	leave
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
.globl func
	.type	func, @function
func:
.LFB1:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	movq	%rsp, %rbp
	.cfi_offset 6, -16
	.cfi_def_cfa_register 6
	movl	%edi, -4(%rbp)
	movl	%esi, %eax
	movb	%al, -8(%rbp)
	leave
	ret
	.cfi_endproc
.LFE1:
	.size	func, .-func
	.ident	"GCC: (Ubuntu 4.4.1-4ubuntu9) 4.4.1"
	.section	.note.GNU-stack,"",@progbits

I didn't get the purpose of these.

Assembly Solutions


Solution 1 - Assembly

To disable these, use the gcc option

-fno-asynchronous-unwind-tables

-fno-dwarf2-cfi-asm may be needed also.

Solution 2 - Assembly

I've got a feeling it stands for Call Frame Information and is a GNU AS extension to manage call frames. From DeveloperWorks:

> On some architectures, exception > handling must be managed with Call > Frame Information directives. These > directives are used in the assembly to > direct exception handling. These > directives are available on Linux on > POWER, if, for any reason (portability > of the code base, for example), the > GCC generated exception handling > information is not sufficient.

It looks like these are generated on some platforms depending on need for exception handling.

If you are looking to disable these, please see David's answer.

Solution 3 - Assembly

The CFI directives are used for debugging. It allows the debugger to unwind a stack. For example: if procedure A calls procedure B which then calls a common procedure C. Procedure C fails. You now want to know who actually called C and then you may want to know who called B.

A debugger can unwind this stack by using the stack pointer (%rsp) and register %rbp, however it needs to know how to find them. That is where the CFI directives come in.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

so the last line here tell it that the "Call frame address" is now in register 6 (%rbp)

Solution 4 - Assembly

To disable these, g++ needs -fno-exceptions along with the previously mentioned -fno-asynchronous-unwind-tables, provided that you don't use exceptions.

Solution 5 - Assembly

Well,it just stands for control flow integrity. They are essentially information items passed to debuggers and other tools to describe the intended flow of the program.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionclawsView Question on Stackoverflow
Solution 1 - AssemblyDavid WatsonView Answer on Stackoverflow
Solution 2 - Assemblyuser257111View Answer on Stackoverflow
Solution 3 - AssemblyGraham StottView Answer on Stackoverflow
Solution 4 - Assemblyiw4hView Answer on Stackoverflow
Solution 5 - AssemblykingkongView Answer on Stackoverflow