Prečo je glibc udržiavaný oddelene od GCC

GCC je kompilátor C. Glibc je knižnica C. Nie je však úplne nevyhnutné, aby kompilátor a štandardná knižnica boli dodávané ako implementácia jazyka C.?

udržiavaný

Napríklad knižnica C obsahuje ABI a veci špecifické pre kompilátor

  • , atď., ktorý je medzi kompilátormi a API. A podrobnosti ako „ako zavolať hlavnú funkciu“ závisia aj od prekladača, ale tieto podrobnosti v skutočnosti poskytuje libc.so systému Linux. Napríklad, ak zmením kompilátor tak, aby pracoval s iným ABI, napríklad int s 8 bajtmi, knižnica C prestane fungovať, pretože dáta
  • sa mýlia.

    Jedným z dôvodov je, že GCC je možné vytvoriť a použiť v systémoch s ich vlastnou štandardnou knižnicou C (napr. Proprietárne systémy Unix ako MacOSX, Solaris, HPUX alebo niektoré systémy FreeBSD). .

    Aj v systéme Linux môžete mať štandardnú knižnicu C, ktorá nie je GNU Glibc. Najmä môžete vytvoriť (alebo použiť) GCC na systémoch Linux s musl-libc alebo s Bionic (systémy Android) alebo s dietlibc atď. Systém Linux môže mať GNU Glibc a používať iný kompilátor jazyka C (napríklad Clang alebo TinyCC).

    Okrem toho je knižnica C silne závislá na jadre Linuxu. Niektoré staré verzie jadra môžu vyžadovať určitý typ (alebo verziu) libc

    A podrobnosti ako „ako zavolať hlavnú funkciu“ závisia aj od prekladača, ale tieto podrobnosti v skutočnosti poskytuje libc.so systému Linux .

    Nie je to úplne správne. Hlavná funkcia sa volá (v hostenom prostredí) z obsahu crt0, z ktorých niektoré poskytuje GCC (napr. /Usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o v mojom Debiane/Sid/x86-64 je z balíka libgcc-6-dev). Prečítajte si tiež o libgcc

    V skutočnosti existuje čiastočne skrytý vzťah medzi libc a GCC, napr. B. pretože veľa hlavičiek libc (voliteľné) používa niektoré vstavané alebo funkčné atribúty GCC .

    (Preto vývojári GCC a vývojári GNU libc musia interagovať.)

    . keď zmením kompilátor na prácu s iným ABI .

    Musíte./configure nainštaluje a prebuduje kompilátor GCC a možno budete musieť patchovať kompilátor GCC (na opísanie vašich ABI a konvencií volaní). Dobrým príkladom je x32 ABI.

    Nakoniec niektorí prispievatelia alebo správcovia GCC (vrátane mňa) podpísali oznámenie o autorských právach, ktoré sa týka GCC, ale nie GNU glibc .

    (Pokiaľ ide o licenciu GCC, pozorne si prečítajte výnimku runtime knižnice GCC.)

    Upozorňujeme, že niektoré štandardné hlavičky, ako napr alebo poskytnuté GCC. iné, napríklad napríklad, sú „opravené“ počas vytvárania GCC: postup zostavovania kompilátora ich preberá z implementácie libc a opravuje ich. Ostatné štandardné hlavičky (pravdepodobne a interné hlavičky, ktoré obsahujú) pochádzajú z libc. Prečítajte si viac o GCC FIXINCLUDES a opravených hlavičkových súboroch .

    (Oprava spočíva v niečom, čomu ja (Basile) stále veľmi nerozumiem.)

    Dalo by sa skompilovať s gcc -v -H, aby ste lepšie pochopili, aké aktuálne programy bežia (pretože gcc je ovládač, ktorý spúšťa kompilátor cc1, linkery ld & collect2, ako assembler atď.) a ktoré hlavičky sú zahrnuté, ktoré knižnice a súbory objektov sú prepojené (momentálne) implicitne, vrátane štandardnej knižnice C a crt0). Viac informácií o možnostiach GCC .

    Mimochodom, môžete použiť štandardnú knižnicu C, ktorá sa líši od toho, čo vaša GCC očakáva alebo pre ktorú bola vytvorená (napr. Musl-libc alebo knižnica diét), pričom na vytvorenie gcc obídete príslušné ďalšie argumenty. .