Risposte:
Senza diventare troppo tecnici: entrambi sono "linker", ovvero uno strumento che combina / carica un pezzo di codice compilato con / in un altro pezzo di codice compilato.
ld
è un linker statico, mentre ld.so
è un linker dinamico.
Le lettere so
sono, credo, abbreviazione di "oggetto condiviso", e di solito lo vedrai come un suffisso del nome file delle librerie condivise, cioè librerie che possono essere collegate dinamicamente ai programmi (una libreria è "condivisa" tra più programmi) . Al contrario, una libreria statica ha spesso il suffisso del nome file .a
, per "archivio" (creato ar
dall'utilità).
Un linker statico collega un programma o una libreria in fase di compilazione, in genere come ultimo passaggio del processo di compilazione, creando un eseguibile binario o una libreria. Nel caso di un file eseguibile binario, può essere un file binario statico con tutte le librerie caricate nel file binario stesso oppure può essere un file binario collegato dinamicamente con solo alcune librerie collegate staticamente.
Un linker dinamico carica le librerie che sono state collegate in modo dinamico in fase di compilazione nello spazio degli indirizzi del processo in fase di esecuzione.
Consulta i manuali per ld
e ld.so
sul tuo sistema.