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 main
hà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.so
trên một hệ thống Linux.
Điều đó không chính xác. Các main
hà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.o
trên tôi Debian / Sid / x86-64 là từ libgcc-6-dev
gói). Đọc thêm vềlibgcc
Trên thực tế, có một số mối quan hệ nửa ẩn giữa libc
và GCC, ví dụ: vì nhiều libc
tiê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 ... /configure
trì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ì gcc
là trình điều khiển, chạy cc1
trì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 GCCcollect2
as
.
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-libc
hoặc một số chế độ ăn kiêng ), bỏ qua các đối số bổ sung thích hợp để gcc
...