Чому glibc підтримується окремо від GCC?


13

GCC є компілятором C. Glibc - це бібліотека С. Однак, чи не абсолютна необхідність компілятора та стандартної бібліотеки, поєднаної разом як реалізація C?

Наприклад, бібліотека С містить ABI і конкретний компілятор такі речі , як <limits.h>, <stdint.h>і т.д., який відрізняється між укладачами і API. А деталі на кшталт "як викликати головну функцію" також залежать від компілятора, але насправді ці дані надаються libc.soв системі Linux. Наприклад, якщо я поміняю компілятор на роботу з іншим ABI, як, наприклад, використання intз 8 байтами, бібліотека C більше не працює, тому що в документі <limits.h>стане неправильним.

Відповіді:


20

Однією з причин є те, що GCC може бути побудована і використовуватися (наприклад , пропрієтарні Unix систем , таких як MacOSX, Solaris, HP - UX або деяких FreeBSD) систем , що мають свою власну C стандартну бібліотеку .

Навіть в Linux ви можете мати стандартну бібліотеку C, яка не є GNU Glibc . Зокрема, ви можете створювати GCC (або використовувати його) на системах Linux з musl-libc або з Bionic (системи Android) або з dietlibc тощо. А система Linux може мати GNU Glibc і використовувати інший компілятор C (наприклад, Clang або TinyCC).

Також бібліотека С сильно залежить від ядра Linux. Деякі старі версії ядра можуть потребувати певного виду (або версії)libc

І GCC будується як крос-компілятор .

Деталі на кшталт "як викликати mainфункцію" також залежать від компілятора, але насправді ці дані надаються libc.soв системі Linux.

Це не зовсім правильно. mainФункція викликається (в середовищі хоста) в crt0 речі, деякі з яких забезпечується GCC (наприклад , /usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.oна моєму Debian / Sid / x86-64 це з libgcc-6-devпакету). Читайте також проlibgcc

Насправді, існує деякий напівприхований зв’язок між libcGCC та, наприклад, тому що багато libcзаголовків (необов'язково) використовують деякі вбудовані gcc або функції атрибутів .

(отже, розробники GCC та розробники GNU libc повинні взаємодіяти)

.... якщо я зміню компілятор для роботи з іншим ABI ...

Вам потрібно ... /configureРСАДПЗ компілятор і відновити його, і ви , можливо , навіть потрібно пропатчити на GCC компілятора (описати ваше ABI і угоду про виклики ). X32 ABI є хорошим прикладом.

Нарешті, деякі дописувачі та керівники GCC (включаючи мене) підписали право на авторське право, яке стосується GCC, але не GNU glibc.

(щодо ліцензії GCC уважно читайте виняток бібліотеки для виконання програми GCC )

Зауважте, що деякі стандартні заголовки, на кшталт <limits.h>або <stdint.h>надані GCC; інші, як-от <stdlib.h>, "фіксуються" під час збирання GCC: процедура збирання компілятора бере їх від реалізації Libc та виправляє їх. Тим не менш, інші стандартні заголовки (ймовірно, <stdio.h>і внутрішні заголовки, до яких він входить), взяті з libc. Детальніше про GCC FIXINCLUDES та файли з фіксованими заголовками .

(виправленнявключає в себе те, що я (Базиль) все ще не добре розумію)

Ви можете компілювати, gcc -v -Hщоб більш точно зрозуміти, які саме програми виконуються (оскільки gccце драйвер, запускає cc1компілятор, ld& & collect2лінкери, asасемблер тощо) і які заголовки включені, які бібліотеки та файли об'єктів пов'язані (навіть неявно, включаючи стандартну бібліотеку C і crt0 ). Детальніше про варіанти GCC .

До речі, ви можете використовувати стандартну бібліотеку C, відмінну від тієї, яку очікує GCC або була створена для неї (наприклад, musl-libcабо якийсь дієтліб ), минаючи відповідні додаткові аргументи, щоб gcc...


1
Правильна відповідь, навіть якщо не правильна конструкція. Ось чому MSVC ++ може компілювати код C ++ 11 / C ++ 14 для операційних систем до 2011/2014 року, але GCC зазвичай не може.
MSalters

Що ви маєте на увазі під "не правильним дизайном"? І я не впевнений, що GCC не може скомпілювати код C ++ 14 для старих ОС (однак, можливо, вам знадобиться скомпілювати недавню GCC для цієї старої ОС).
Базиль Старинкевич

Відповідно до ISO C, Стандартна бібліотека C є частиною компілятора. Те саме стосується бібліотеки C ++. Тепер проблема полягає в тому, що додатки, побудовані з новою версією GCC, залежатимуть від glibc ОС, де вони вбудовані, яка може бути новішою, ніж glibc в цільовій системі. Краще рішення, мабуть, покладалося б на те, gcclibcщо базується на бібліотеках ОС, але воно є частиною GCC, а не ОС.
MSalters

Ви впевнені, що стандарти C11 або C ++ 14 згадують слово "компілятор"? В AFAIU вони говорять про "реалізацію" (яка може бути навіть не програмним забезпеченням)
Базиль Старинкевич

1
Деякі заголовки, на кшталт <stdint.h>або <limits.h>дійсно надаються GCC. Інші заголовки, як- <stdlib.h>от взяті з бібліотеки С та "виправлені" під час збирання GCC.
Василь Старинкевич

-5

Коротка відповідь полягає в тому, що якби вони були "об'єднані" разом, glibc отримав би ліцензію відповідно до GPL *, і це було б абсолютно непридатно для власних проектів. Хоча проект FSF та GNU не любить власне програмне забезпечення, glibc отримав ліцензію LGPL як стратегічний вибір для подальшого прийняття GCC та екосистеми вільного програмного забезпечення. GCC насправді ліцензується відповідно до GPL за винятком винятків, що пов'язують час виконання, оскільки ситуація дещо мутна. glibc ліцензується відповідно до LGPL для дозволу обгрунтованих ситуацій спільної бібліотеки.

https://www.gnu.org/licenses/gcc-exception-faq.html

Крім того, у glibc є всі види прокладки та інших компонентів, щоб адаптувати її до різних операційних систем, а також розповсюдження такого ж пакету, що і gcc, також зробить все безладним.

* Альтернативно, GCC може бути ліцензований за чимось іншим GPL, хоча думки FSF про це будуть узгоджуватися "над моїм мертвим тілом".


3
Вибачте, але ця відповідь неправильна. "Об'єднання в групи" не означає, що glibc отримує "похідну роботу" від GCC у тому сенсі, який описаний у GPL. Наприклад, тони програмних пакетів, що використовують різні ліцензії з відкритим кодом, "поєднуються" у кожному дистрибутиві Linux, проте ці пакети не порушують GPL.
Док Браун

Чому поєднання gcc та glibc разом змушує glibc бути під GPL? Я розумів, що пачки не є "комбінованою роботою", тому GPL не переходить межу. Редагуйте: що сказав Док Браун :-)
Філіп Кендалл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.