-Quando un programma viene lanciato il kernel esegue un'opportuna routine di
-avvio, usando il programma \cmd{ld-linux.so}. Questo programma prima carica
-le librerie condivise che servono al programma, poi effettua il link dinamico
-del codice e alla fine lo esegue. Infatti, a meno di non aver specificato il
-flag \texttt{-static} durante la compilazione, tutti i programmi in Linux sono
-incompleti e necessitano di essere linkati alle librerie condivise quando
-vengono avviati. La procedura è controllata da alcune variabili di ambiente e
-dal contenuto di \file{/etc/ld.so.conf}. I dettagli sono riportati nella man
-page di \cmd{ld.so}.
-
-Il sistema fa partire qualunque programma chiamando la funzione \func{main};
-sta al programmatore chiamare così la funzione principale del programma da cui
-si suppone iniziare l'esecuzione; in ogni caso senza questa funzione lo stesso
-linker darebbe luogo ad errori.
-
-Lo standard ISO C specifica che la funzione \func{main} può non avere
-argomenti o prendere due argomenti che rappresentano gli argomenti passati da
-linea di comando, in sostanza un prototipo che va sempre bene è il seguente:
-\begin{lstlisting}[labelstep=0,frame=,indent=1cm]{}
- int main (int argc, char *argv[])
-\end{lstlisting}
-
-In realtà nei sistemi Unix esiste un'altro modo per definire la funzione
-\func{main}, che prevede la presenza di un terzo parametro, \var{char
- *envp[]}, che fornisce l'\textsl{ambiente} (vedi \secref{sec:proc_environ})
-del programma; questa forma però non è prevista dallo standard POSIX.1 per cui
-se si vogliono scrivere programmi portabili è meglio evitarla.
-
-
-\subsection{Come chiudere un programma}
-\label{sec:proc_conclusion}
-
-Normalmente un programma finisce quando la funzione \func{main} ritorna, una
-modalità equivalente di chiudere il programma è quella di chiamare
-direttamente la funzione \func{exit} (che viene comunque chiamata
-automaticamente quando \func{main} ritorna). Una forma alternativa è quella
-di chiamare direttamente la system call \func{\_exit}, che restituisce il
-controllo direttamente alla routine di conclusione dei processi del kernel.
-
-Oltre alla conclusione ``normale'' esiste anche la possibilità di una
-conclusione ``anomala'' del programma a causa della ricezione di un segnale
-(si veda \capref{cha:signals}) o della chiamata alla funzione \func{abort};
-torneremo su questo in \secref{sec:proc_termination}.
-
-Il valore di ritorno della funzione \func{main}, o quello usato nelle chiamate
-ad \func{exit} e \func{\_exit}, viene chiamato \textsl{stato di uscita} (o
-\textit{exit status}) e passato al processo che aveva lanciato il programma
-(in genere la shell). In generale si usa questo valore per fornire
-informazioni sulla riuscita o il fallimento del programma; l'informazione è
-necessariamente generica, ed il valore deve essere compreso fra 0 e 255.
-
-La convenzione in uso pressoché universale è quella di restituire 0 in caso di
-successo e 1 in caso di fallimento; l'unica eccezione è per i programmi che
-effettuano dei confronti (come \cmd{diff}), che usano 0 per indicare la
-corrispondenza, 1 per indicare la non corrispondenza e 2 per indicare
-l'incapacità di effettuare il confronto. È opportuno adottare una di queste
-convenzioni a seconda dei casi. Si tenga presente che se si raggiunge la fine
-della funzione \func{main} senza ritornare esplicitamente si ha un valore di
-uscita indefinito, è pertanto consigliabile di concludere sempre in maniera
-esplicita detta funzione.
+\itindbeg{link-loader}
+
+Quando un programma viene messo in esecuzione cosa che può essere fatta solo
+con una funzione della famiglia \func{exec} (vedi sez.~\ref{sec:proc_exec}) il
+kernel esegue un opportuno codice di avvio, il cosiddetto
+\textit{link-loader}, costituito dal programma \cmd{ld-linux.so}. Questo
+programma è una parte fondamentale del sistema il cui compito è quello della
+gestione delle cosiddette \textsl{librerie condivise}, quelle che nel mondo
+Windows sono chiamate DLL (\textit{Dinamic Link Library}), e che invece in un
+sistema unix-like vengono chiamate \textit{shared objects}.
+
+Infatti, a meno di non aver specificato il flag \texttt{-static} durante la
+compilazione, tutti i programmi in Linux sono compilati facendo riferimento a
+librerie condivise, in modo da evitare di duplicare lo stesso codice nei
+relativi eseguibili e consentire un uso più efficiente della memoria, dato che
+il codice di uno \itindex{shared~objects} \textit{shared objects} viene
+caricato in memoria dal kernel una sola volta per tutti i programmi che lo
+usano.
+
+Questo significa però che normalmente il codice di un programma è incompleto,
+contenendo solo i riferimenti alle funzioni di libreria che vuole utilizzare e
+non il relativo codice. Per questo motivo all'avvio del programma è necessario
+l'intervento del \textit{link-loader} il cui compito è
+caricare in memoria le librerie condivise eventualmente assenti, ed effettuare
+poi il collegamento dinamico del codice del programma alle funzioni di
+libreria da esso utilizzate prima di metterlo in esecuzione.
+
+Il funzionamento di \cmd{ld-linux.so} è controllato da alcune variabili di
+ambiente e dal contenuto del file \conffile{/etc/ld.so.conf}, che consentono
+di elencare le directory un cui cercare le librerie e determinare quali
+verranno utilizzate. In particolare con la variabile di ambiente
+\texttt{LD\_LIBRARY\_PATH} si possono indicare ulteriori directory rispetto a
+quelle di sistema in cui inserire versioni personali delle librerie che hanno
+la precedenza su quelle di sistema, mentre con la variabile di ambiente
+\texttt{LD\_PRELOAD} si può passare direttamente una lista di file di librerie
+condivise da usare al posto di quelli di sistema. In questo modo è possibile
+effettuare lo sviluppo o il test di nuove librerie senza dover sostituire
+quelle di sistema. Ulteriori dettagli sono riportati nella pagina di manuale
+di \cmd{ld.so} e per un approfondimento dell'argomento si può consultare
+sez.~3.1.2 di \cite{AGL}.
+
+Una volta completate le operazioni di inizializzazione di \cmd{ld-linux.so}, il
+sistema fa partire qualunque programma chiamando la funzione \func{main}. Sta
+al programmatore chiamare così la funzione principale del programma da cui si
+suppone che inizi l'esecuzione. In ogni caso senza questa funzione lo stesso
+\textit{link-loader} darebbe luogo ad errori. Lo standard ISO C specifica che
+la funzione \func{main} può non avere argomenti o prendere due argomenti che
+rappresentano gli argomenti passati da linea di comando (su cui torneremo in
+sez.~\ref{sec:proc_par_format}), in sostanza un prototipo che va sempre bene è
+il seguente:
+\includecodesnip{listati/main_def.c}
+
+\itindend{link-loader}
+
+In realtà nei sistemi Unix esiste un altro modo per definire la funzione
+\func{main}, che prevede la presenza di un terzo argomento, \code{char
+ *envp[]}, che fornisce l'\textsl{ambiente} del programma; questa forma però
+non è prevista dallo standard POSIX.1 per cui se si vogliono scrivere
+programmi portabili è meglio evitarla. Per accedere all'ambiente, come vedremo
+in sez.~\ref{sec:proc_environ} si usa in genere una variabile globale che
+viene sempre definita automaticamente.
+
+Ogni programma viene fatto partire mettendo in esecuzione il codice contenuto
+nella funzione \func{main}, ogni altra funzione usata dal programma, che sia
+ottenuta da una libreria condivisa, o che sia direttamente definita nel
+codice, dovrà essere invocata a partire dal codice di \func{main}. Nel caso di
+funzioni definite nel programma occorre tenere conto che, nel momento stesso
+in cui si usano le librerie di sistema (vale a dire la \acr{glibc}) alcuni
+nomi sono riservati e non possono essere utilizzati.
+
+In particolare sono riservati a priori e non possono essere mai ridefiniti in
+nessun caso i nomi di tutte le funzioni, le variabili, le macro di
+preprocessore, ed i tipi di dati previsti dallo standard ISO C. Lo stesso
+varrà per tutti i nomi definiti negli \textit{header file} che si sono
+esplicitamente inclusi nel programma (vedi sez.~\ref{sec:proc_syscall}), ma
+anche se è possibile riutilizzare nomi definiti in altri \textit{header file}
+la pratica è da evitare nella maniera più assoluta per non generare ambiguità.
+
+Oltre ai nomi delle funzioni di libreria sono poi riservati in maniera
+generica tutti i nomi di variabili o funzioni globali che iniziano con il
+carattere di sottolineato (``\texttt{\_}''), e qualunque nome che inizi con il
+doppio sottolineato (``\texttt{\_\_}'') o con il sottolineato seguito da
+lettera maiuscola. Questi identificativi infatti sono utilizzati per i nomi
+usati internamente in forma privata dalle librerie, ed evitandone l'uso si
+elimina il rischio di conflitti.
+
+Infine esiste una serie di classi di nomi che sono riservati per un loro
+eventuale uso futuro da parte degli standard ISO C e POSIX.1, questi in teoria
+possono essere usati senza problemi oggi, ma potrebbero dare un conflitto con
+una revisione futura di questi standard, per cui è comunque opportuno
+evitarli, in particolare questi sono:
+\begin{itemize*}
+\item i nomi che iniziano per ``\texttt{E}'' costituiti da lettere maiuscole e
+ numeri, che potrebbero essere utilizzati per nuovi codici di errore (vedi
+ sez.~\ref{sec:sys_errors}),
+\item i nomi che iniziano con ``\texttt{is}'' o ``\texttt{to}'' e costituiti
+ da lettere minuscole che potrebbero essere utilizzati da nuove funzioni per
+ il controllo e la conversione del tipo di caratteri,
+\item i nomi che iniziano con ``\texttt{LC\_}'' e costituiti
+ da lettere maiuscole che possono essere usato per macro attinenti la
+ localizzazione (vedi sez.~\ref{sec:proc_localization}),
+\item nomi che iniziano con ``\texttt{SIG}'' o ``\texttt{SIG\_}'' e costituiti
+ da lettere maiuscole che potrebbero essere usati per nuovi nomi di segnale
+ (vedi sez.~\ref{sec:sig_classification}),
+\item nomi che iniziano con ``\texttt{str}'', ``\texttt{mem}'', o
+ ``\texttt{wcs}'' e costituiti da lettere minuscole che possono essere
+ utilizzati per funzioni attinenti la manipolazione delle stringhe e delle
+ aree di memoria,
+\item nomi che terminano in ``\texttt{\_t}'' che potrebbero essere utilizzati
+ per la definizione di nuovi tipi di dati di sistema oltre quelli di
+ tab.~\ref{tab:intro_primitive_types}).
+\end{itemize*}