Для чого застосовуються директиви CFI у Gnu Assembler (GAS)?


118

Там , здається, директива .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

Я не зрозумів цілі цього.


3
опис cfiінструкцій GNU AS тут
Paschalis

пов'язані: Як видалити "шум" з виходу складання GCC / кланг? , якщо ви просто хочете інструкцій без директив. Приємним способом є нанесення коду на gcc.godbolt.org, щоб побачити приємний відфільтрований вихід ASM з різних версій різних компіляторів (включаючи non-x86), з кольоровим виділенням, щоб відповідати вихідним рядкам з блоками ASM.
Пітер Кордес

Відповіді:


70

У мене таке відчуття, що воно означає інформацію про кадр викликів і є розширенням GNU AS для управління кадрами викликів. Від DeveloperWorks :

У деяких архітектурах керування винятками має керуватися директивами Інформація щодо кадру Call Call. Ці директиви використовуються в зборах для прямого обліку виключень. Ці директиви доступні в Linux на POWER, якщо з будь-якої причини (наприклад, переносимість бази коду) інформація про обробку винятків, створена GCC, недостатня.

Схоже, вони створюються на деяких платформах, залежно від потреби в обробці виключень.

Якщо ви хочете відключити їх, перегляньте відповідь Девіда .


5
Також ви можете сказати слово про .LFB0, .LFB1, .LFE0, .LFE1
кігті

@claws - це мітки, створені компілятором (як видно з розділу :). Дивіться stackoverflow.com/a/15285058/4294399
Calculuswhiz

144

Щоб їх відключити, скористайтеся опцією gcc

-fno-asynchronous-unwind-tables

-fno-dwarf2-cfi-asm можуть знадобитися і.


12
-fno-dwarf2-cfi-asmможе знадобитися також
технозавр

Якщо ви відключили його для людського читаного виводу ASM, див. Як видалити "шум" з результатів складання GCC / clang? для інших корисних варіантів та хитрощів.
Пітер Кордес

30

Директиви CFI використовуються для налагодження. Це дозволяє налагоджувачу розмотувати стек. Наприклад: якщо процедура A викликає процедуру B, яка потім викликає загальну процедуру C. Процедура C не завершується. Тепер ви хочете знати, хто насправді називав C, а потім ви можете дізнатися, хто називав B.

Налагоджувач може розкрутити цей стек за допомогою покажчика стека (% rsp) та зареєструвати% rbp, однак він повинен знати, як їх знайти. Саме тут надходять директиви CFI.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

тому останній рядок тут говорить про те, що "адреса кадру виклику" зараз у регістрі 6 (% rbp)


2
Але, на мою думку, обробка винятків з використанням файлів cfi має бути частіше, ніж налагодження.
osgx

6
Насправді CFA означає "канонічну рамкову адресу". Дивіться тут .
Камерон


1
Директиви CFI дозволяють розмотати стек навіть для коду, складеного з -fomit-frame-pointer, як альтернатива RBP (яка за замовчуванням увімкнена gcc або clang -O1і вище). Він використовується для обробки винятків C ++, а також налагоджувачів / профілів. У коді з традиційними покажчиками кадру RBP поточне значення RBP завжди вказує на збережене значення RBP, і це вказує на попереднє, утворюючи пов'язаний список. У цьому випадку немає потреби в CFI. (Хоча у функціях, що використовують покажчик кадру, CFI cfa_register уникає необхідності більше метаданих для кожної зміни RSP, як ви показуєте.)
Пітер Кордес,

2

Щоб їх вимкнути, g ++ потребує -fno-exceptionsпоряд із вищезгаданими за -fno-asynchronous-unwind-tablesумови, що ви не використовуєте винятків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.