2010-03-27 26 views
79

Dường như có một chỉ thị .CFI sau mỗi dòng và cũng có các biến thể rộng của các dòng này., .cfi_startproc, .cfi_endproc vv .. more here.Chỉ thị CFI trong Gnu Assembler (GAS) được sử dụng để làm gì?

.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 

Tôi không có được mục đích của chúng.

+2

mô tả của 'hướng dẫn cfi' của' GNU AS' [ở đây] (https://sourceware.org/binutils/docs-2.24/as/CFI-directives.html#CFI-directives) – Paschalis

+0

liên quan: [Làm thế nào để loại bỏ "tiếng ồn" khỏi đầu ra lắp ráp GCC/clang? ] (https://stackoverflow.com/questions/38552116/how-to-remove-noise-from-gcc-clang-assembly-output), nếu bạn chỉ muốn hướng dẫn mà không có chỉ thị. Cách tốt nhất là đặt mã của bạn lên http://gcc.godbolt.org/ để xem đầu ra asm được lọc tốt từ các phiên bản khác nhau của các trình biên dịch khác nhau (bao gồm cả non-x86), với đánh dấu màu để khớp với các dòng nguồn có khối asm. –

Trả lời

53

Tôi có cảm giác là viết tắt của Call Frame Information và là phần mở rộng GNU AS để quản lý khung cuộc gọi. Từ DeveloperWorks:

Trên một số kiến ​​trúc, ngoại lệ xử lý phải được quản lý với Call chỉ thị khung thông tin. Các chỉ thị này được sử dụng trong assembly để xử lý ngoại lệ trực tiếp . Các hướng dẫn này có sẵn trên Linux theo số POWER, nếu vì bất kỳ lý do nào (ví dụ: của cơ sở mã), GCC xử lý ngoại lệ được tạo ra thông tin là không đủ.

Dường như chúng được tạo trên một số nền tảng tùy thuộc vào nhu cầu xử lý ngoại lệ.

Nếu bạn đang tìm cách vô hiệu hóa những điều này, vui lòng xem David's answer.

+4

Bạn cũng có thể nói một từ về .LFB0, .LFB1, .LFE0, .LFE1 – claws

+10

.Lxx được mô tả [ở đây] (http://stackoverflow.com/questions/3564752). – ignis

122

Để vô hiệu hóa này, sử dụng tùy chọn gcc

-fno-asynchronous-unwind-tables 

Lưu ý, tôi biết đây là một chủ đề thực sự cũ, nhưng đây là kết quả hàng đầu trên google cho cfi_startproc, rất nhiều người có thể đến đây để vô hiệu hóa mà đầu ra.


-fno-dwarf2-cfi-asm cũng có thể cần thiết.

+1

Xin chào @David, đừng lo lắng về việc này là một câu hỏi cũ. Nếu bạn có câu trả lời hay hơn, hãy luôn luôn cung cấp câu trả lời trên SO.1 tất nhiên, và tôi đã thêm một ghi chú vào câu trả lời của tôi liên kết với của bạn nếu người tìm kiếm đang tìm cách vô hiệu hóa đầu ra này. –

+7

Bạn, thưa bạn, là một anh hùng. –

+8

'-fno-dwarf2-cfi-asm' có thể cần thiết cũng là – technosaurus

19

Chỉ thị CFI được sử dụng để gỡ lỗi. Nó cho phép trình gỡ lỗi giải phóng một chồng. Ví dụ: nếu thủ tục A gọi thủ tục B mà sau đó gọi một thủ tục phổ biến C. Thủ tục C thất bại. Bây giờ bạn muốn biết ai thực sự gọi là C và sau đó bạn có thể muốn biết ai được gọi là B.

Trình gỡ lỗi có thể giải phóng ngăn xếp này bằng cách sử dụng con trỏ ngăn xếp (% rsp) và đăng ký% rbp, tuy nhiên cần biết để tìm chúng. Đó là nơi mà các chỉ thị CFI đi vào.

movq %rsp, %rbp 
.cfi_def_cfa_register 6 

do đó, dòng cuối cùng ở đây nói với nó rằng "Call khung địa chỉ" bây giờ là trong sổ đăng ký 6 (% RBP)

+1

Nhưng việc sử dụng xử lý ngoại lệ của cfi nên thường xuyên hơn là gỡ lỗi, tôi nghĩ vậy. – osgx

+4

Thực tế CFA là viết tắt của "địa chỉ khung hình chuẩn". Xem [tại đây] (http://stackoverflow.com/a/7535848/21475). – Cameron

+0

- [Chỉ dẫn ImperialViolet - CFI trong các tệp lắp ráp] (https://www.imperialviolet.org/2017/01/18/cfi.html) –

Các vấn đề liên quan