Ngoài việc sử dụng -nostdlib
và tự liên kết crt1.o -lc -lgcc
, có cách nào dễ dàng để ngăn không cho gcc liên kết crtbegin[S].o
và crtend[S].o
không? Những tệp này không lớn, nhưng tôi đang chơi xung quanh với việc tạo các tệp nhị phân nhỏ và muốn loại bỏ mã hỗ trợ C++ vô ích không cần thiết cho các chương trình C. (Có lẽ, gcc liên kết chúng ngay cả đối với các chương trình C trong trường hợp bạn đang sử dụng một thư viện C++ với các biến đối tượng chung. Tôi sẽ dành tất cả mọi người về cách nó sẽ tạo ra các cuộc gọi khởi tạo một lần an toàn ở khắp mọi nơi đối tượng chung được tham chiếu trong Các mô-đun C++ thay vì khởi tạo các đối tượng toàn cầu trước main
...)Có cách nào dễ dàng để làm cho gcc bỏ qua crtbegin.o/crtend.o không?
Tôi sẽ không phản đối việc gacking tệp gcc specs
để liên kết các tệp hỗ trợ C++ có điều kiện trên các loại như vậy, nhưng tôi không chắc tôi sẽ làm thế nào. Có lẽ đã có một cách tốt đẹp?
Tôi tin rằng chúng cũng cần cho các hàm '__attribute__ ((constructor))' (và 'destructor'). (và tôi xa một chuyên gia C++, nhưng tôi đã nói rằng để tuân thủ các tiêu chuẩn, các nhà xây dựng toàn cầu phải xảy ra trước khi 'main()' được gọi.) – caf
@caf: Tôi đã ấn tượng rằng C++ tiêu chuẩn xác định rằng các hàm tạo được gọi tại thời điểm không xác định giữa lời gọi chương trình và lần đầu tiên đối tượng được sử dụng (và dĩ nhiên theo thứ tự không xác định, ngoài các trường hợp một đối tượng tham chiếu đến một đối tượng khác và do đó gọi "lần đầu tiên được sử dụng") . Bạn có một tham chiếu ngược lại? –
Có lẽ là "dạy dỗ trứng", nhưng bạn đã thử sử dụng 'gcc' để biên dịch và đi thẳng đến trình liên kết hệ thống của bạn (có lẽ là' ld') cho bước liên kết thực sự để bạn có quyền kiểm soát tốt hơn liên kết? –