2010-03-12 33 views
15

Sau khi biên dịch của C++ file (với đối tượng tĩnh toàn cầu) tôi nhận được trong nm đầu ra chức năng này:g ++ __static_initialization_and_destruction_0 (int, int) - đó là những gì

00000000 t _Z41__static_initialization_and_destruction_0ii 

__static_initialization_and_destruction_0(int, int) /* after c++filt */ 

nó là gì? Nó sẽ gọi __cxa_atexit()

Tôi có thể vô hiệu hóa việc tạo chức năng này (và gọi __cxa_atexit()) và đặt tất cả lệnh gọi hàm và hàm hủy đến .ctors.dtors?

+2

g ++ có tùy chọn dòng lệnh '-fno-use-cxa-atexit' nhưng tôi không nghĩ điều đó sẽ hữu ích. Có vẻ như nó chỉ khiến 'atexit()' được sử dụng thay cho 'cxa_atexit()'. Có lẽ câu hỏi hay hơn là hỏi tại sao g ++ tạo '__static_initialization_and_destruction_0()' để bắt đầu thay vì đặt các hàm tạo và hủy trong các phần '.ctors' và' .dtors' ELF. Có lẽ có một lý do chính đáng cho nó. – Void

Trả lời

14

tập tin doc Điều này dường như tell ya tất cả các bạn muốn muốn biết về những chức năng: http://www.nsnam.org/docs/linker-problems.doc

Từ những gì tôi có thể grok, gcc tạo ra một __static_initialization_and_destruction_0 cho mỗi đơn vị dịch mà cần constructor tĩnh để được gọi. Sau đó, nó đặt __do_global_ctors_aux vào phần .ctors, sau đó gọi __static_initialization_and_destruction_0 trên mỗi đơn vị dịch.

Sự cố có vẻ phức tạp hơn nhiều so với mặc dù; gcc phải đối phó với các tệp đối tượng riêng lẻ trong một tệp lưu trữ và tôi nghĩ đây là cách chúng giữ cho trình liên kết tối ưu hóa các cuộc gọi đó.

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