GNU/Linux >> Znalost Linux >  >> Linux

Statické linkování Linuxu je mrtvé?

Myslím, že je to velmi nepříjemné a myslím si, že je arogantní nazývat funkci „zbytečnou“, protože má problémy s řešením určitých případů použití. Největší problém s přístupem glibc je v tom, že napevno kóduje cesty k systémovým knihovnám (gconv i nss), a proto se porouchá, když se lidé pokusí spustit statickou binárku na jiné distribuci Linuxu, než pro kterou byl vytvořen.

Každopádně problém gconv můžete obejít nastavením GCONV_PATH tak, aby ukazoval na příslušné umístění, což mi umožnilo vzít binární soubory postavené na Ubuntu a spustit je na Red Hat.


Statické propojení je opět na vzestupu!

  • Linus Torvalds podporuje statické spojování a vyjádřil znepokojení nad množstvím statického spojování v distribucích Linuxu (viz také tato diskuze).
  • Mnoho (většina?) Jděte spustitelné soubory programovacího jazyka jsou staticky propojeny.
    • Lepší přenositelnost a zpětná kompatibilita je jedním z důvodů, proč jsou populární.
  • Jiné programovací jazyky mají podobné úsilí, aby bylo statické propojení opravdu snadné, například:
    • Haskell (Na tomto úsilí pracuji)
    • Zig (podrobnosti viz zde)
  • Konfigurovatelné distribuce Linuxu / sady balíčků jako NixOS / nixpkgs umožňují propojit velkou část jejich balíčků staticky (například jeho pkgsStatic sada balíčků může poskytovat všechny druhy staticky propojených spustitelných souborů).
  • Statické propojení může vést k lepšímu eliminaci nepoužívaného kódu v době propojení, čímž se zmenšují spustitelné soubory.
  • libcs ​​jako musl aby bylo statické propojení snadné a správné.
  • Některé velké softwarové odvětví na tom se lídři shodují. Google například píše novou knihovnu libc zaměřenou na statické propojení ("podpora statického non-PIE a statického-PIE linkování" , "v tuto chvíli nemáme v úmyslu investovat do [do] podpory dynamického načítání a propojování" ).

Pokud jde o tuto skutečnost, existuje nyní nějaký rozumný způsob, jak vytvořit plně funkční statické sestavení na Linuxu, nebo je statické linkování na Linuxu zcela mrtvé?

Nevím, kde najít historické odkazy, ale ano, statické spojování je na systémech GNU mrtvé. (Věřím, že zemřel během přechodu z libc4/libc5 na libc6/glibc 2.x.)

Tato funkce byla považována za nepoužitelnou ve světle:

  • Chyby zabezpečení. Aplikace, která byla staticky propojena, nepodporuje ani upgrade libc. Pokud byla aplikace propojena se systémem obsahujícím zranitelnost knihovny, bude zachována v rámci staticky propojeného spustitelného souboru.

  • Kód nafouklý. Pokud je na stejném systému spuštěno mnoho staticky propojených aplikací, standardní knihovny by nebyly znovu použity, protože každá aplikace obsahuje svou vlastní kopii všeho. (Zkuste du -sh /usr/lib abyste pochopili rozsah problému.)

Zkuste prohledat archivy LKML a glibc mail list z doby před 10-15 lety. Jsem si docela jistý, že už dávno jsem viděl něco souvisejícího s LKML.


Linux
  1. Jak změnit statický název hostitele na RHEL7 linux pomocí hostnamectl

  2. Jak nastavit statickou IP adresu a nakonfigurovat síť v Linuxu

  3. Propojení libc++ s projektem CMake na Linuxu

  1. Jak zacházet s dynamickými a statickými knihovnami v Linuxu

  2. Jak přidat novou statickou trasu na RHEL7 Linux

  3. Linuxový příkaz mv

  1. Nastavte statické síťové připojení v Linuxu

  2. propojení <iostream.h> v linuxu pomocí gcc

  3. Dynamické propojení – Linux vs. Okna