Một trong những lý do là GCC có thể được xây dựng và sử dụng trên các hệ thống Unix độc quyền như MacOSX, Solaris, HPUX hoặc một số FreeBSD) có thư viện chuẩn C của riêng họ .
Ngay cả trên Linux, bạn có thể có một thư viện chuẩn C không phải là GNU Glibc . Cụ thể, bạn có thể xây dựng GCC (hoặc sử dụng nó) trên các hệ thống Linux bằng musl-libc hoặc với Bionic (hệ thống Android) hoặc với dietlibc , v.v. Và một hệ thống Linux có thể có GNU Glibc và sử dụng một số trình biên dịch C khác (như Clang hoặc TinyCC).
Ngoài ra, thư viện C phụ thuộc rất nhiều vào nhân Linux. Một số phiên bản cũ của kernel có thể yêu cầu một số loại (hoặc phiên bản) cụ thể củalibc
Và GCC có thể xây dựng như một trình biên dịch chéo .
Và các chi tiết như "cách gọi mainhàm" cũng phụ thuộc vào trình biên dịch, nhưng trên thực tế, những chi tiết đó được cung cấp bởi libc.sotrên một hệ thống Linux.
Điều đó không chính xác. Các mainhàm được gọi (trong một môi trường lưu trữ) bởi crt0 thứ, một số trong đó được cung cấp bởi GCC (ví dụ /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.otrên tôi Debian / Sid / x86-64 là từ libgcc-6-devgói). Đọc thêm vềlibgcc
Trên thực tế, có một số mối quan hệ nửa ẩn giữa libcvà GCC, ví dụ: vì nhiều libctiêu đề (tùy chọn) sử dụng một số nội dung gcc hoặc thuộc tính hàm .
(do đó, các nhà phát triển GCC và nhà phát triển libc GNU phải tương tác)
.... nếu tôi thay đổi trình biên dịch để hoạt động với ABI khác ...
Bạn sẽ cần ... /configuretrình biên dịch GCC và xây dựng lại nó, và thậm chí bạn có thể cần phải vá trình biên dịch GCC (để mô tả ABI của bạn và gọi các quy ước ). Các x32 ABI là một ví dụ điển hình.
Cuối cùng, một số người đóng góp cho hoặc người duy trì GCC (bao gồm cả tôi) đã ký một chuyển nhượng bản quyền bao gồm GCC nhưng không phải là GNUglibc .
(liên quan đến giấy phép GCC, đọc kỹ ngoại lệ thư viện thời gian chạy GCC )
Lưu ý rằng một số tiêu đề tiêu chuẩn, như <limits.h>hoặc <stdint.h>được cung cấp bởi GCC; một số khác, giống như <stdlib.h>được "sửa" trong quá trình xây dựng GCC: quy trình xây dựng trình biên dịch sẽ đưa chúng từ triển khai Libc và vá chúng. Tuy nhiên, các tiêu đề tiêu chuẩn khác (có thể <stdio.h>và các tiêu đề nội bộ mà nó bao gồm) được lấy từ libc. Đọc thêm về GCC FIXINCLUDES và các tệp tiêu đề cố định .
(điều cố định là điều tôi (Basile) vẫn chưa hiểu rõ)
Bạn có thể biên dịch gcc -v -Hđể hiểu chính xác hơn chương trình thực tế nào đang chạy (vì gcclà trình điều khiển, chạy cc1trình biên dịch, trình liên kết ld& trình biên dịch, trình biên dịch , v.v.) và các tiêu đề được bao gồm, thư viện và tệp đối tượng nào được liên kết (thậm chí ngầm, bao gồm thư viện chuẩn C và crt0 ). Tìm hiểu thêm về các tùy chọn GCCcollect2as .
BTW, bạn có thể sử dụng thư viện chuẩn C khác với thư viện mà GCC của bạn mong đợi hoặc được xây dựng cho (ví dụ musl-libchoặc một số chế độ ăn kiêng ), bỏ qua các đối số bổ sung thích hợp để gcc...