Linker MSVC může propojit soubory objektů (.obj) a knihovny objektů (.lib) a vytvořit tak .EXE nebo .DLL.
K propojení s knihovnou DLL je v MSVC procesem použití tzv. importní knihovny (.LIB), která funguje jako lepidlo mezi názvy funkcí C a exportní tabulkou DLL (v DLL lze funkci exportovat podle názvu nebo ordinálním – posledně jmenovaný byl často používán pro nezdokumentovaná API).
Ve většině případů však exportní tabulka DLL obsahuje všechny názvy funkcí, a proto importní knihovna (.LIB) obsahuje do značné míry redundantní informace ("funkce importu ABC -> exportovaná funkce ABC ", atd).
Je dokonce možné vygenerovat .LIB z existující .DLL.
Linkery na jiných platformách tuto „funkci“ nemají a mohou se přímo propojovat s dynamickými knihovnami.
V Linuxu linker (nikoli dynamický linker) prohledává sdílené knihovny zadané v době propojení a vytváří na ně odkazy uvnitř spustitelného souboru. Když dynamický linker načte tyto spustitelné soubory, načte sdílené knihovny, které potřebují, do paměti a rozloží symboly, což umožňuje spouštění binárních souborů.
MySo.a
, pokud by byl vytvořen, by ve skutečnosti obsahoval symboly, které mají být propojeny přímo do binárního souboru, namísto "tabulek pro vyhledávání symbolů" používaných ve Windows.
rustyxova odpověď vysvětluje proces ve Windows důkladněji, než mohu já; už je to dlouho, co jsem používal Windows.
Rozdíl, který vidíte, je spíše detail implementace - pod kapotou Linux i Windows fungují podobně - kód zavolá funkci stub, která je staticky propojena ve vašem spustitelném souboru a tento stub pak v případě potřeby načte DLL/shlib (v případě zpoždění načítání, jinak se knihovna načte při spuštění programu) a (při prvním volání) vyhodnotí symbol pomocí GetProcAddress
/dlsym
.
Jediný rozdíl je v tom, že v Linuxu jsou tyto stub funkce (které se nazývají PLT stub) generovány dynamicky když propojíte svou aplikaci s dynamickou knihovnou (knihovna obsahuje dostatek informací k jejich vygenerování), zatímco v systému Windows se místo toho vygenerují při vytvoření samotné knihovny DLL, v samostatném .lib
soubor.
Tyto dva přístupy jsou si tak podobné, že je skutečně možné napodobit knihovny importu Windows na Linuxu (viz projekt Implib.so).