Там , кажется, директива .CFI после каждой строки , а также есть широкий varities этих напр., .cfi_startproc
, И .cfi_endproc
т.д .. больше здесь .
.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
Я не понял цели этого.
cfi
инструкцииGNU AS
здесьОтветы:
У меня такое чувство, что это означает информацию о кадре вызова и является расширением GNU AS для управления кадрами вызова. Из DeveloperWorks :
Похоже, что они генерируются на некоторых платформах в зависимости от необходимости обработки исключений.
Если вы хотите отключить их, см . Ответ Дэвида .
источник
:
). См. Stackoverflow.com/a/15285058/4294399Чтобы отключить их, используйте опцию gcc
-fno-dwarf2-cfi-asm
может также понадобиться.источник
-fno-dwarf2-cfi-asm
может также понадобитьсяДирективы CFI используются для отладки. Это позволяет отладчику раскручивать стек. Например: если процедура A вызывает процедуру B, которая затем вызывает общую процедуру C. Процедура C не выполняется. Теперь вы хотите знать, кто на самом деле звонил C, а затем вы можете узнать, кто звонил B.
Отладчик может раскрутить этот стек, используя указатель стека (% rsp) и зарегистрировав% rbp, однако он должен знать, как их найти. Вот где вступают в силу директивы CFI.
поэтому последняя строка здесь сообщает, что "Адрес кадра вызова" теперь находится в регистре 6 (% rbp)
источник
-fomit-frame-pointer
, в качестве альтернативы RBP (которая по умолчанию включена с gcc или clang-O1
и выше). Он используется обработкой исключений C ++, а также отладчиками / профилировщиками. В коде с традиционными указателями кадров RBP текущее значение RBP всегда указывает на сохраненное значение RBP, а это указывает на предыдущее, формируя связанный список. В этом случае нет необходимости в CFI. (Хотя в функциях, которые используют указатель кадра, CFI cfa_register позволяет избежать необходимости в дополнительных метаданных для каждого изменения RSP, как вы показываете.)Чтобы отключить их, g ++ требуется
-fno-exceptions
наряду с ранее упомянутым-fno-asynchronous-unwind-tables
, при условии, что вы не используете исключения.источник