MFen 1.136 --> r49367

This commit is contained in:
Marc Fonvieille 2017-04-16 16:26:29 +00:00
parent ba7bffa519
commit 32515d9472
Notes: svn2git 2020-12-08 03:00:23 +00:00
svn path=/head/; revision=50172

View file

@ -4,10 +4,10 @@
The FreeBSD French Documentation Project
$FreeBSD$
Original revision: 1.136
Original revision: 49367
-->
<chapter xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink" version="5.0" xml:id="linuxemu">
<info><title>Compatibilité binaire avec Linux</title>
<info><title>Compatibilité binaire avec &linux;</title>
<authorgroup>
<author><personname><firstname>Jim</firstname><surname>Mock</surname></personname><contrib>Restructuré et en partie mis &agrave; jour
par </contrib></author>
@ -30,67 +30,46 @@
<secondary>Linux</secondary>
</indexterm>
<para>&os; fournit une compatibilité binaire avec plusieurs autres
systèmes d'exploitation du type &unix;, y compris Linux.
A ce point, vous devez vous demander pourquoi exactement
&os; a besoin d'être capable d'exécuter des binaires Linux?
La réponse &agrave; cette question est très simple. De
nombreuses entreprises et de nombreux développeurs ne
développent que pour Linux, puisque que c'est la dernière
chose &ldquo;&agrave; la mode&rdquo; dans le monde de l'informatique.
Cela ne laisse aux utilisateurs de &os; que la possibilité
de réclamer auprès des ces mêmes entreprises
et développeurs des versions native pour &os; de leurs
applications. Le problème est, que la plupart de ces
entreprises ne réalisent pas vraiment combien de personnes
utiliseraient leur produit si il y aurait une version pour &os;
également, et la plupart continuent de développer uniquement
pour Linux. Donc que doit faire un utilisateur de &os;?
C'est l&agrave; que la compatibilité binaire avec Linux entre en
scène.</para>
<para>En bref, la compatibilité permet aux utilisateurs de
&os; d'exécuter environ 90% des applications Linux
sans aucune modification. Cela inclus des applications
comme <application>&staroffice;</application>,
la version Linux de <application>&netscape;</application>,
<application>&adobe;&nbsp;&acrobat;</application>,
<application>&realplayer;</application>,
<application>VMware</application>,
<application>&oracle;</application>,
<application>&wordperfect;</application>, <application>Doom</application>,
<application>Quake</application>, et plus. On rapporte
<para>&os; fournit une compatibilité binaire avec &linux;,
permettant aux utilisateurs d'installer et d'exécuter la plupart
des applications &linux; sur un système &os; sans avoir à modifier
ces applications. On rapporte
également que dans certaines situations, les binaires Linux
sont plus performants sous &os; que sous Linux.</para>
sont plus performants sous &os; que sous &linux;,.</para>
<para>Il existe cependant certaines caractéristiques
spécifiques &agrave; Linux qui ne sont pas
supportées sous &os;. Les binaires Linux ne
spécifiques à &linux;, qui ne sont pas
supportées sous &os;. Par exemple, des binaires &linux; ne
fonctionneront pas sous &os; s'ils utilisent massivement
des appels
&i386; spécifiques, comme activation du mode virtuel
8086.</para>
<note>
<para>Le support de la compatibilité &linux; pour les binaires
64bits a été ajouté avec &os;&nbsp;10.3.</para>
</note>
<para>Après la lecture de ce chapitre, vous connaîtrez:</para>
<itemizedlist>
<listitem>
<para>Comment activer la compatibilité binaire avec
Linux sur votre système.</para>
&linux; sur un système &os;.</para>
</listitem>
<listitem>
<para>Comment installer des bibliothèques partagées Linux
<para>Comment installer des bibliothèques partagées &linux;
supplémentaires.</para>
</listitem>
<listitem>
<para>Comment installer des application Linux sur votre
<para>Comment installer des application &linux; sur un
système &os;.</para>
</listitem>
<listitem>
<para>Les détails de l'implémentation de la
compatibilité Linux sous &os;.</para>
compatibilité &linux; sous &os;.</para>
</listitem>
</itemizedlist>
@ -98,280 +77,208 @@
<itemizedlist>
<listitem>
<para>Savoir comment installer des logiciels tiers
(<xref linkend="ports"/>).</para>
<para>Savoir comment installer des <link
linkend="ports">logiciels tiers</link>.</para>
</listitem>
</itemizedlist>
</sect1>
<sect1 xml:id="linuxemu-lbc-install">
<title>Installation</title>
<title>Configurer la compatibilité binaire avec &linux;</title>
<indexterm><primary>KLD (kernel loadable object)</primary></indexterm>
<indexterm><primary>Catalogue des logiciels portés</primary></indexterm>
<para>La compatibilité binaire avec Linux n'est pas
activée par défaut. La manière la plus simple
pour activer cette fonctionnalité est de charger le KLD
<literal>linux</literal> (<quote>Kernel LoaDable
object</quote>&mdash;objet chargeable par le noyau, ce que l'on
nomme couramment un module). Vous pouvez charger ce module
en tapant ce qui suit sous l'utilisateur
<systemitem class="username">root</systemitem>:</para>
<para>Par défaut, les bibliothèques &linux; ne sont pas installées
et la compatibilité binaire avec Linux n'est pas activée. Les
bibliothèques &linux; peuvent être installées soit manuellement
soit à partir du catalogue des logiciels portés.</para>
<para>Avant de tenter de compiler un logiciel, charger le module
du noyau &linux;, sinon la compilation risque d'échouer:</para>
<screen>&prompt.root; <userinput>kldload linux</userinput></screen>
<para>Si vous désirez que la compatibilité Linux soit
toujours activée, alors vous devrez ajouter la ligne
suivante au fichier <filename>/etc/rc.conf</filename>:</para>
<para>Pour une compatibilité en 64bits:</para>
<screen>&prompt.root; <userinput>kldload linux64</userinput></screen>
<para>Pour vérifier que le module est bien chargé:</para>
<screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.ko</screen>
<para>Le logiciel précompilé
<package>emulators/linux_base-c6</package> ou la version
compilée à partir du catalogue des logiciels portés est la
méthode la plus simple pour installer l'ensemble des
bibliothèques et binaires de base &linux; sur un système
&os;.</para>
<screen>&prompt.root; <userinput>printf "compat.linux.osrelease=2.6.18\n" >> /etc/sysctl.conf</userinput>
&prompt.root; <userinput>sysctl compat.linux.osrelease=2.6.18</userinput>
&prompt.root; <userinput>pkg install emulators/linux_base-c6</userinput></screen>
<para>Pour activer au démarrage la compatibilité &linux;, ajouter
ligne suivante au fichier
<filename>/etc/rc.conf</filename>:</para>
<programlisting>linux_enable="YES"</programlisting>
<para>La commande &man.kldstat.8; peut être utilisée
pour vérifier que le KLD est chargé:</para>
<screen>&prompt.user; <userinput>kldstat</userinput>
Id Refs Address Size Name
1 2 0xc0100000 16bdb8 kernel
7 1 0xc24db000 d000 linux.ko</screen>
<para>Sur les machines 64bits, <filename>/etc/rc.d/abi</filename>
chargera automatiquement le module pour l'émulation
64bits.</para>
<indexterm>
<primary>options du noyau</primary>
<secondary>LINUX</secondary>
<secondary>COMPAT_LINUX</secondary>
</indexterm>
<para>Si pour quelques raisons vous ne voulez ou pouvez charger le
KLD, alors vous pouvez lier statiquement la compatibilité
binaire Linux dans votre noyau en ajoutant <literal>options
COMPAT_LINUX</literal> &agrave; votre fichier de configuration du noyau.
Puis installez votre noyau comme décrit dans la
<para>Les utilisateurs préférant lier statiquement la
compatibilité binaire &linux; dans leur noyau devront ajouter
<literal>options COMPAT_LINUX</literal> &agrave; leur fichier de
configuration du noyau. Puis compiler et installer le nouveau
noyau comme décrit dans la
<xref linkend="kernelconfig"/>.</para>
<sect2>
<title>Installer les bibliothèques Linux</title>
<sect2 xml:id="linuxemu-libs-manually">
<title>Installer des bibliothèques supplémentaires à la main</title>
<indexterm>
<primary>Linux</primary>
<secondary>installer les bibliothèques Linux</secondary>
<primary>bibliothèques partagées</primary>
</indexterm>
<para>Cela peut être fait de deux manières, soit
en utilisant le logiciel porté
<link linkend="linuxemu-libs-port">linux_base</link>, soit
en les installant <link linkend="linuxemu-libs-manually">&agrave; la main</link>.</para>
<para>Si une application &linux; se plaint de l'absence d'une
bibliothèque partagée après avoir configuré la compatibilité
binaire &linux;, déterminez quelle est la bibliothèque
partagée nécessaire au binaire &linux; et installez-la à la
main.</para>
<sect3 xml:id="linuxemu-libs-port">
<title>Installation &agrave; l'aide du logiciel porté
linux_base</title>
<indexterm><primary>catalogue des logiciels
portés</primary></indexterm>
<para>A partir d'un système &linux;, la commande
<command>ldd</command> peut être utilisée pour déterminer
quelles sont les bibliothèques partagées dont l'application a
besoin. Par exemple, pour contrôler quelles bibliothèques
partagées sont nécessaires à <command>linuxdoom</command>,
exécuter cette commande à partir d'un système &linux; où est
installé <application>Doom</application>:</para>
<para>C'est de loin la méthode la plus simple pour
installer les bibliothèques. La procédure est
juste identique &agrave; l'installation d'un autre logiciel
porté &agrave; partir du
<link xlink:href="file://localhost/usr/ports/">catalogue
des logiciels portés</link>.
Faites ce qui suit:</para>
<screen>&prompt.root; <userinput>cd /usr/ports/emulators/linux_base-fc4</userinput>
&prompt.root; <userinput>make install distclean</userinput></screen>
<para>La compatibilité binaire Linux devrait maintenant
fonctionner. Certains programmes pourront se plaindre de
versions mineures incorrectes de certaines bibliothèques
systèmes. Cela semble, en général, ne pas
vraiment être un problème.</para>
<note><para>Il peut y avoir de multiples versions disponibles
du logiciel porté <package>emulators/linux_base</package>, correspondant
&agrave; différentes distributions et versions de Linux.
Vous devez installez la version la plus proche de ce que
nécessite les applications Linux que vous désirez
installer.</para></note>
</sect3>
<sect3 xml:id="linuxemu-libs-manually">
<title>Installer les bibliothèques &agrave; la main</title>
<para>Si vous n'avez pas le catalogue des logiciels
portés installé, vous pouvez &agrave; la
place installer les bibliothèques &agrave; la main.
Il vous faudra les bibliothèques partagées
Linux dont &agrave; besoin le programme et l'éditeur
de lien dynamiques. Vous devrez également
créer un répertoire racine
&ldquo;masquant&rdquo; (&ldquo;shadow root&rdquo;),
<filename>/compat/linux</filename>, pour les
bibliothèques Linux sur votre système &os;.
Toute bibliothèque partagée ouverte par les
programmes Linux exécutés sous &os; iront d'abord voir
dans cette arborescence. Ainsi, si un programme Linux
charge, par exemple, <filename>/lib/libc.so</filename>,
&os; essayera d'abord d'ouvrir
<filename>/compat/linux/lib/libc.so</filename>, puis si
cette bibliothèque n'existe pas,
<filename>/lib/libc.so</filename>. Les bibliothèques
partagées doivent donc être installées
sous l'arborescence <filename>/compat/linux/lib</filename>
plutôt que sous les chemins d'accès
mentionnés par la commande Linux
<command>ld.so</command>.</para>
<para>Généralement, vous ne devrez cherchez &agrave;
savoir de quelles bibliothèques partagées
dépendent les binaires Linux que les premières
fois que vous installerez des programmes Linux sur votre
système &os;. Au bout d'un moment, vous disposerez
d'un jeu suffisant de bibliothèques partagées
Linux sur votre système pour être en mesure
d'exécuter les binaires Linux nouvellement
importés sans effort supplémentaire.</para>
</sect3>
<sect3>
<title>Comment installer des bibliothèques
partagées supplémentaires</title>
<indexterm><primary>bibliothèques
partagées</primary></indexterm>
<para>Que faire si vous avez installé le logiciel
porté <filename>linux_base</filename> et que votre
application se plaint toujours qu'il lui manque des
bibliothèques partagées?
Comment savoir quelles bibliothèques partagées
ont besoin les binaires Linux, et où se les
procurer? Il a habituellement deux possibilités
(pour suivre les instructions ci-dessous, vous devrez
être en session sous le compte super-utilisateur
<systemitem class="username">root</systemitem>).</para>
<para>Si vous avez accès &agrave; un système
Linux, déterminez de quelles bibliothèques
partagées l'application a besoin, et copiez-les sur
votre système &os;. Soit l'exemple suivant:</para>
<informalexample>
<para>Supposons que vous veniez de télécharger
le binaire Linux de <application>Doom</application>,
et que vous l'avez installé sur un système
Linux. Vous pouvez alors vérifier de quelles
bibliothèques partagées il a besoin pour
fonctionner avec la commande
<command>ldd linuxdoom</command>:</para>
<screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
<screen>&prompt.user; <userinput>ldd linuxdoom</userinput>
libXt.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libXt.so.3.1.0
libX11.so.3 (DLL Jump 3.1) =&gt; /usr/X11/lib/libX11.so.3.1.0
libc.so.4 (DLL Jump 4.5pl26) =&gt; /lib/libc.so.4.6.29</screen>
<indexterm><primary>liens symboliques</primary></indexterm>
<para>Vous devrez récupérer tous les
fichiers mentionnés dans la dernière colonne,
et les installer sous <filename>/compat/linux</filename>,
en utilisant les noms de la première colonne comme
liens symboliques qui pointent dessus. Cela signifie
que vous aurez éventuellement les fichiers suivants
sur votre système &os;:</para>
<indexterm>
<primary>liens symboliques</primary>
</indexterm>
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
<para>Ensuite, copier tous les fichiers mentionnés dans la
dernière colonne, du système sous &linux; vers
<filename>/compat/linux</filename> sur le système &os;. Une
fois copiés, créer les liens symboliques vers les noms de
fichiers donnés dans la première colonne. Cet exemple donnera
lieu aux fichiers suivants sur le système &os;:</para>
<screen>/compat/linux/usr/X11/lib/libXt.so.3.1.0
/compat/linux/usr/X11/lib/libXt.so.3 -&gt; libXt.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3.1.0
/compat/linux/usr/X11/lib/libX11.so.3 -&gt; libX11.so.3.1.0
/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
<blockquote>
<note>
<para>Remarquez que si vous avez déj&agrave;
une bibliothèque partagée de même
numéro de version majeure que celle indiquée
par la première colonne du résultat
de la commande <command>ldd</command>, il est inutile
de copier le fichier donné par la dernière
colonne sur votre système, celui que vous
avez déj&agrave; devrait suffire.
Il est cependant recommandé de recopier
malgré tout la bibliothèque partagée
si c'est une version récente.
Vous pouvez supprimer l'ancienne version, du moment
que le lien symbolique pointe sur la nouvelle. Par
exemple, si vous avez les bibliothèques suivantes
sur votre système:</para>
<para>Si une bibliothèque &linux; partagée existe avec le même
numéro de version majeure que celle indiquée par la première
colonne du résultat de la commande <command>ldd</command>, il
est inutile de la copier vers le nom de fichier donné par la
dernière colonne, la bibliothèque déjà existante devrait
fonctionner. Il est cependant recommandé de copier malgré
tout la bibliothèque partagée si c'est une version récente.
L'ancienne version peut être supprimée, du moment que le lien
symbolique pointe sur la nouvelle.</para>
<screen>/compat/linux/lib/libc.so.4.6.27
<para>Par exemple, les bibliothèques suivantes existent déjà sur
le système &os;:</para>
<screen>/compat/linux/lib/libc.so.4.6.27
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.27</screen>
<para>et que vous avez un nouveau binaire qui
d'après le résultat de la commande
<command>ldd</command> semble avoir besoin d'une
version plus récente:</para>
<para>et <command>ldd</command> indique qu'un binaire a besoin
d'une version plus récente:</para>
<screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
<para>Si vous n'avez qu'une ou deux versions de retard
sur le dernier indice, alors ne vous souciez pas
d'installer la version
<filename>/lib/libc.so.4.6.29</filename> plus
récente, parce que le programme devrait fonctionner
sans problème avec une version
légèrement antérieure.
Vous pouvez néanmoins décider de remplacer
<filename>libc.so</filename>, ce qui devrait vous
donner quelque chose comme:</para>
<screen>libc.so.4 (DLL Jump 4.5pl26) -&gt; libc.so.4.6.29</screen>
<screen>/compat/linux/lib/libc.so.4.6.29
<para>Etant donné que la bibliothèque existante n'a qu'une ou
deux versions de retard sur le dernier digit, le programme
devrait fonctionner avec la version légèrement plus ancienne.
Il est, néanmoins, plus sûr de remplacer la
<filename>libc.so</filename> existante avec la version plus
récente:</para>
<screen>/compat/linux/lib/libc.so.4.6.29
/compat/linux/lib/libc.so.4 -&gt; libc.so.4.6.29</screen>
</note>
</blockquote>
<blockquote>
<note>
<para>Le mécanisme de lien symbolique n'est
nécessaire que pour les binaires Linux.
L'éditeur de liens dynamiques de &os;
se charge lui-même de trouver les numéros
de versions majeures adéquats et vous
n'avez pas &agrave; vous en préoccuper.</para>
</note>
</blockquote>
</informalexample>
</sect3>
<para>Généralement, vous ne devrez cherchez à savoir de quelles
bibliothèques partagées dépendent les binaires &linux; que les
premières fois que vous installerez des programmes &linux; sur
le système &os;. Au bout d'un moment, il y aura un ensemble
suffisant de bibliothèques partagées &linux; sur le système
pour être en mesure d'exécuter les binaires &linux;
nouvellement importés sans effort supplémentaire.</para>
</sect2>
<sect2>
<title>Installer des binaires Linux ELF</title>
<title>Installer des binaires &linux; <acronym>ELF</acronym></title>
<indexterm>
<primary>Linux</primary>
<secondary>binaires ELF</secondary>
</indexterm>
<para>Une étape supplémentaire est parfois
nécessaire pour les binaires ELF: le
&ldquo;marquage&rdquo;. Si vous tentez d'exécuter un
binaire ELF non marqué, vous obtiendrez un message
d'erreur ressemblant &agrave; ce qui suit:</para>
nécessaire pour les binaires <acronym>ELF</acronym>. Quand
un binaire <acronym>ELF</acronym> non marqué est exécuté, une
erreur sera générée:</para>
<screen>&prompt.user; <userinput>./mon-binaire-elf-linux</userinput>
ELF binary type not known
Abort</screen>
<para>Pour que le noyau &os; puisse distinguer un binaire ELF
&os; d'un binaire Linux, vous devez employer l'utilitaire
&man.brandelf.1;:</para>
<para>Pour que le noyau &os; puisse distinguer un binaire
<acronym>ELF</acronym> &os; d'un binaire &linux;, vous devez
employer l'utilitaire &man.brandelf.1;:</para>
<screen>&prompt.user; <userinput>brandelf -t Linux mon-binaire-elf-linux</userinput></screen>
<indexterm><primary>outils GNU</primary></indexterm>
<para>Les outils GNU incorporent désormais automatiquement
les marques nécessaires dans les binaires ELF, vous
aurez donc de moins en moins besoin de passer par cette
étape &agrave; l'avenir.</para>
les marques nécessaires dans les binaires ELF,
cette étape n'est généralement pas nécessaire.</para>
</sect2>
<sect2>
<title>Installer une application &linux; basée sur
<acronym>RPM</acronym></title>
<para>Pour installer une application &linux; basée sur
<acronym>RPM</acronym>, installer en premier le logiciel
précompilé ou porté <package>archivers/rpm4</package>. Une
fois installé, <systemitem class="username">root</systemitem>
peut utiliser la commande suivante pour installer un
<filename>.rpm</filename>:</para>
<screen>&prompt.root; <userinput>cd /compat/linux</userinput>
&prompt.root; <userinput>rpm2cpio &lt; /path/to/linux.archive.rpm | cpio -id</userinput></screen>
<para>Si nécessaire, utiliser <command>brandelf</command> sur
les binaires <acronym>ELF</acronym> installés. Il faut noter
que cela empêchera une desinstallation propre.</para>
</sect2>
<sect2>
<title>Configurer le résolveur de noms de domaines</title>
<para>Si le DNS ne fonctionne pas, ou si vous avez les
messages:</para>
<para>Si le <acronym>DNS</acronym> ne fonctionne pas, ou si cette
erreur apparaît::</para>
<screen>resolv+: "bind" is an invalid keyword resolv+:
"hosts" is an invalid keyword</screen>
@ -383,19 +290,21 @@ Abort</screen>
<programlisting>order hosts, bind
multi on</programlisting>
<para>Où l'ordre ci-dessus spécifie qu'il faut tout
<para>Cela indique qu'il faut tout
d'abord regarder dans le fichier <filename>/etc/hosts</filename>
puis interroger le DNS. Quand le fichier
puis interroger le <acronym>DNS</acronym>. Quand le fichier
<filename>/compat/linux/etc/host.conf</filename> n'existe pas,
les applications Linux trouvent le fichier
<filename>/etc/host.conf</filename> de &os; et se plaignent de
les applications &linux; trouvent le fichier
<filename>/etc/host.conf</filename> et se plaignent de
sa syntaxe &os; incompatible. Supprimez
<literal>bind</literal> si vous n'avez pas configuré de
serveur de noms avec le fichier
<literal>bind</literal> si un serveur de noms n'est pas configuré
avec le fichier
<filename>/etc/resolv.conf</filename>.</para>
</sect2>
</sect1>
<?ignore
<sect1 xml:id="linuxemu-mathematica">
<info><title>Installer &mathematica;</title>
<authorgroup>
@ -3693,34 +3602,26 @@ options SHMMAXPGS=393216
</sect3>
</sect2>
</sect1>
?>
<sect1 xml:id="linuxemu-advanced">
<title>Sujets avancés</title>
<para>Si vous êtes curieux de savoir comment la
compatibilité binaire avec Linux fonctionne, cette
section est faite pour vous. La plupart de ce qui suit est
principalement basé sur un courrier électronique
<para>Cette section décrit comment la
compatibilité binaire avec &linux; fonctionne, et est basée
sur un courrier électronique
de Terry Lambert <email>tlambert@primenet.com</email>
envoyé &agrave; la &a.chat; (Message ID:
<literal>&lt;199906020108.SAA07001@usr09.primenet.com&gt;</literal>).</para>
<sect2>
<title>Comme ça marche?</title>
<indexterm><primary>chargeur de classe d'exécution</primary></indexterm>
<indexterm><primary>chargeur de classe
d'exécution</primary></indexterm>
<para>&os; possède une abstraction appelée
&ldquo;chargeur de classe d'exécution&rdquo;. C'est
une portion de l'appel système &man.execve.2;.</para>
<para>Ce qui se passe est que &os; dispose d'une liste de
chargeurs, &agrave; la place d'un simple chargeur avec retour
(&ldquo;fallback&rdquo;) vers le chargeur
<literal>#!</literal> pour exécuter n'importe quel
interpréteur de commandes ou procédure.</para>
<para>Historiquement, l'unique chargeur sur les plate-formes
<para>Historiquement, le chargeur
&unix; examinait le nombre magique (généralement
les 4 ou 8 premiers octets du fichier) pour voir si
c'était un binaire connu par le système, et si
@ -3730,46 +3631,41 @@ options SHMMAXPGS=393216
système, l'appel &man.execve.2; retournait un
échec, et l'interpréteur de commandes tentait de
l'exécuter comme une commande
d'interpréteur.</para>
<para>Cette hypothèse est celle par défaut quelque
soit l'interpréteur de commandes actuel.</para>
d'interpréteur. Cette hypothèse était celle par défaut
<quote>quelque soit l'interpréteur de commandes
actuel</quote>.</para>
<para>Plus tard, une modification a été faite sur
&man.sh.1; pour examiner les deux premiers caractères,
et s'ils étaient <literal>:\n</literal>, alors elle
invoquait l'interpréteur de commandes &man.csh.1;
&agrave; la place (nous pensons que l'entreprise SCO fut la
première &agrave; faire cette modification).</para>
à la place.</para>
<para>Ce que fait maintenant &os; est de parcourir une liste de
chargeurs, avec un chargeur <literal>#!</literal>
générique qui reconnaît les noms des
interpréteurs qui se trouvent après le
caractère espace suivant, puis avec un retour possible
vers <filename>/bin/sh</filename>.</para>
<indexterm><primary>ELF</primary></indexterm>
<para>&os; possède désormais une liste de chargeurs, avec un
chargeur par défaut, <literal>#!</literal>, pour exécuter les
interpréteurs ou les procédures de commandes.</para>
<para>Pour le support de l'ABI Linux, &os; voit le nombre
magique comme un binaire ELF (il ne fait pas la
différence &agrave; ce niveau entre &os;, &solaris;,
Linux, ou tout autre système d'exploitation qui dispose
d'un type d'image ELF).</para>
<indexterm><primary>Solaris</primary></indexterm>
<indexterm>
<primary>ELF</primary>
</indexterm>
<para>Le chargeur ELF recherche une <emphasis>marque</emphasis>
spécifique, qui se trouve dans une section de commentaire
<indexterm>
<primary>Solaris</primary>
</indexterm>
<para>Pour le support de l'<acronym>ABI</acronym> &linux;, &os;
voit le nombre magique comme un binaire ELF. Le chargeur ELF
recherche une <emphasis>marque</emphasis>
spécifique, qui se trouve dans une section de commentaires
dans l'image ELF, et qui n'est pas présente dans les
binaires SVR4/&solaris; ELF.</para>
<para>Pour que les binaires Linux puissent fonctionner, ils
<para>Pour que les binaires &linux; puissent fonctionner, ils
doivent être <emphasis>marqués</emphasis> sous le
type <literal>Linux</literal> avec &man.brandelf.1;:</para>
<screen>&prompt.root; <userinput>brandelf -t Linux file</userinput></screen>
<para>Quand cela est fait, le chargeur ELF verra le marquage
<literal>Linux</literal> sur le fichier.</para>
<indexterm>
<primary>ELF</primary>
<secondary>marquage</secondary>
@ -3778,7 +3674,7 @@ options SHMMAXPGS=393216
<para>Lorsque le chargeur ELF voit le marquage
<literal>Linux</literal>, le chargeur remplace un pointeur
dans la structure <literal>proc</literal>. Tous les appels
système sont indéxés par
système sont indexés par
l'intermédiaire de ce pointeur (dans un système
&unix; traditionnel, cela serait la structure
<literal>sysent[]</literal>, contenant les appels
@ -3787,9 +3683,9 @@ options SHMMAXPGS=393216
(&ldquo;trap&rdquo;) pour le signal de code
&ldquo;trampoline&rdquo;, et plusieurs autres corrections
(mineures) qui sont gérées par le noyau
Linux.</para>
&linux;.</para>
<para>Le vecteur d'appel système Linux contient, entre
<para>Le vecteur d'appel système &linux; contient, entre
autres, une liste des entrées
<literal>sysent[]</literal> dont les adresses résident
dans le noyau.</para>
@ -3798,76 +3694,52 @@ options SHMMAXPGS=393216
binaire Linux, le code &ldquo;trap&rdquo;
déréférence de la structure
<literal>proc</literal> le pointeur de la fonction de l'appel
système, et utilise les points d'entrée Linux,
système, et utilise les points d'entrée &linux;,
et non pas &os;, de d'appel système.</para>
<para>De plus, le mode Linux redéfinit dynamiquement
l'origine des requêtes; c'est, en effet, ce qu'effectue
l'option <option>union</option> (<emphasis>pas</emphasis> le
type de système de fichiers
<literal>unionfs</literal>!) de montage des systèmes de
<para>Le mode &linux; <emphasis>redéfinit dynamiquement</emphasis>
l'origine des requêtes. C'est, en effet, équivalent à
l'option <option>union</option> de montage des systèmes de
fichiers. Tout d'abord, une tentative est faite pour
rechercher le fichier dans le répertoire <filename>/compat/linux/chemin-origine</filename>,
<emphasis>puis</emphasis> uniquement si cela échoue, la
rechercher le fichier dans le répertoire <filename>/compat/linux/<replaceable>chemin-origine</replaceable></filename>.
Si cela échoue, la
recherche est effectuée dans le répertoire
<filename>/chemin-origine</filename>.
<filename>/<replaceable>chemin-origine</replaceable></filename>.
Cela permet de s'assurer que les binaires nécessitant
d'autres binaires puissent s'exécuter (par exemple,
l'ensemble des outils Linux peuvent tourner sous l'ABI Linux).
Cela signifie également que les binaires Linux peuvent
d'autres binaires puissent s'exécuter. Par exemple,
l'ensemble des outils &linux; peuvent tourner sous l'ABI &linux;.
Cela signifie également que les binaires &linux; peuvent
charger et exécuter les binaires &os;, s'il n'y a pas
de binaires Linux correspondant présents, et vous
de binaires &linux; correspondant présents, et vous
pourriez placer une commande &man.uname.1; dans l'arborescence
<filename>/compat/linux</filename> pour vous
assurer que les binaires Linux ne puissent pas dire qu'ils ne
tournent pas sous Linux.</para>
assurer que les binaires &linux; ne puissent pas dire qu'ils ne
tournent pas sous &linux;.</para>
<para>En effet, il y a un noyau Linux dans le noyau &os;; les
<para>En effet, il y a un noyau &linux; dans le noyau &os;. Les
diverses fonctions sous-jacentes qui implémentent tous
les services fournis par le noyau sont identiques entre les
deux tables d'entrées des appels systèmes &os;
et Linux: les opérations sur les systèmes de
et &linux;: les opérations sur les systèmes de
fichiers, les opérations sur la mémoire
virtuelle, la gestion des signaux, l'IPC System V, etc. La
virtuelle, la gestion des signaux, iet l'IPC System V. La
seule différence est que les binaires &os; utilisent
les fonctions <emphasis>glue</emphasis> de &os;, et les
binaires Linux celles de Linux (les plus anciens
systèmes d'exploitation avaient uniquement leurs
propres fonctions de <emphasis>glue</emphasis>: les adresses
des fonctions dans une structure <literal>sysent[]</literal>
statique globale, au lieu des adresses des fonctions
déréférencées d'un pointeur
initialisé dynamiquement pointant vers la structure
<literal>proc</literal> du processus faisant l'appel).</para>
<para>Laquelle est l'ABI native &os;? Cela n'a pas
d'importance. Basiquement, la seule différence est que
(actuellement, cela pourrait facilement changer dans les
versions futures, et probablement après cela) les
binaires &linux; celles de &linux;. Les
fonctions <emphasis>glue</emphasis> de &os; sont liées
en statique dans le noyau, les fonctions
<emphasis>glue</emphasis> Linux peuvent être
<emphasis>glue</emphasis> &linux; peuvent être
liées statiquement, ou l'on peut y accéder via
un module du noyau.</para>
<para>Oui, mais est-ce vraiment de l'émulation? Non.
C'est l'implémentation d'une interface binaire pour les
applications (ABI). Il n'y a pas d'émulateur (ou de
simulateur, pour couper court aux prochaines questions)
impliqué.</para>
<para>Mais pourquoi appelle-t-on parfois cela
&ldquo;émulation Linux&rdquo;? Pour rendre difficile
la vente des versions de &os;! Sérieusement, c'est
dû au fait que l'implémentation historique a
été faite &agrave; une époque où
il n'y avait pas vraiment d'autres mots pour décrire ce
qui était en développement; dire que &os;
exécutait les binaires Linux n'était pas vrai si
vous n'aviez pas compilé le code ou chargé un
module, aussi un terme était nécessaire pour
qualifier ce qui était chargé &mdash; donc
l'&ldquo;émulateur Linux&rdquo;.</para>
</sect2>
<para>Techniquement, ce n'est pas vraiment de l'émulation,
c'est l'implémentation d'une interface binaire pour les
applications (<acronym>ABI</acronym>). Cela est parfois
appelé <quote>émulation &linux;</quote> parce que
l'implémentation a été faite à une époque où il n'y avait pas
vraiment d'autres mots pour décrire ce qui était en
développement. Dire que &os; exécutait les binaires &linux;
n'était pas vrai, jusqu'à ce le code de support &linux; soit
compilé ou le module soit chargé.</para>
</sect1>
</chapter>