2010-11-11 32 views
10

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].ocrtend[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?

+0

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

+0

@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? –

+0

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? –

Trả lời

6
gcc -wrapper sh,-c,'z= ; for i ; do [ "$z" ] || set -- ; z=1 ; 
    case "$i" in *crtbegin*.o|*crtend*.o) ;; *) set -- "[email protected]" "$i" ;; esac ; 
    done ; exec "$0" "[email protected]"' 
+1

ai đó có thể giải thích những gì đang xảy ra trong kịch bản trên? –

+0

@ 4aRkKn1gh7: Tùy chọn '-wrapper' nhận gcc để gọi các lệnh bên ngoài mà nó chạy qua chương trình trình bao bọc. Chương trình trình bao bọc là một kịch bản lệnh vỏ mà làm giảm bất kỳ đối số nào khớp với '* crtbegin * .o' hoặc' * crtend * .o' trước khi gọi lệnh được yêu cầu. Nó chỉ được viết nội tuyến trên dòng lệnh thay vì lưu tập lệnh vào một tệp. –

3

Tôi nghĩ bạn cần tùy chọn -nostartfiles. Đó là những gì tôi cần cho mọi thứ nhúng.

+1

Đó là một khởi đầu tốt (không có ý định chơi chữ), nhưng nó cũng bỏ qua 'crt1.o' chứa điểm vào' _start'. –

+0

@R ..: Tôi chắc chắn bạn có thể thiết lập ENTRYPOINT trong tập lệnh trình liên kết. – leppie

+0

Vâng, tôi biết tôi có thể làm điều đó như thế, nhưng điều đó còn tồi tệ hơn nhiều so với việc tìm đường dẫn đến 'crt1.o' và sử dụng dòng lệnh' gcc' để liên kết. Về cơ bản tôi đang tìm kiếm điều gần nhất với một cách di động để có được gcc không liên kết trong những thứ không cần thiết, và câu trả lời dường như là không có gì. –

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