\documentclass{report}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{textcomp}
\usepackage{geometry}
\geometry{top=15mm, bottom=15mm, left=1cm, right=1cm}
\usepackage[french]{babel}
\usepackage{pslatex}
\usepackage[colorlinks=true,urlcolor=black]{hyperref}
\usepackage{graphicx}
\usepackage{fancyhdr}
\pagestyle{fancy}
\renewcommand{\footrulewidth}{0.4pt}
\fancyfoot[L]{Uubu.fr}
\fancyfoot[R]{sam. sept. 5 23:09:11 CEST 2015}
\lfoot{\Large \textit{Uubu.fr}}
\hypersetup{pdfinfo={
Title={ld.so},
Author={Sylvain Girod},
Creator={Bash script from uubu.fr's format version 1},
Producer={Bash script and PDFLaTeX},
Subject={loader/linker dynamique},
CreationDate={D:20150905230911},
ModDate={D:20150905230911},
Keywords={Linux;elf;librairies}
}}
\begin{document}
 
\begin{center}
{\Huge ld.so, ld-linux.so }
\end{center}
\vspace{1cm}
 
\begin{flushleft}
 
{\large loader/linker dynamique}
 
\vspace{10mm}
 
\hspace{1mm}  Le linker dynamique peut être lancé soit indirectement par un programme lié dynamiquement ou une librairie, ou directement en exécutant:
\vspace{5mm} \\
\hspace{1mm}  \textbf{/lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUMENTS]]}
\vspace{5mm} \\
 
 
\hspace{1mm}  les programmes ld.so et ld-linux.so* trouvent et chargent les librairie nécessaires à un programme, préparent le programme et le lance.
\vspace{5mm} \\
 
 
\hspace{1mm}  Les binaires linux nécessitent une liaison dynamique sauf si l'option -static a été donné à ld(1) durant la compilation.
\vspace{5mm} \\
 
 
\hspace{1mm}  Le programme ld.so manipule les binaires a.out, un format utilisé depuis longtemps, ld-linux.so* manipulent les formats ELF (/lib/ld-linux.so.1 pour libc5, /lib/ld-linux.so.2 pour glibc2), qui sont utilisés depuis de nombreuses années. Sinon, les 2 ont le même comportement, et utilisent les même fichiers et programmes ldd(1), ldconfig(8), et /etc/ld.so.conf
\vspace{5mm} \\
 
 
\hspace{1mm}  En résolvant les dépendances de librairies, le linker inspecte d'abord chaque chaîne de dépendance pour voir s'il contient un slash (cela se produit si un chemin de librairie contenant des '/' a été spécifié au moment du lien). Si un slash est trouvé, la chaîne de dépendance est interprété comme chemin (relatif ou absolu), et la librairie est chargée en utilisant ce chemin.
\vspace{5mm} \\
 
 
\hspace{1mm}  Si une dépendance de librairie ne contient pas de '/', elle recherché dans l'ordre suivant:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} -]{(ELF uniquement) Utiliser les répertoires spécifiés dans l'attribut de section dynamique DT\_RPATH du binaire si présent et que l'attribut DT\_RUNPATH n'existe pas. L'utilisation de DT\_RPATH est déprécié}
\item[\hspace{1mm} -]{Utilise la variable d'environnement LD\_LIBRARY\_PATH. Excepté si l'exécutable est un binaire set-user-ID/set-group-ID, auquel cas il est ignoré}
\item[\hspace{1mm} -]{(ELF uniquement) Utilise les répertoires spécifiés dans l'attribut de section dynamique DT\_RUNPATH du binaire si présent}
\item[\hspace{1mm} -]{depuis le fichier de cache /etc/ld.so.cache, qui contient une liste compilée de librairies candidat précédemment trouvé. Si, cependant, le binaire a été lié avec l'option du linker -z nodeflib, les librairies dans les chemins par défaut sont sautés.}
\item[\hspace{1mm} -]{Dans le chemin par défaut /lib, puis /usr/lib. Si le binaire a été lié avec -z nodeflib, cette étape est sauté}
\end{description}
 
\vspace{1cm}{\huge Expansion de token rpath }
 
\
 
\hspace{1mm}  ld.so comprend certaines chaîne dans une spécification rpath (DT\_RPATH ou DT\_RUNPATH); ces chaînes sont substituées comme suit:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} \$ORIGIN ou \$\{ORIGIN\}]{Étend au répertoire contenant l'exécutable de l'application. Donc, une application localisée dans somedir/app pourrait être compilé avec \textbf{gcc -Wl,-rpath,'\$ORIGIN/../lib'} pour qu'il trouve une librairie partagée dans somedir/lib peut importe où se trouve somedir.}
\item[\hspace{1mm} \$LIB ou \$\{LIB\}]{S'étends à lib ou lib64 en fonction de l'architecture.}
\item[\hspace{1mm} \$PLATFORM ou \$\{PLATFORM\}]{s'étends à la chaîne correspondant au type de processeur du système hôte (ex: X86\_64). Dans certaines architectures, le kernel linux ne fournis pas un telle chaîne.}
\end{description}
 
\vspace{1cm}{\huge OPTIONS }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} --list]{Liste toutes les dépendances et comment elles sont résolues}
\item[\hspace{1mm} --verify]{Vérifie que le programme est lié dynamiquement et que ce linker peut le gérer.}
\item[\hspace{1mm} --library-path PATH]{Utilise le PATH spécifié au lieu de la variable LD\_LIBRARY\_PATH}
\item[\hspace{1mm} --inhibit-rpath LIST]{Ignore les information RPATH et RUNPATH dans les noms d'objet dans LISTE.}
\item[\hspace{1mm} --audit LIST]{Utilise les objets nommés dans LIST comme auditeurs.}
\end{description}
 
\vspace{1cm}{\huge Capacités hardware }
 
\
 
\hspace{1mm}  Certaines librairies sont compilées en utilisant des instructions spécifiques au hardware qui n'existe pas sur tous les CPU. De telles librairies devraient être installée dans des répertoires dont le nom définis les capacités hardware, tel que /usr/lib/sse2/. Le linker dynamique vérifie ces répertoires avec le hardware de la machine et sélectionne la version la plus appropriée de la librairie donnée. Les répertoire de capacité hardware peuvent être hiérarchisés pour combiner les fonctionnalités CPU. La liste des noms de capacités hardware supportée dépend du CPU. Les noms suivant sont actuellement reconnus:
\vspace{5mm} \\
 
 
\begin{description} \normalsize
\item[\hspace{1mm} Alpha]{ev4, ev5, ev56, ev6, ev67}
\item[\hspace{1mm} MIPS]{loongson2e, loongson2f, octeon, octeon2}
\item[\hspace{1mm} PowerPC]{4xxmac, altivec, arch\_2\_05, arch\_2\_06, booke, cellbe, dfp, efpdouble, efpsingle, fpu, ic\_snoop, mmu, notb, pa6t, power4, power5, power5+, power6x, ppc32, ppc601, ppc64, smt, spe, ucache, vsx}
\item[\hspace{1mm} SPARC]{flush, muldiv, stbar, swap, ultra3, v9, v9v, v9v2}
\item[\hspace{1mm} s390]{dfp, eimm, esan3, etf3enh, g5, highgprs, hpage, ldisp, msa, stfle, z900, z990, z9-109, z10, zarch}
\item[\hspace{1mm} x86 (32-bit only)]{acpi, apic, clflush, cmov, cx8, dts, fxsr, ht, i386, i486, i586, i686, mca, mmx, mtrr, pat, pbe, pge, pn, pse36, sep, ss, sse, sse2, tm}
\end{description}
 
\vspace{1cm}{\huge Variables d'environnement }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} LD\_ASSUME\_KERNEL]{glibc >= 2.2.3. Force le linker dynamique à assumer qu'il fonctionne sur un système avec une version ABI kernel différent.}
\item[\hspace{1mm} LD\_BIND\_NOT]{glibc >=2.2. Ne met pas à jour le Global Offset Table et la Procedure Linkage Table en résolvant un symbole.}
\item[\hspace{1mm} LD\_BIND\_NOW]{glibc >=2.1.1. Si non vide, le linker dynamique résous tous les symboles au démarrage au lieu de déférer les appels de fonction au moment ou il sont référencé la première fois.}
\item[\hspace{1mm} LD\_LIBRARY\_PATH]{Liste de répertoire dans lequel rechercher les librairies ELF au moment de l'exécution. Ignoré pour les programmes set-user-ID et set-group-ID}
\item[\hspace{1mm} LD\_PRELOAD]{Une liste de librairies partagées ELF additionnels à charger avant toutes les autres.}
\item[\hspace{1mm} LD\_TRACE\_LOADED\_OBJECTS]{ELF uniquement. non vide, force le programme à lister ses dépendance comme lancé par ldd, au lieu de se lancer normalement}
\item[\hspace{1mm} LD\_AOUT\_LIBRARY\_PATH]{(libc5) Version de LD\_LIBRARY\_PATH pour les binaires a.out}
\item[\hspace{1mm} LD\_AOUT\_PRELOAD]{(libc5) Version de LD\_PRELOAD pour les binaires a.out}
\item[\hspace{1mm} LD\_AUDIT]{glibc >=2.4. Liste d'objets partagé à charger avec tous les autres dans un espace de nom de linker séparé.}
\item[\hspace{1mm} LD\_BIND\_NOT]{glibc >=2.1.95. ne met pas à jours GOT et PLT après avoir résolus un symbole}
\item[\hspace{1mm} LD\_DEBUG]{glibc >=2.1. Mode verbeux du linker dynamique. (all ou help).}
\item[\hspace{1mm} LD\_DEBUG\_OUTPUT]{glibc >=2.1. Fichier dans lequel écrit la sortie LD\_DEBUG (défaut: l'erreur standard)}
\item[\hspace{1mm} LD\_DYNAMIC\_WEAK]{glibc >=2.1.91. Autorise à écraser les symboles faibles (revenir à l'ancien comportement glibc)}
\item[\hspace{1mm} LD\_HWCAP\_MASK]{glibc >=2.1. Masque pour les capacités hardware.}
\item[\hspace{1mm} LD\_KEEPDIR]{(libc5). N'ignore pas le répertoire dans les noms des librairies a.out à charger.}
\item[\hspace{1mm} LD\_NOWARN]{(libc5).Supprime les alertes sur les librairie a.out avec des numéros de version mineur incompatible.}
\item[\hspace{1mm} LD\_ORIGIN\_PATH]{glibc >=2.1. Chemin œu le binaire est trouvé}
\item[\hspace{1mm} LD\_POINTER\_GUARD]{glibc >=2.4. À 0, désactive le pointer guarding, sinon l'active.}
\item[\hspace{1mm} LD\_PROFILE]{glibc >=2.1. Le nom d'un simple objet partagé à profiler.}
\item[\hspace{1mm} LD\_PROFILE\_OUTPUT]{glibc >=2.1. Répertoire où la sortie LD\_PROFILE doit être écrite.}
\item[\hspace{1mm} LD\_SHOW\_AUXV]{glibc >=2.1. Affiche un tableau auxiliaire passé par le kernel.}
\item[\hspace{1mm} LD\_USE\_LOAD\_BIAS]{Non définis, les exécutables et objets partagés pré-liés honorent les adresses de base de leur librairies et les PIE et autres objets partagé ne les honore pas. Si définis, tous les honorent. À 0 aucun de les honorent.}
\item[\hspace{1mm} LD\_VERBOSE]{glibc >=2.1. Si non vide, affiche les informations de versionning de symbole sur le programme si LD\_TRACE\_LOADED\_OBJECTS a été mis.}
\item[\hspace{1mm} LD\_WARN]{ELF, glibc >=2.1.3. non vide, alerte sur les symboles non-résolus}
\item[\hspace{1mm} LDD\_ARGV0]{libc5. argv[0] est utilisé par ldd quand aucun n'est présent.}
\end{description}
 
\vspace{1cm}{\huge Fichiers }
 
\
 
\begin{description} \normalsize
\item[\hspace{1mm} /lib/ld.so]{linker/loader dynamique a.out}
\item[\hspace{1mm} /lib/ld-linux.so.\{1,2\}]{linker/loader dynamique ELF}
\item[\hspace{1mm} /etc/ld.so.cache]{Fichier contenant une liste compilée de répertoires dans lesquels rechercher les librairies et une liste ordonnées de librairies candidates.}
\item[\hspace{1mm} /etc/ld.so.preload]{Fichier contenant une liste de librairies partagées ELF à charger avant le programme.}
\item[\hspace{1mm} lib*.so*]{Librairies partagées.}
\end{description}
\end{flushleft}
\end{document}
