Gnu Assembler'daki (GAS) CFI direktifleri ne için kullanılır?


118

Görünüşe göre her satırdan sonra bir .CFI yönergesi var ve ayrıca bunların geniş çeşitlilikleri var .cfi_startproc, .cfi_endprocvb. Burada daha fazlası .

    .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

Bunların amacını anlamadım.


3
buradacfi talimatların açıklamasıGNU AS
Paschalis

ilgili: GCC / clang montaj çıktısından "gürültü" nasıl kaldırılır? direktifler olmadan sadece talimatları istiyorsanız. Güzel bir şekilde, çeşitli derleyicilerin (x86 olmayanlar dahil) çeşitli sürümlerinden güzel filtrelenmiş asm çıktısını görmek için kodunuzu gcc.godbolt.org'a koymak, kaynak satırlarını asm bloklarıyla eşleştirmek için renk vurgulamalı.
Peter Cordes

Yanıtlar:


70

Çağrı Çerçevesi Bilgisi anlamına geldiğini ve çağrı çerçevelerini yönetmek için bir GNU AS uzantısı olduğunu hissediyorum . Gönderen developerWorks :

Bazı mimarilerde, istisna işleme Çağrı Çerçevesi Bilgisi direktifleri ile yönetilmelidir. Bu yönergeler derlemede istisna işlemeyi yönlendirmek için kullanılır. Bu direktifler, herhangi bir nedenle (örneğin kod tabanının taşınabilirliği) GCC tarafından oluşturulan istisna işleme bilgileri yeterli değilse, POWER üzerinde Linux'ta kullanılabilir.

Bunlar, istisna işleme ihtiyacına bağlı olarak bazı platformlarda üretiliyor gibi görünüyor.

Bunları devre dışı bırakmak istiyorsanız, lütfen David'in cevabına bakın .


5
Ayrıca .LFB0, .LFB1, .LFE0, .LFE1
pençeler

@claws - Bunlar derleyici tarafından üretilen etiketlerdir (görebileceğiniz gibi :). Bkz stackoverflow.com/a/15285058/4294399
Calculuswhiz


30

CFI yönergeleri hata ayıklama için kullanılır. Hata ayıklayıcının bir yığını çözmesine izin verir. Örneğin: Prosedür A, daha sonra ortak bir C prosedürünü çağıran B prosedürünü çağırırsa C prosedürü başarısız olur. Şimdi C'yi kimin aradığını bilmek istiyorsunuz ve sonra B'yi kimin aradığını bilmek isteyebilirsiniz.

Bir hata ayıklayıcı, yığın işaretçisini (% rsp) kullanarak bu yığını çözebilir ve% rbp'yi kaydedebilir, ancak bunları nasıl bulacağını bilmesi gerekir. CFI direktiflerinin devreye girdiği yer burasıdır.

movq    %rsp, %rbp
.cfi_def_cfa_register 6

bu yüzden buradaki son satır, "Çağrı çerçevesi adresinin" şimdi kayıt 6'da (% rbp) olduğunu söyler


2
Ancak cfi'nin istisna işleme kullanımı, hata ayıklamadan daha sık olmalıdır.
osgx

6
Aslında CFA, "kanonik çerçeve adresi" anlamına gelir. Buraya bakın .
Cameron


1
CFI yönergeleri -fomit-frame-pointer, RBP'ye alternatif olarak (gcc veya clang -O1ve üstü ile varsayılan olarak açıktır) ile derlenen kod için bile yığın çözülmeye izin verir . C ++ istisna işleme ve hata ayıklayıcılar / profil oluşturucular tarafından kullanılır. Geleneksel RBP çerçeve işaretçilerine sahip kodda , mevcut RBP değeri her zaman kaydedilmiş bir RBP değerini işaret eder ve bu, önceki değeri işaret ederek bağlantılı bir liste oluşturur. Bu durumda CFI'ye gerek yoktur. (Çerçeve işaretçisi kullanan işlevlerde olmasına rağmen, CFI cfa_register, gösterdiğiniz gibi her RSP değişikliği için daha fazla meta veriye ihtiyaç duymaktan kaçınır.)
Peter Cordes

2

Bunları devre dışı bırakmak için, istisnaları kullanmamanız koşuluyla -fno-exceptions, daha önce belirtilenlerle birlikte g ++ gerekir -fno-asynchronous-unwind-tables.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.