GNU/Linux >> Linux Esercitazione >  >> Linux

Collegamento dinamico - Linux Vs. finestre

Il linker MSVC può collegare insieme file oggetto (.obj) e librerie di oggetti (.lib) per produrre un .EXE o un .DLL.

Per collegarsi a una DLL, il processo in MSVC consiste nell'utilizzare una cosiddetta libreria di importazione (.LIB) che funge da collante tra i nomi delle funzioni C e la tabella di esportazione della DLL (in una DLL una funzione può essere esportata per nome o per ordinale - quest'ultimo era spesso usato per le API non documentate).

Tuttavia, nella maggior parte dei casi la tabella di esportazione DLL ha tutti i nomi delle funzioni e quindi la libreria di importazione (.LIB) contiene informazioni in gran parte ridondanti ("funzione di importazione ABC -> funzione esportata ABC ", eccetera).
È anche possibile generare un .LIB da un .DLL esistente.

I linker su altre piattaforme non hanno questa "caratteristica" e possono collegarsi direttamente alle librerie dinamiche.


Su Linux, il linker (non il linker dinamico) cerca nelle librerie condivise specificate al momento del collegamento e crea riferimenti ad esse all'interno dell'eseguibile. Quando il linker dinamico carica questi eseguibili, carica in memoria le librerie condivise di cui hanno bisogno e risolve i simboli, il che consente l'esecuzione dei file binari.

MySo.a , se creato, includerebbe effettivamente i simboli da collegare direttamente nel file binario invece delle "tabelle di ricerca dei simboli" utilizzate su Windows.

la risposta di rustyx spiega il processo su Windows in modo più approfondito di me; è passato molto tempo dall'ultima volta che ho usato Windows.


La differenza che stai vedendo è più di un dettaglio di implementazione - sotto il cofano sia Linux che Windows funzionano in modo simile - il codice chiama una funzione stub che è collegata staticamente nel tuo eseguibile e questo stub quindi carica DLL/shlib se necessario (in caso di ritardo caricamento, altrimenti la libreria viene caricata all'avvio del programma) e (alla prima chiamata) risolve il simbolo tramite GetProcAddress /dlsym .

L'unica differenza è che su Linux queste funzioni stub (chiamate stub PLT) sono generate dinamicamente quando colleghi la tua app con la libreria dinamica (la libreria contiene informazioni sufficienti per generarli), mentre su Windows vengono invece generati quando viene creata la DLL stessa, in un .lib separato file.

I due approcci sono così simili che è effettivamente possibile imitare le librerie di importazione di Windows su Linux (vedi progetto Implib.so).


Linux
  1. 10 MOTIVI PER CAMBIARE WINDOWS 10 IN LINUX

  2. Linux:come disinstallare Grub?

  3. Hosting Linux vs Windows

  4. Utilizzando Windows DLL da Linux

  5. Possibile utilizzare un .dll su Linux

Come eseguire Windows 95 su Linux

Le migliori distribuzioni Linux alternative a Windows XP

Sfruttare un host Linux Windows 11 come amministratore IT

Installa Windows 10 su Linux con VirtualBox

Dovrei scegliere Linux Server o Windows?

Sicurezza Linux vs Windows