ld - L'éditeur de liens GNU
SYNTAXE
ld [options] fichier_objet ...
DESCRIPTION
ld combine un certain nombre de fichiers objets et d'archives, relocalise leurs données et établit les liens entre les références de symboles. Habituellement, la dernière étape de la compilation d'un programme consiste à exécuter ld.
ld accepte des fichiers du langage de commande de l'éditeur de liens, écrits dans un sur-ensemble de la syntaxe du langage de commande de l'éditeur de liens AT&T, afin de fournir un contrôle explicite et total sur le processus d'édition de liens.
Cette page de manuel ne décrit pas le langage de commande ; voir l'entrée ld dans "info" pour tous les détails sur le langage de commande et sur les autres aspects de l'éditeur de liens GNU.
Cette version de ld utilise les bibliothèques BFD à usage général pour opérer sur les fichiers objets. Cela permet à ld de lire, de combiner et d'écrire des fichiers objets dans de nombreux formats différents, par exemple, COFF ou "a.out". Différents formats peuvent être liés ensemble pour produire tout type de fichier objet disponible.
Outre sa flexibilité, l'éditeur de liens GNU est plus utile que les autres éditeurs de liens en fournissant des informations de diagnostic. De nombreux éditeurs de liens abandonnent l'exécution dès qu'une erreur est rencontrée ; chaque fois que cela est possible, ld continue à s'exécuter, ce qui vous permet d'identifier d'autres erreurs (ou, dans certains cas, d'obtenir un fichier de sortie malgré l'erreur).
L'éditeur de liens GNU ld est conçu pour couvrir un large éventail de situations et pour être aussi compatible que possible avec les autres éditeurs de liens. Par conséquent, vous disposez de nombreux choix pour contrôler son comportement.
OPTIONS
L'éditeur de liens prend en charge une multitude d'options de ligne de commande, mais en réalité, peu d'entre elles sont utilisées dans un contexte particulier. Par exemple, une utilisation fréquente de ld consiste à lier des fichiers objets Unix standard sur un système Unix standard pris en charge. Sur un tel système, pour lier un fichier "hello.o" :
ld -o <fichier_de_sortie> /lib/crt0.o hello.o -lc
Cela indique à ld de produire un fichier appelé fichier_de_sortie en tant que résultat de la liaison du fichier "/lib/crt0.o" avec "hello.o" et la bibliothèque "libc.a", qui proviendra des répertoires de recherche standard. (Voir la discussion de l'option -l ci-dessous.)
Certaines des options de ligne de commande de ld peuvent être spécifiées à tout moment dans la ligne de commande. Cependant, les options qui font référence à des fichiers, telles que -l ou -T, font que le fichier est lu au moment où l'option apparaît dans la ligne de commande, par rapport aux fichiers objets et aux autres options de fichiers. La répétition d'options non liées à des fichiers avec un argument différent n'aura aucun effet supplémentaire, ou remplacera les occurrences précédentes (celles qui sont plus à gauche dans la ligne de commande) de cette option. Les options qui peuvent être spécifiées de manière significative plus d'une fois sont indiquées dans les descriptions ci-dessous.
Les arguments qui ne sont pas des options sont des fichiers objets ou des archives qui doivent être liés. Ils peuvent suivre, précéder ou être mélangés aux options de ligne de commande, à l'exception d'un argument de fichier objet qui ne peut pas être placé entre une option et son argument.
En général, le programme de liaison est appelé avec au moins un fichier objet, mais vous pouvez spécifier d'autres formes de fichiers binaires en entrée à l'aide des options -l, -R et de la commande du langage de script. Si aucun fichier binaire en entrée n'est spécifié, le programme de liaison ne produit aucune sortie et affiche le message Aucun fichier en entrée.
Si le programme de liaison ne peut pas reconnaître le format d'un fichier objet, il suppose qu'il s'agit d'un script de liaison. Un script spécifié de cette manière complète le script de liaison principal utilisé pour la liaison (soit le script de liaison par défaut, soit celui spécifié à l'aide de l'option -T). Cette fonctionnalité permet au programme de liaison de se lier à un fichier qui semble être un objet ou une archive, mais qui ne fait que définir certaines valeurs de symboles, ou qui utilise les commandes "INPUT" ou "GROUP" pour charger d'autres objets. La spécification d'un script de cette manière ne fait que compléter le script de liaison principal, les commandes supplémentaires étant placées après le script principal ; utilisez l'option -T pour remplacer complètement le script de liaison par défaut, mais tenez compte de l'effet de la commande "INSERT".
Pour les options dont les noms ne contiennent qu'une seule lettre, les arguments d'option doivent soit suivre la lettre de l'option sans espace intermédiaire, soit être donnés sous forme d'arguments distincts immédiatement après l'option qui les nécessite.
Pour les options dont les noms contiennent plusieurs lettres, soit un seul tiret, soit deux peuvent précéder le nom de l'option ; par exemple, -trace-symbol et --trace-symbol sont équivalents. Remarque : il existe une exception à cette règle. Les options à plusieurs lettres qui commencent par une lettre minuscule "o" ne peuvent être précédées que de deux tirets. Ceci permet de réduire la confusion avec l'option -o. Par exemple, -omagic définit le nom du fichier de sortie sur magic, tandis que --omagic définit le drapeau NMAGIC sur la sortie.
Les arguments des options à plusieurs lettres doivent soit être séparés du nom de l'option par un signe égal, soit être donnés sous forme d'arguments distincts immédiatement après l'option qui les nécessite. Par exemple, --trace-symbol foo et --trace-symbol=foo sont équivalents. Les abréviations uniques des noms des options à plusieurs lettres sont acceptées.
Remarque : si le programme de liaison est appelé indirectement, via un pilote de compilateur (par exemple, gcc), toutes les options de la ligne de commande du programme de liaison doivent être préfixées par -Wl (ou ce qui est approprié pour le pilote de compilateur particulier), comme ceci :
gcc -Wl,--start-group foo.o bar.o -Wl,--end-group
Ceci est important, car sinon, le programme pilote du compilateur peut supprimer silencieusement les options du programme de liaison, ce qui entraîne une liaison incorrecte. Une confusion peut également survenir lors du passage d'options qui nécessitent des valeurs via un pilote, car l'utilisation d'un espace entre l'option et l'argument agit comme un séparateur et fait que le pilote ne transmet que l'option au programme de liaison et l'argument au compilateur. Dans ce cas, il est plus simple d'utiliser les formes jointes des options à une seule lettre et à plusieurs lettres, telles que :
gcc foo.o bar.o -Wl,-eENTRY -Wl,-Map=a.map
Voici un tableau des options de ligne de commande génériques acceptées par le linker GNU :
@file
Lit les options de ligne de commande à partir du fichier. Les options lues sont insérées à la place de l’option @file d’origine. Si le fichier n’existe pas ou ne peut pas être lu, l’option sera traitée littéralement et ne sera pas supprimée.
Les options dans le fichier sont séparées par des espaces. Un caractère d’espacement peut être inclus dans une option en entourant toute l’option de guillemets simples ou doubles. Tout caractère (y compris une barre oblique inversée) peut être inclus en préfixant le caractère à inclure avec une barre oblique inversée. Le fichier peut lui-même contenir des options @file supplémentaires ; toutes ces options seront traitées de manière récursive.
-a keyword
Cette option est prise en charge pour la compatibilité HP/UX. L’argument keyword doit être l’une des chaînes archive, shared ou default. -aarchive est fonctionnellement équivalent à -Bstatic, et les deux autres mots-clés sont fonctionnellement équivalents à -Bdynamic. Cette option peut être utilisée un nombre quelconque de fois.
--audit AUDITLIB
Ajoute AUDITLIB à l’entrée « DT_AUDIT » de la section dynamique. AUDITLIB n’est pas vérifié pour son existence, ni n’utilisera le DT_SONAME spécifié dans la bibliothèque. Si elle est spécifiée plusieurs fois, « DT_AUDIT » contiendra une liste d’interfaces d’audit séparées par des deux-points. Si le linker trouve un objet avec une entrée d’audit lors de la recherche de bibliothèques partagées, il ajoutera une entrée « DT_DEPAUDIT » correspondante dans le fichier de sortie. Cette option n’a de sens que sur les plateformes ELF prenant en charge l’interface rtld-audit.
-b input-format
--format=input-format
ld peut être configuré pour prendre en charge plus d’un type de fichier objet. Si votre ld est configuré de cette manière, vous pouvez utiliser l’option -b pour spécifier le format binaire pour les fichiers objets d’entrée qui suivent cette option sur la ligne de commande. Même lorsque ld est configuré pour prendre en charge des formats d’objets alternatifs, vous n’avez généralement pas besoin de spécifier cela, car ld doit être configuré pour s’attendre, par défaut, au format d’entrée le plus courant sur chaque machine. input-format est une chaîne de texte, le nom d’un format particulier pris en charge par les bibliothèques BFD. (Vous pouvez lister les formats binaires disponibles avec objdump -i.)
Vous pouvez utiliser cette option si vous liez des fichiers avec un format binaire inhabituel. Vous pouvez également utiliser -b pour changer explicitement de formats (lors de la liaison de fichiers objets de différents formats) en incluant -b input-format avant chaque groupe de fichiers objets dans un format particulier.
Le format par défaut est extrait de la variable d’environnement « GNUTARGET ».
Vous pouvez également définir le format d’entrée à partir d’un script, en utilisant la commande « TARGET ».
-c MRI-commandfile
--mri-script=MRI-commandfile
Pour la compatibilité avec les linkers produits par MRI, ld accepte des fichiers de script écrits dans un langage de commande alternatif et restreint, décrit dans la section Fichiers de script compatibles MRI de la documentation de GNU ld. Introduisez les fichiers de script MRI avec l’option -c ; utilisez l’option -T pour exécuter des scripts de linker écrits dans le langage de script ld à usage général. Si MRI-cmdfile n’existe pas, ld le recherche dans les répertoires spécifiés par toutes les options -L.
-d
-dc
-dp Ces trois options sont équivalentes ; plusieurs formes sont prises en charge pour assurer la compatibilité avec d’autres
éditeurs de liens. Elles allouent de l’espace aux symboles communs, même si un fichier de sortie relocalisable est spécifié
(avec -r). La commande de script « FORCE_COMMON_ALLOCATION » a le même effet.
--depaudit AUDITLIB
-P AUDITLIB
Ajoute AUDITLIB à l’entrée « DT\_DEPAUDIT » de la section dynamique. AUDITLIB n’est pas vérifié pour son existence, et l’éditeur de liens n’utilisera pas le DT_SONAME spécifié dans la bibliothèque. S’il est spécifié plusieurs fois, « DT_DEPAUDIT » contiendra une liste de interfaces d’audit séparées par des deux-points. Cette option est significative uniquement sur les plateformes ELF prenant en charge l’interface rtld-audit. L’option -P est fournie pour la compatibilité avec Solaris.
--enable-linker-version
Active la directive de script d’éditeur de liens « LINKER\_VERSION », décrite dans Données de la section de sortie. Si cette directive est utilisée dans un script d’éditeur de liens et que cette option a été activée, une chaîne contenant la version de l’éditeur de liens sera insérée au point actuel.
Note : la position de cette option sur la ligne de commande de l’éditeur de liens est importante. Elle n’affectera que les scripts d’éditeur de liens qui la suivent sur la ligne de commande, ou qui sont intégrés à l’éditeur de liens.
--disable-linker-version
Désactive la directive de script d’éditeur de liens « LINKER\_VERSION », de sorte qu’elle n’insère pas de chaîne de version. C’est le comportement par défaut.
--enable-non-contiguous-regions
Cette option évite de générer une erreur si une section d’entrée ne tient pas dans une section de sortie correspondante. L’éditeur de liens tente d’allouer la section d’entrée aux sections de sortie correspondantes suivantes, et ne génère une erreur que si aucune section de sortie n’est assez grande. Ceci est utile lorsque plusieurs régions de mémoire non contiguës sont disponibles et que la section d’entrée n’a pas besoin d’être allouée à une région spécifique. L’ordre dans lequel les sections d’entrée sont évaluées ne change pas, par exemple :
MEMORY {
MEM1 (rwx) : ORIGIN = 0x1000, LENGTH = 0x14
MEM2 (rwx) : ORIGIN = 0x1000, LENGTH = 0x40
MEM3 (rwx) : ORIGIN = 0x2000, LENGTH = 0x40
}
SECTIONS {
mem1 : { *(.data.*); } > MEM1
mem2 : { *(.data.*); } > MEM2
mem3 : { *(.data.*); } > MEM3
}
avec les sections d’entrée suivantes :
.data.1 : taille 8
.data.2 : taille 0x10
.data.3 : taille 4
ce qui entraîne l’affectation de .data.1 à mem1, et de .data.2 et .data.3 à mem2, même si .data.3 pourrait tenir dans mem3.
Cette option est incompatible avec les instructions INSERT car elle modifie la façon dont les sections d’entrée sont mappées aux sections de sortie.
--enable-non-contiguous-regions-warnings
Cette option active les avertissements lorsque « --enable-non-contiguous-regions » autorise des correspondances potentiellement inattendues dans le mappage des sections, ce qui peut potentiellement entraîner le rejet silencieux d’une section au lieu de générer une erreur parce qu’elle ne tient pas dans une région de sortie.
-e entry
--entry=entry
Utilise `entry` comme symbole explicite pour indiquer le début de l’exécution de votre programme, au lieu du point d’entrée par défaut. S’il n’existe aucun symbole nommé `entry`, le lieur tentera d’interpréter `entry` comme un nombre et utilisera cette valeur comme adresse d’entrée (le nombre sera interprété en base 10 ; vous pouvez utiliser un préfixe `0x` pour la base 16 ou un préfixe `0` pour la base 8). Pour i386 PE, `entry` peut également être le nom de la fonction d’origine (sans le soulignement initial et/ou le suffixe `stdcall @number` si applicable).
--exclude-libs lib,lib,...
Spécifie une liste de bibliothèques d’archives dont les symboles ne doivent pas être exportés automatiquement. Les noms des bibliothèques peuvent être délimités par des virgules ou des deux-points. Spécifier `--exclude-libs ALL` exclut les symboles de toutes les bibliothèques d’archives de l’exportation automatique. Cette option n’est disponible que pour le port i386 PE du lieur et pour les ports ciblant ELF. Pour i386 PE, les symboles explicitement répertoriés dans un fichier `.def` sont toujours exportés, quelle que soit cette option. Pour les ports ciblant ELF, les symboles affectés par cette option seront traités comme cachés.
--exclude-modules-for-implib module,module,...
Spécifie une liste de fichiers d’objets ou de membres d’archives dont les symboles ne doivent pas être exportés automatiquement, mais qui doivent être copiés tels quels dans la bibliothèque d’importation générée pendant le lien. Les noms des modules peuvent être délimités par des virgules ou des deux-points et doivent correspondre exactement aux noms de fichiers utilisés par `ld` pour ouvrir les fichiers ; pour les membres d’archives, il s’agit simplement du nom du membre, mais pour les fichiers d’objets, le nom répertorié doit inclure et correspondre précisément au chemin utilisé pour spécifier le fichier d’entrée dans la ligne de commande du lieur. Cette option n’est disponible que pour le port i386 PE du lieur. Les symboles explicitement répertoriés dans un fichier `.def` sont toujours exportés, quelle que soit cette option.
-E
--export-dynamic
--no-export-dynamic
Lors de la création d’un exécutable lié dynamiquement, l’utilisation de l’option `-E` ou de l’option `--export-dynamic` amène le lieur à ajouter tous les symboles à la table des symboles dynamiques. La table des symboles dynamiques est l’ensemble des symboles visibles à partir des objets dynamiques au moment de l’exécution.
Si vous n’utilisez aucune de ces options (ou si vous utilisez l’option `--no-export-dynamic` pour restaurer le comportement par défaut), la table des symboles dynamiques ne contiendra normalement que les symboles référencés par un objet dynamique mentionné dans le lien.
Si vous utilisez `dlopen` pour charger un objet dynamique qui doit faire référence aux symboles définis par le programme, plutôt que par un autre objet dynamique, vous devrez probablement utiliser cette option lors du lien du programme lui-même.
Vous pouvez également utiliser la liste dynamique pour contrôler les symboles qui doivent être ajoutés à la table des symboles dynamiques si le format de sortie le prend en charge. Voir la description de `--dynamic-list`.
Notez que cette option est spécifique aux ports ciblant ELF. Les cibles PE prennent en charge une
fonctionnalité similaire pour exporter tous les symboles d’un DLL ou d’un EXE ; voir la description
de --export-all-symbols ci-dessous.
--export-dynamic-symbol=glob
Lors de la création d’un exécutable lié dynamiquement, les symboles correspondant à glob seront
ajoutés à la table des symboles dynamiques. Lors de la création d’une bibliothèque partagée, les
références aux symboles correspondant à glob ne seront pas liées aux définitions dans la bibliothèque
partagée. Cette option n’a aucun effet lors de la création d’une bibliothèque partagée et que -Bsymbolic
ou --dynamic-list ne sont pas spécifiés. Cette option n’est significative que sur les plateformes
ELF qui prennent en charge les bibliothèques partagées.
--export-dynamic-symbol-list=file
Spécifiez un --export-dynamic-symbol pour chaque modèle dans le fichier. Le format du fichier est
le même que celui du nœud de version sans portée ni nom de nœud. Voir VERSION pour plus
d’informations.
-EB Lie les objets en big-endian. Cela affecte le format de sortie par défaut.
-EL Lie les objets en little-endian. Cela affecte le format de sortie par défaut.
-f name
--auxiliary=name
Lors de la création d’un objet partagé ELF, définissez le champ interne DT\_AUXILIARY sur le nom
spécifié. Cela indique au chargeur dynamique que la table des symboles de l’objet partagé doit
être utilisée comme filtre auxiliaire sur la table des symboles de l’objet partagé name.
Si vous liez ultérieurement un programme à cet objet de filtre, lorsque vous exécutez le programme,
le chargeur dynamique verra le champ DT\_AUXILIARY. Si le chargeur dynamique résout des symboles
depuis l’objet de filtre, il vérifiera d’abord s’il existe une définition dans l’objet partagé name.
S’il y en a une, elle sera utilisée à la place de la définition dans l’objet de filtre. L’objet
partagé name n’a pas besoin d’exister. Ainsi, l’objet partagé name peut être utilisé pour fournir
une implémentation alternative de certaines fonctions, peut-être pour le débogage ou pour les
performances spécifiques à la machine.
Cette option peut être spécifiée plus d’une fois. Les entrées DT\_AUXILIARY seront créées dans
l’ordre dans lequel elles apparaissent dans la ligne de commande.
-F name
--filter=name
Lors de la création d’un objet partagé ELF, définissez le champ interne DT\_FILTER sur le nom
spécifié. Cela indique au chargeur dynamique que la table des symboles de l’objet partagé qui est
créé doit être utilisée comme filtre sur la table des symboles de l’objet partagé name.
Si vous liez ultérieurement un programme à cet objet de filtre, lorsque vous exécutez le programme,
le chargeur dynamique verra le champ DT\_FILTER. Le chargeur dynamique résoudra les symboles selon
la table des symboles de l’objet de filtre comme d’habitude, mais il se liera en fait aux définitions
trouvées dans l’objet partagé name. Ainsi, l’objet de filtre peut être utilisé pour sélectionner un
sous-ensemble des symboles fournis par l’objet name.
Certains anciens programmes de liaison utilisaient l’option -F tout au long d’une chaîne d’outils de
compilation pour spécifier le format de fichier objet pour les fichiers objets d’entrée et de sortie.
Le programme de liaison GNU utilise d’autres mécanismes à cette fin : les options -b, --format,
--oformat, la commande "TARGET" dans les scripts de liaison et la variable d’environnement
"GNUTARGET". Le programme de liaison GNU ignorera l’option -F lorsqu’il ne crée pas un objet
partagé ELF.
-fini=name
Lors de la création d'un exécutable ou d'une bibliothèque partagée ELF, appelez NAME lorsque l'exécutable ou la bibliothèque partagée est déchargé, en définissant DT_FINI sur l'adresse de la fonction. Par défaut, le linker utilise "_fini" comme fonction à appeler.
-g Ignoré. Fourni pour la compatibilité avec d'autres outils.
-G value
--gpsize=value
Définit la taille maximale des objets à optimiser à l'aide du registre GP sur la valeur spécifiée. Ceci n'a de sens que pour les formats de fichiers objets tels que MIPS ELF qui prennent en charge la mise de grands et petits objets dans des sections différentes. Ceci est ignoré pour les autres formats de fichiers objets.
-h name
-soname=name
Lors de la création d'une bibliothèque partagée ELF, définissez le champ interne DT_SONAME sur le nom spécifié. Lorsqu'un exécutable est lié à une bibliothèque partagée qui possède un champ DT_SONAME, lorsque l'exécutable est exécuté, le chargeur dynamique tentera de charger la bibliothèque partagée spécifiée par le champ DT_SONAME plutôt que d'utiliser le nom de fichier donné au linker.
-i Effectue un lien incrémental (équivalent à l'option -r).
-init=name
Lors de la création d'un exécutable ou d'une bibliothèque partagée ELF, appelez NAME lorsque l'exécutable ou la bibliothèque partagée est chargé, en définissant DT_INIT sur l'adresse de la fonction. Par défaut, le linker utilise "_init" comme fonction à appeler.
-l namespec
--library=namespec
Ajoute l'archive ou le fichier objet spécifié par namespec à la liste des fichiers à lier. Cette option peut être utilisée un nombre quelconque de fois. Si namespec est de la forme :filename, ld recherchera dans le chemin de la bibliothèque un fichier appelé filename, sinon il recherchera dans le chemin de la bibliothèque un fichier appelé libnamespec.a.
Sur les systèmes qui prennent en charge les bibliothèques partagées, ld peut également rechercher des fichiers autres que libnamespec.a. Plus précisément, sur les systèmes ELF et SunOS, ld recherchera dans un répertoire une bibliothèque appelée libnamespec.so avant de rechercher une bibliothèque appelée libnamespec.a. (Par convention, une extension ".so" indique une bibliothèque partagée.) Notez que ce comportement ne s'applique pas à :filename, qui spécifie toujours un fichier appelé filename.
Le linker recherchera dans une archive une seule fois, à l'emplacement où elle est spécifiée sur la ligne de commande. Si l'archive définit un symbole qui était indéfini dans un objet qui apparaissait avant l'archive sur la ligne de commande, le linker inclura les fichiers appropriés de l'archive. Cependant, un symbole indéfini dans un objet apparaissant plus tard sur la ligne de commande ne fera pas rechercher à nouveau l'archive par le linker.
Voir l'option -( pour une façon de forcer le linker à rechercher dans les archives plusieurs fois.
Vous pouvez lister la même archive plusieurs fois sur la ligne de commande.
Ce type de recherche d'archives est standard pour les linkers Unix. Cependant, si vous utilisez ld sur AIX, notez que cela est différent du comportement du linker AIX.
-L searchdir
--library-path=searchdir
Ajoute le chemin searchdir à la liste des chemins dans lesquels ld recherchera les bibliothèques d’archives et les scripts de contrôle ld. Vous pouvez utiliser cette option plusieurs fois. Les répertoires sont recherchés dans l’ordre dans lequel ils sont spécifiés dans la ligne de commande. Les répertoires spécifiés dans la ligne de commande sont recherchés avant les répertoires par défaut. Toutes les options -L s’appliquent à toutes les options -l, quel que soit l’ordre dans lequel les options apparaissent. Les options -L n’affectent pas la façon dont ld recherche un script de lien, sauf si l’option -T est spécifiée.
Si searchdir commence par = ou $SYSROOT, ce préfixe sera remplacé par le préfixe sysroot, contrôlé par l’option --sysroot ou spécifié lors de la configuration du lieur.
L’ensemble par défaut des chemins recherchés (sans être spécifiés avec -L) dépend du mode d’émulation utilisé par ld, et dans certains cas également de la façon dont il a été configuré.
Les chemins peuvent également être spécifiés dans un script de lien avec la commande « SEARCH_DIR ». Les répertoires spécifiés de cette façon sont recherchés au moment où le script de lien apparaît dans la ligne de commande.
-m emulation
Émule le lieur d’émulation. Vous pouvez lister les émulations disponibles avec les options --verbose ou -V.
Si l’option -m n’est pas utilisée, l’émulation est extraite de la variable d’environnement « LDEMULATION», si elle est définie.
Autrement, l’émulation par défaut dépend de la façon dont le lieur a été configuré.
--remap-inputs=pattern=filename
--remap-inputs-file=file
Ces options permettent de modifier les noms des fichiers d’entrée avant que le lieur ne tente de les ouvrir. L’option --remap-inputs=foo.o=bar.o fera en sorte que toute tentative de chargement d’un fichier appelé foo.o tente plutôt de charger un fichier appelé bar.o. Les modèles génériques sont autorisés dans le premier nom de fichier, de sorte que --remap-inputs=foo*.o=bar.o renommera tout fichier d’entrée qui correspond à foo*.o en bar.o.
Une forme alternative de l’option --remap-inputs-file=filename permet de lire les remappages à partir d’un fichier. Chaque ligne du fichier peut contenir un seul remappage. Les lignes vides sont ignorées. Tout ce qui se trouve à partir d’un caractère dièse (#) jusqu’à la fin d’une ligne est considéré comme un commentaire et est également ignoré. Le modèle de mappage peut être séparé du nom de fichier par un espace ou un signe égal (=).
Les options peuvent être spécifiées plusieurs fois. Leur contenu s’accumule. Les remappages seront traités dans l’ordre dans lequel ils apparaissent dans la ligne de commande, et s’ils proviennent d’un fichier, dans l’ordre dans lequel ils apparaissent dans le fichier. Si une correspondance est trouvée, aucune autre vérification pour ce nom de fichier ne sera effectuée.
Si le nom de fichier de remplacement est /dev/null ou simplement NUL, le remappage fera en sorte que le fichier d’entrée soit en fait ignoré. Cela peut être un moyen pratique de procéder à des expérimentations en supprimant des fichiers d’entrée d’un environnement de construction complexe.
Notez que cette option dépend de la position et n’affecte que les noms de fichiers qui la suivent sur la ligne de commande. Ainsi :
ld foo.o --remap-inputs=foo.o=bar.o
n’aura aucun effet, alors que :
ld --remap-inputs=foo.o=bar.o foo.o
renommera le fichier d’entrée foo.o en bar.o.
Remarque : ces options affectent également les fichiers référencés par les instructions INPUT dans les scripts de l’éditeur de liens. Mais comme les scripts de l’éditeur de liens sont traités après que toute la ligne de commande a été lue, la position des options de remappage sur la ligne de commande n’est pas significative.
Si l’option verbose est activée, tous les correspondances seront signalées, bien que, encore une fois, l’option verbose doit être activée sur la ligne de commande avant que les noms de fichiers remappés n’apparaissent.
Si les options -Map ou --print-map sont activées, la liste de remappage sera incluse dans la sortie du map.
-M
--print-map
Imprime un map de lien vers la sortie standard. Un map de lien fournit des informations sur le lien, y compris ce qui suit :
Où les fichiers objets sont mappés en mémoire.
Comment les symboles communs sont alloués.
Tous les membres d’archive inclus dans le lien, avec une mention du symbole qui a entraîné l’inclusion du membre d’archive.
Les valeurs affectées aux symboles.
Remarque : les symboles dont les valeurs sont calculées par une expression qui implique une référence à une valeur précédente du même symbole peuvent ne pas afficher le résultat correct dans le map de lien. En effet, l’éditeur de liens supprime les résultats intermédiaires et ne conserve que la valeur finale d’une expression. Dans de telles circonstances, l’éditeur de liens affichera la valeur finale entre crochets. Par exemple, un script de l’éditeur de liens contenant :
foo = 1
foo = foo * 4
foo = foo + 8
produira la sortie suivante dans le map de lien si l’option -M est utilisée :
000000001 foo = 0x1
[0x0000000c] foo = (foo * 0x4)
[0x0000000c] foo = (foo + 0x8)
Pour plus d’informations sur les expressions dans les scripts de l’éditeur de liens, voir Expressions.
Comment les propriétés GNU sont fusionnées.
Lorsque l’éditeur de liens fusionne les sections d’entrée .note.gnu.property en une seule section de sortie .note.gnu.property, certaines propriétés sont supprimées ou mises à jour. Ces actions sont signalées dans le map de lien. Par exemple :
Propriété supprimée 0xc0000002 pour fusionner foo.o (0x1) et bar.o (non trouvé)
Cela indique que la propriété 0xc0000002 est supprimée de la sortie lors de la fusion des propriétés de foo.o, dont la valeur de propriété 0xc0000002 est 0x1, et de bar.o, qui n’a pas de propriété 0xc0000002.
Propriété mise à jour 0xc0010001 (0x1) pour fusionner foo.o (0x1) et bar.o (0x1)
Cela indique que la valeur de la propriété 0xc0010001 est mise à jour à 0x1 dans la sortie lors de la fusion des propriétés de foo.o, dont la valeur de propriété 0xc0010001 est 0x1, et de bar.o, dont la valeur de propriété 0xc0010001 est 0x1.
Sur certaines cibles ELF, une liste de correctifs insérés par --relax.
foo.o : ajustement de la branche à 0x00000008 vers « far » dans la section .text
Cela indique que la branche à 0x00000008 dans foo.o, ciblant le symbole « far » dans la section .text, a été remplacée par un tremplin.
--print-map-discarded
--no-print-map-discarded
Affiche (ou ne pas afficher) la liste des sections supprimées et collectées par le ramasse-miettes dans la carte de liaison. Activé par défaut.
--print-map-locals
--no-print-map-locals
Affiche (ou ne pas afficher) les symboles locaux dans la carte de liaison. Les symboles locaux auront le texte (local) affiché avant leur nom, et seront listés après tous les symboles globaux dans une section donnée. Les symboles locaux temporaires (généralement ceux qui commencent par .L) ne seront pas inclus dans la sortie. Désactivé par défaut.
-n
--nmagic
Désactive l’alignement des sections sur les pages et désactive la liaison avec les bibliothèques partagées. Si le format de sortie prend en charge les nombres magiques de type Unix, marque la sortie comme "NMAGIC".
-N
--omagic
Définit les sections de texte et de données comme étant lisibles et écrites. De plus, désactive l’alignement de la section de données sur les pages et désactive la liaison avec les bibliothèques partagées. Si le format de sortie prend en charge les nombres magiques de type Unix, marque la sortie comme "OMAGIC". Remarque : bien qu’une section de texte en écriture soit autorisée pour les cibles PE-COFF, cela ne respecte pas la spécification de format publiée par Microsoft.
--no-omagic
Cette option annule la plupart des effets de l’option -N. Elle définit la section de texte comme étant en lecture seule et force l’alignement de la section de données sur les pages. Remarque : cette option n’active pas la liaison avec les bibliothèques partagées. Utilisez -Bdynamic pour cela.
-o output
--output=output
Utilise output comme nom du programme produit par ld ; si cette option n’est pas spécifiée, le nom a.out est utilisé par défaut. La commande de script "OUTPUT" peut également spécifier le nom du fichier de sortie.
Remarque : le lieur supprimera le fichier de sortie avant de commencer à y écrire. Il le fera même si, en fin de compte, la liaison ne peut pas être effectuée en raison d’erreurs.
Remarque : le lieur vérifiera que le nom du fichier de sortie ne correspond pas au nom de l’un des fichiers d’entrée, mais c’est tout. En particulier, il ne se plaindra pas si le fichier de sortie risque d’écraser un fichier source ou un autre fichier important. Par conséquent, dans les systèmes de construction, il est recommandé d’utiliser l’option -o comme dernière option de la ligne de commande du lieur. Par exemple :
ld -o $(EXE) $(OBJS)
ld $(OBJS) -o $(EXE)
Si la variable EXE n’est pas définie pour une raison quelconque, la première version de la commande du lieur pourrait finir par supprimer l’un des fichiers objets (le premier de la liste OBJS), tandis que la deuxième version de la commande du lieur générera un message d’erreur et ne supprimera rien.
--dependency-file=depfile
Écrit un fichier de dépendance dans depfile. Ce fichier contient une règle adaptée à « make » décrivant le fichier de sortie et tous les fichiers d’entrée qui ont été lus pour le produire. La sortie est similaire à la sortie du compilateur avec -M -MP. Notez qu’il n’existe pas d’option comme l’option -MM du compilateur, pour exclure les « fichiers système » (ce qui n’est pas un concept bien défini dans le lieur, contrairement aux « fichiers d’en-tête système » dans le compilateur). Ainsi, la sortie de --dependency-file est toujours spécifique à l’état exact de l’installation dans laquelle elle a été produite, et ne doit pas être copiée dans des fichiers make distribués sans une édition minutieuse.
-O niveau
Si niveau est une valeur numérique supérieure à zéro, ld optimise la sortie. Cela peut prendre beaucoup plus de temps et ne devrait donc probablement être activé que pour le fichier binaire final. Pour le moment, cette option n'affecte que la génération de bibliothèques partagées ELF. Les futures versions du linker pourraient utiliser davantage cette option. De plus, il n'y a actuellement aucune différence dans le comportement du linker pour différentes valeurs non nulles de cette option. Cela pourrait également changer dans les futures versions.
-plugin nom
Implique un plugin dans le processus de liaison. Le paramètre nom est le nom de fichier absolu du plugin. Généralement, ce paramètre est automatiquement ajouté par le compilateur lors de l'utilisation de l'optimisation au moment de la liaison, mais les utilisateurs peuvent également ajouter leurs propres plugins s'ils le souhaitent.
Il est important de noter que l'emplacement des plugins originaires du compilateur est différent de
l'endroit où les programmes ar, nm et ranlib recherchent leurs plugins. Afin que ces commandes puissent
utiliser un plugin basé sur le compilateur, celui-ci doit d'abord être copié dans le répertoire
${libdir}/bfd-plugins. Tous les plugins de linker basés sur gcc sont rétrocompatibles, il suffit donc
de copier la version la plus récente.
--push-state
L'option --push-state permet de préserver l'état actuel des indicateurs qui régissent la gestion des fichiers d'entrée afin qu'ils puissent tous être restaurés à l'aide de l'option correspondante --pop-state.
Les options concernées sont : -Bdynamic, -Bstatic, -dn, -dy, -call_shared, -non_shared, -static,
-N, -n, --whole-archive, --no-whole-archive, -r, -Ur, --copy-dt-needed-entries,
--no-copy-dt-needed-entries, --as-needed, --no-as-needed et -a.
Une cible pour cette option est la spécification pour pkg-config. Lorsqu'elle est utilisée avec
l'option --libs, toutes les bibliothèques potentiellement nécessaires sont répertoriées, puis
éventuellement liées en permanence. Il est préférable de renvoyer quelque chose comme suit :
-Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state
--pop-state
Annule l'effet de --push-state et restaure les valeurs précédentes des indicateurs qui régissent la gestion des fichiers d'entrée.
-q
--emit-relocs
Conserve les sections et le contenu des relocalisations dans les exécutables entièrement liés. Les outils d'analyse et d'optimisation post-liaison peuvent avoir besoin de ces informations pour effectuer des modifications correctes des exécutables. Cela entraîne des exécutables plus volumineux.
Cette option n'est actuellement prise en charge que sur les plateformes ELF.
--force-dynamic
Force le fichier de sortie à avoir des sections dynamiques. Cette option est spécifique aux cibles VxWorks.
-r
--relocatable
Génère une sortie relocalisable, c'est-à-dire génère un fichier de sortie qui peut à son tour servir d'entrée pour ld. Ceci est souvent appelé liaison partielle. En tant qu'effet secondaire, dans les environnements qui prennent en charge les nombres magiques Unix standard, cette option définit également le nombre magique du fichier de sortie sur "OMAGIC". Si cette option n'est pas spécifiée, un fichier absolu est produit. Lors de la liaison de programmes C++, cette option ne résoudra pas les références aux constructeurs ; pour ce faire, utilisez -Ur.
Lorsqu’un fichier d’entrée n’a pas le même format que le fichier de sortie, le chaînage partiel est pris en charge uniquement si ce fichier d’entrée ne contient aucune relocalisation. Différents formats de sortie peuvent avoir des restrictions supplémentaires ; par exemple, certains formats basés sur « a.out » ne prennent pas en charge le chaînage partiel avec des fichiers d’entrée dans d’autres formats.
Lorsque la sortie relocalisable contient à la fois des contenus qui nécessitent une optimisation au moment du chaînage (LTO) et des contenus qui n’en nécessitent pas, une section .gnu_object_only sera créée pour contenir un fichier objet relocalisable, comme si l’option -r était appliquée à tous les fichiers d’entrée relocalisables qui n’exigent pas de LTO. Lors du traitement d’un fichier d’entrée relocalisable avec une section .gnu_object_only, le chaîneur extrait la section .gnu_object_only en tant qu’entrée distincte.
Notez que, puisque -r regroupe certaines sections de différents fichiers d’entrée, cela peut avoir des répercussions négatives sur la taille du code et la localité dans l’exécutable ou la bibliothèque partagée finale.
Cette option fait la même chose que -i.
-R filename
--just-symbols=filename
Lit les noms des symboles et leurs adresses dans le fichier filename, mais ne le relocalise pas et ne l’inclut pas dans la sortie. Cela permet à votre fichier de sortie de faire référence symboliquement aux emplacements absolus de mémoire définis dans d’autres programmes. Vous pouvez utiliser cette option plusieurs fois.
Pour assurer la compatibilité avec d’autres chaînes ELF, si l’option -R est suivie d’un nom de répertoire plutôt que d’un nom de fichier, elle est traitée comme l’option -rpath.
--rosegment
--no-rosegment
Tente de garantir qu’un seul segment en lecture seule, non-code, est créé. N’est utile que lorsqu’il est utilisé en conjonction avec l’option -z separate-code. Les binaires résultants devraient être plus petits que si l’option -z separate-code est utilisée seule. Sans cette option, ou si --no-rosegment est spécifié, l’option -z separate-code créera deux segments en lecture seule, un avant le segment de code et un après.
Les noms des options sont trompeurs, mais ils ont été choisis afin que le chaîneur soit compatible avec les chaînes LLD et GOLD.
Ces options ne sont prises en charge que par les cibles ELF.
-s
--strip-all
Omet toutes les informations de symboles du fichier de sortie.
-S
--strip-debug
Omet les informations de symboles de débogage (mais pas tous les symboles) du fichier de sortie.
--strip-discarded
--no-strip-discarded
Omet (ou n’omet pas) les symboles globaux définis dans les sections supprimées. Activé par défaut.
-plugin-save-temps
Stocke les fichiers intermédiaires « temporaires » du plugin de manière permanente.
-t
--trace
Affiche les noms des fichiers d’entrée lorsque le chaîneur les traite. Si -t est donné deux fois, les membres des archives sont également affichés. La sortie de -t est utile pour générer une liste de tous les fichiers objets et scripts impliqués dans le chaînage, par exemple, lorsque vous préparez des fichiers pour un rapport de bogue du chaîneur.
-T scriptfile
--script=scriptfile
Utiliser scriptfile comme fichier de script du lieur. Ce script remplace le script de lieur par défaut de ld (plutôt que de l’ajouter), sauf si le script contient « INSERT », auquel cas le fichier de commande doit spécifier tout ce qui est nécessaire pour décrire le fichier de sortie.
Si scriptfile n’existe pas dans le répertoire courant, « ld » le recherche dans les répertoires spécifiés par les options -L précédentes.
Les options de ligne de commande qui apparaissent avant l’option -T peuvent affecter le script, mais les options de ligne de commande qui apparaissent après n’ont aucun effet.
Plusieurs options -T s’accumuleront si elles augmentent le script actuel, sinon la dernière option -T non augmentative sera utilisée.
Il existe d’autres façons de spécifier des scripts de lieur. Voir :
-dT scriptfile
--default-script=scriptfile
Utiliser scriptfile comme script de lieur par défaut.
Cette option est similaire à l’option --script, sauf que le traitement du script est retardé jusqu’à ce que le reste de la ligne de commande ait été traité. Cela permet aux options placées après l’option --default-script sur la ligne de commande d’affecter le comportement du script du lieur, ce qui peut être important lorsque la ligne de commande du lieur ne peut pas être contrôlée directement par l’utilisateur (par exemple, car la ligne de commande est construite par un autre outil, tel que gcc).
-u symbol
--undefined=symbol
Forcer le symbole à être inséré dans le fichier de sortie en tant que symbole indéfini. Cela peut, par exemple, déclencher le lien de modules supplémentaires à partir des bibliothèques standard. L’option -u peut être répétée avec différents arguments pour insérer des symboles indéfinis supplémentaires. Cette option est équivalente à la commande de script de lieur « EXTERN ».
Si cette option est utilisée pour forcer l’inclusion de modules supplémentaires dans le lien et s’il est erroné que le symbole reste indéfini, l’option --require-defined doit être utilisée à la place.
--require-defined=symbol
Exiger que le symbole soit défini dans le fichier de sortie. Cette option est la même que l’option --undefined, sauf que si le symbole n’est pas défini dans le fichier de sortie, le lieur émettra une erreur et se terminera. Le même effet peut être obtenu dans un script de lieur en utilisant « EXTERN », « ASSERT » et « DEFINED » ensemble. Cette option peut être utilisée plusieurs fois pour exiger des symboles supplémentaires.
-Ur Pour les programmes qui n’utilisent pas de constructeurs ou de destructeurs, ou pour les systèmes basés sur ELF, cette option est équivalente à -r : elle génère une sortie relocalisable, c’est-à-dire un fichier de sortie qui peut à son tour servir d’entrée à ld. Pour les autres fichiers binaires, l’option -Ur est similaire à -r, mais elle résout également les références aux constructeurs et aux destructeurs.
Pour les systèmes où -r et -Ur se comportent différemment, il n’est pas possible d’utiliser -Ur sur des fichiers qui ont eux-mêmes été liés avec -Ur ; une fois que la table des constructeurs a été créée, il n’est pas possible d’y ajouter de nouveaux éléments. Utilisez -Ur uniquement pour le dernier lien partiel et -r pour les autres.
--orphan-handling=MODE
Contrôle la manière dont les sections orphelines sont traitées. Une section orpheline est une section qui n'est pas spécifiquement mentionnée dans un script de lien.
MODE peut avoir l'une des valeurs suivantes :
"place"
Les sections orphelines sont placées dans une section de sortie appropriée en suivant la stratégie décrite dans Sections orphelines. L'option --unique affecte également la manière dont les sections sont placées.
"discard"
Toutes les sections orphelines sont supprimées en les plaçant dans la section /DISCARD/.
"warn"
Le lien place la section orpheline comme pour "place" et émet également un avertissement.
"error"
Le lien quitte avec une erreur si une section orpheline est trouvée.
La valeur par défaut si --orphan-handling n'est pas spécifiée est "place".
--unique[=SECTION]
Crée une section de sortie distincte pour chaque section d'entrée correspondant à SECTION, ou si l'argument SECTION facultatif est manquant, pour chaque section d'entrée orpheline. Une section orpheline est une section qui n'est pas spécifiquement mentionnée dans un script de lien. Vous pouvez utiliser cette option plusieurs fois sur la ligne de commande ; elle empêche le regroupement normal des sections d'entrée ayant le même nom, en annulant les affectations de section de sortie dans un script de lien.
-v
--version
-V Affiche le numéro de version de ld. L'option -V liste également les émulations prises en charge. Voir également la description de --enable-linker-version dans Options, Options de ligne de commande, qui peut être utilisée pour insérer la chaîne de version du lien dans un fichier binaire.
-x
--discard-all
Supprime tous les symboles locaux.
-X
--discard-locals
Supprime tous les symboles locaux temporaires. (Ces symboles commencent par des préfixes d'étiquettes locales spécifiques au système, généralement .L pour les systèmes ELF ou L pour les systèmes a.out traditionnels.)
-y symbol
--trace-symbol=symbol
Affiche le nom de chaque fichier lié dans lequel le symbole apparaît. Cette option peut être donnée un nombre quelconque de fois. Sur de nombreux systèmes, il est nécessaire de préfixer un soulignement.
Cette option est utile lorsque vous avez un symbole non défini dans votre lien, mais que vous ne savez pas d'où provient la référence.
-Y path
Ajoute un chemin au chemin de recherche de bibliothèque par défaut. Cette option existe pour la compatibilité avec Solaris.
-z keyword
Les mots clés reconnus sont :
call-nop=prefix-addr
call-nop=suffix-nop
call-nop=prefix-byte
call-nop=suffix-byte
Spécifie le remplissage de 1 octet « NOP » lors de la transformation d'un appel indirect à une fonction définie localement, foo, via son emplacement GOT. call-nop=prefix-addr génère « 0x67 call foo ». call-nop=suffix-nop génère « call foo 0x90 ». call-nop=prefix-byte génère « byte call foo ». call-nop=suffix-byte génère « call foo byte ». Pris en charge pour i386 et x86_64.
cet-report=none
cet-report=warning
cet-report=error
Spécifie la manière de signaler les propriétés manquantes GNU\_PROPERTY\_X86\_FEATURE\_1\_IBT et GNU\_PROPERTY\_X86\_FEATURE\_1\_SHSTK dans la section d'entrée .note.gnu.property. cet-report=none, qui est la valeur par défaut, fera en sorte que le lien ne signale pas les propriétés manquantes dans les fichiers d'entrée. cet-report=warning fera en sorte que le lien émette un avertissement pour les propriétés manquantes dans les fichiers d'entrée. cet-report=error fera en sorte que le lien émette une erreur pour les propriétés manquantes dans les fichiers d'entrée. Notez que ibt désactivera le signalement de la propriété manquante GNU\_PROPERTY\_X86\_FEATURE\_1\_IBT et que shstk désactivera le signalement de la propriété manquante GNU\_PROPERTY\_X86\_FEATURE\_1\_SHSTK. Pris en charge pour Linux/i386 et Linux/x86_64.
combreloc
nocombreloc
Combine plusieurs sections de relocalisation dynamique et les trie pour améliorer la mise en cache de la recherche de symboles dynamiques. Ne le faites pas si nocombreloc.
common
nocommon
Génère des symboles communs de type STT_COMMON lors d’une liaison relocalisable. Utilisez le type STT_OBJECT si nocommon.
common-page-size=valeur
Définit la taille de page la plus couramment utilisée à la valeur spécifiée. La disposition de l’image mémoire sera optimisée pour minimiser le nombre de pages mémoire si le système utilise des pages de cette taille.
defs
Signale les références de symboles non résolues à partir des fichiers objets classiques. Cela est fait même si le linker crée une bibliothèque partagée non symbolique. Cette option est l’inverse de -z undefs.
dynamic-undefined-weak
nodynamic-undefined-weak
Rend les symboles faibles non définis dynamiques lors de la création d’un objet dynamique, s’ils sont référencés à partir d’un fichier objet classique et ne sont pas forcés d’être locaux par la visibilité des symboles ou le versionnage. Ne les rend pas dynamiques si nodynamic-undefined-weak. Si aucune des deux options n’est donnée, une cible peut par défaut avoir l’une ou l’autre de ces options en vigueur, ou faire un autre choix concernant les symboles faibles non définis dynamiques. Toutes les cibles ne prennent pas en charge ces options.
execstack
Marque l’objet comme nécessitant une pile exécutable.
global
Cette option n’a de sens que lors de la création d’un objet partagé. Elle rend les symboles définis par cet objet partagé disponibles pour la résolution de symboles des bibliothèques chargées ultérieurement.
globalaudit
Cette option n’a de sens que lors de la création d’un exécutable dynamique. Cette option marque l’exécutable comme nécessitant un audit global en définissant le bit « DF_1_GLOBAUDIT » dans la balise dynamique « DT_FLAGS_1 ». L’audit global nécessite que toute bibliothèque d’audit définie via les options de ligne de commande --depaudit ou -P soit exécutée pour tous les objets dynamiques chargés par l’application.
ibtplt
Génère des entrées PLT activées pour le suivi des branches indirectes Intel (IBT). Pris en charge pour Linux/i386 et Linux/x86_64.
ibt
Génère GNU_PROPERTY_X86_FEATURE_1_IBT dans la section .note.gnu.property pour indiquer la compatibilité avec IBT. Cela implique également ibtplt. Pris en charge pour Linux/i386 et Linux/x86_64.
indirect-extern-access
noindirect-extern-access
Génère GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS dans la section .note.gnu.property pour indiquer que le fichier objet nécessite des pointeurs de fonction canoniques et ne peut pas être utilisé avec la relocalisation de copie. Cette option implique également noextern-protected-data et nocopyreloc. Pris en charge pour i386 et x86-64.
noindirect-extern-access supprime GNU_PROPERTY_1_NEEDED_INDIRECT_EXTERN_ACCESS de
la section .note.gnu.property.
initfirst
Cette option n'est pertinente que lors de la création d'une bibliothèque partagée. Elle marque l'objet de manière à ce que son initialisation au moment de l'exécution se produise avant l'initialisation au moment de l'exécution de tout autre objet chargé dans le processus en même temps. De même, la finalisation au moment de l'exécution de l'objet se produira après la finalisation au moment de l'exécution de tout autre objet.
interpose
Spécifiez que le chargeur dynamique doit modifier son ordre de recherche des symboles de manière à ce que les symboles de cette bibliothèque partagée remplacent tous les autres symboles de bibliothèque partagée, sauf ceux qui sont également marqués de cette manière.
unique
nounique
Lors de la génération d'une bibliothèque partagée ou d'un autre objet ELF chargeable dynamiquement, marquez-le comme un objet qui ne doit (par défaut) être chargé qu'une seule fois et uniquement dans l'espace de noms principal (lors de l'utilisation de "dlmopen"). Ceci est principalement utilisé pour marquer les bibliothèques fondamentales telles que libc, libpthread, etc., qui ne fonctionnent généralement pas correctement à moins qu'elles ne soient la seule instance d'elles-mêmes. Ce comportement peut être annulé par l'appelant "dlmopen" et ne s'applique pas à certains mécanismes de chargement (tels que les bibliothèques d'audit).
lam-u48
Génère GNU_PROPERTY_X86_FEATURE_1_LAM_U48 dans la section .note.gnu.property pour indiquer la compatibilité avec Intel LAM_U48. Pris en charge pour Linux/x86_64.
lam-u57
Génère GNU_PROPERTY_X86_FEATURE_1_LAM_U57 dans la section .note.gnu.property pour indiquer la compatibilité avec Intel LAM_U57. Pris en charge pour Linux/x86_64.
lam-u48-report=none
lam-u48-report=warning
lam-u48-report=error
Spécifiez comment signaler l'absence de la propriété GNU_PROPERTY_X86_FEATURE_1_LAM_U48 dans la section .note.gnu.property d'entrée. lam-u48-report=none, qui est la valeur par défaut, fera en sorte que le lien ne signale pas les propriétés manquantes dans les fichiers d'entrée. lam-u48-report=warning fera en sorte que le lien émette un avertissement pour les propriétés manquantes dans les fichiers d'entrée. lam-u48-report=error fera en sorte que le lien émette une erreur pour les propriétés manquantes dans les fichiers d'entrée. Pris en charge pour Linux/x86_64.
lam-u57-report=none
lam-u57-report=warning
lam-u57-report=error
Spécifiez comment signaler l'absence de la propriété GNU_PROPERTY_X86_FEATURE_1_LAM_U57 dans la section .note.gnu.property d'entrée. lam-u57-report=none, qui est la valeur par défaut, fera en sorte que le lien ne signale pas les propriétés manquantes dans les fichiers d'entrée. lam-u57-report=warning fera en sorte que le lien émette un avertissement pour les propriétés manquantes dans les fichiers d'entrée. lam-u57-report=error fera en sorte que le lien émette une erreur pour les propriétés manquantes dans les fichiers d'entrée. Pris en charge pour Linux/x86_64.
lam-report=none
lam-report=warning
lam-report=error
Spécifiez comment signaler l'absence des propriétés GNU_PROPERTY_X86_FEATURE_1_LAM_U48 et GNU_PROPERTY_X86_FEATURE_1_LAM_U57 dans la section .note.gnu.property d'entrée. lam-report=none, qui est la valeur par défaut, fera en sorte que le lien ne signale pas les propriétés manquantes dans les fichiers d'entrée. lam-report=warning fera en sorte que le lien émette un avertissement pour les propriétés manquantes dans les fichiers d'entrée. lam-report=error fera en sorte que le lien émette une erreur pour les propriétés manquantes dans les fichiers d'entrée. Pris en charge pour Linux/x86_64.
lazy
Lors de la génération d'un exécutable ou d'une bibliothèque partagée, indiquez ceci pour que le chargeur dynamique reporte la résolution des appels de fonction au moment où la fonction est appelée (liaison paresseuse), plutôt qu'au moment du chargement. La liaison paresseuse est la valeur par défaut.
loadfltr
Indique que les filtres de l'objet doivent être traités immédiatement à l'exécution.
max-page-size=value
Définit la taille maximale de page mémoire prise en charge à la valeur spécifiée.
mark-plt
nomark-plt
Marque les entrées PLT avec des balises dynamiques, DT\_X86\_64\_PLT, DT\_X86\_64\_PLTSZ et DT\_X86\_64\_PLTENT.
Étant donné que cette option stocke une valeur non nulle dans le champ r\_addend des relocalisations R\_X86\_64\_JUMP\_SLOT, les exécutables et les bibliothèques partagées résultants sont incompatibles avec les chargeurs dynamiques, tels que ceux des versions plus anciennes de glibc qui n'ont pas été modifiés pour ignorer le champ r\_addend dans les relocalisations R\_X86\_64\_GLOB\_DAT et R\_X86\_64\_JUMP\_SLOT, qui n'ignorent pas le champ r\_addend des relocalisations R\_X86\_64\_JUMP\_SLOT. Pris en charge pour x86\_64.
muldefs
Autorise les définitions multiples.
nocopyreloc
Désactive les variables .dynbss générées par l'éditeur de liens et utilisées à la place des variables définies dans les bibliothèques partagées. Cela peut entraîner des relocalisations de texte dynamique.
nodefaultlib
Indique que la recherche de dépendances de cet objet par le chargeur dynamique doit ignorer tous les chemins de recherche de bibliothèque par défaut.
nodelete
Indique que l'objet ne doit pas être déchargé à l'exécution.
nodlopen
Indique que l'objet n'est pas disponible pour "dlopen".
nodump
Indique que l'objet ne peut pas être déchargé par "dldump".
noexecstack
Marque l'objet comme ne nécessitant pas de pile exécutable.
noextern-protected-data
Ne traite pas les symboles de données protégées comme externes lors de la création d'une bibliothèque partagée. Cette option remplace la valeur par défaut de l'éditeur de liens. Elle peut être utilisée pour contourner les relocalisations incorrectes par rapport aux symboles de données protégées générées par le compilateur. Les mises à jour des symboles de données protégées par un autre module ne sont pas visibles dans la bibliothèque partagée résultante. Pris en charge pour i386 et x86-64.
noreloc-overflow
Désactive la vérification du dépassement de relocalisation. Cela peut être utilisé pour désactiver la vérification du dépassement de relocalisation s'il n'y a pas de dépassement de relocalisation dynamique à l'exécution. Pris en charge pour x86\_64.
memory-seal
nomemory-seal
Indique à l'exécutable ou à la bibliothèque partagée que tous les segments PT\_LOAD doivent être scellés pour éviter toute manipulation ultérieure (telle que la modification des indicateurs de protection, de la taille du segment ou la suppression du mappage). Il s'agit d'un renforcement de la sécurité qui nécessite une prise en charge du système. Cela génère GNU\_PROPERTY\_MEMORY\_SEAL dans la section .note.gnu.property.
now
Lors de la génération d'un exécutable ou d'une bibliothèque partagée, indiquez ceci pour que le chargeur dynamique résolve tous les symboles lorsque le programme est démarré ou lorsque la bibliothèque partagée est chargée par dlopen, au lieu de reporter la résolution des appels de fonction au moment où la fonction est appelée.
origin
Spécifiez que l'objet nécessite une gestion `$ORIGIN` dans les chemins.
pack-relative-relocs
nopack-relative-relocs
Génère des relocations relatives compactes dans un exécutable et une bibliothèque partagée position-indépendants. Cela ajoute les entrées « DT_RELR », « DT_RELRSZ » et « DT_RELRENT » à la section dynamique.
Ceci est ignoré lors de la construction d'un exécutable dépendant de la position et d'une sortie relocalisable.
`nopack-relative-relocs` est la valeur par défaut, qui désactive la relocalisation relative compacte. Lorsque vous effectuez un lien avec la bibliothèque C GNU, un symbole de version `GLIBC_ABI_DT_RELR` est ajouté à la bibliothèque C partagée dans la sortie. Pris en charge pour i386 et x86-64.
relro
norelro
Crée un en-tête de segment ELF « PT_GNU_RELRO » dans l'objet. Cela spécifie un segment de mémoire qui doit être rendu en lecture seule après la relocalisation, si cela est pris en charge. Spécifier une taille de page `commonpage-size` inférieure à la taille de page du système rendra cette protection inefficace.
Ne crée pas d'en-tête de segment ELF « PT_GNU_RELRO » si `norelro` est utilisé.
report-relative-reloc
Signale les relocalisations dynamiques relatives générées par le linker. Pris en charge pour Linux/i386 et Linux/x86_64.
sectionheader
nosectionheader
Génère l'en-tête de section. N'induit pas la génération de l'en-tête de section si `nosectionheader` est utilisé.
`sectionheader` est la valeur par défaut.
separate-code
noseparate-code
Crée un en-tête de segment « PT_LOAD » distinct pour le code dans l'objet. Cela spécifie un segment de mémoire qui doit contenir uniquement des instructions et doit se trouver dans des pages disjointes de toutes les autres données. N'induit pas la création d'un segment « PT_LOAD » distinct pour le code si `noseparate-code` est utilisé.
shstk
Génère `GNU_PROPERTY_X86_FEATURE_1_SHSTK` dans la section `.note.gnu.property` pour indiquer la compatibilité avec la pile d'ombres Intel. Pris en charge pour Linux/i386 et Linux/x86_64.
stack-size=value
Spécifie une taille de pile pour un segment ELF « PT_GNU_STACK ». Spécifier zéro annulera toute création de segment « PT_GNU_STACK » de taille non nulle par défaut.
start-stop-gc
nostart-stop-gc
Lorsque `--gc-sections` est utilisé, une référence d'une section conservée à `__start_SECNAME` ou `__stop_SECNAME` fait que toutes les sections d'entrée nommées `SECNAME` sont également conservées, si `SECNAME` peut être représentée comme un identificateur C et que `__start_SECNAME` ou `__stop_SECNAME` sont synthétisés par le linker. L'option `-z start-stop-gc` désactive cet effet, ce qui permet aux sections d'être collectées comme si les symboles synthétisés spéciaux n'étaient pas définis. L'option `-z start-stop-gc` n'a aucun effet sur une définition de `__start_SECNAME` ou `__stop_SECNAME` dans un fichier objet ou un script de linker. Une telle définition empêchera le linker de fournir un `__start_SECNAME` ou `__stop_SECNAME` synthétisé, et par conséquent, le traitement spécial par la collecte des ordures pour ces références.
start-stop-visibility=value
Spécifie la visibilité des symboles ELF pour les symboles synthétisés `__start_SECNAME` et `__stop_SECNAME`. La valeur doit être exactement `default`, `internal`, `hidden` ou `protected`. Si aucune option `-z start-stop-visibility` n'est fournie, `protected` est utilisé pour la compatibilité avec les pratiques historiques. Cependant, il est fortement recommandé d'utiliser `-z start-stop-visibility=hidden` dans les nouveaux programmes et bibliothèques partagées afin que ces symboles ne soient pas exportés entre les objets partagés, ce qui n'est généralement pas souhaité.
text
notext
textoff
Signale une erreur si DT_TEXTREL est défini, c’est-à-dire si l’objet partagé ou position-indépendant contient des relocations dynamiques dans des sections en lecture seule. Ne signale pas d’erreur si notext ou textoff.
undefs
N’indique pas les références de symboles non résolues à partir de fichiers objets réguliers, soit lors de la création d’un exécutable, soit lors de la création d’une bibliothèque partagée. Cette option est l’inverse de -z defs.
unique-symbol
nounique-symbol
Évite la duplication des noms de symboles locaux dans la table de chaînes de symboles. Ajoute « .number » aux noms de symboles locaux dupliqués si unique-symbol est utilisé. nounique-symbol est la valeur par défaut.
x86-64-baseline
x86-64-v2
x86-64-v3
x86-64-v4
Spécifie le niveau d’ISA x86-64 requis dans la section .note.gnu.property. x86-64-baseline génère « GNU_PROPERTY_X86_ISA_1_BASELINE ». x86-64-v2 génère « GNU_PROPERTY_X86_ISA_1_V2 ». x86-64-v3 génère « GNU_PROPERTY_X86_ISA_1_V3 ». x86-64-v4 génère « GNU_PROPERTY_X86_ISA_1_V4 ». Pris en charge pour Linux/i386 et Linux/x86_64.
isa-level-report=none
isa-level-report=all
isa-level-report=needed
isa-level-report=used
Spécifie comment signaler les niveaux d’ISA x86-64 dans les fichiers objets d’entrée. isa-level-report=none, qui est la valeur par défaut, empêche le lieur de signaler les niveaux d’ISA x86-64 dans les fichiers d’entrée. isa-level-report=all amène le lieur à signaler les niveaux d’ISA x86-64 requis et utilisés dans les fichiers d’entrée. isa-level-report=needed amène le lieur à signaler les niveaux d’ISA x86-64 requis dans les fichiers d’entrée. isa-level-report=used amène le lieur à signaler les niveaux d’ISA x86-64 utilisés dans les fichiers d’entrée. Pris en charge pour Linux/i386 et Linux/x86_64.
D’autres mots-clés sont ignorés pour la compatibilité avec Solaris.
--gnu-tls-tag
--no-gnu-tls-tag
Ajoute une dépendance de balise de version « GLIBC_ABI_GNU_TLS » dans les programmes et les bibliothèques partagées de sortie lors du lien avec glibc si les fichiers objets d’entrée effectuent un appel à « ___tls_get_addr ». La sortie ne pourra pas être chargée et exécutée au moment de l’exécution avec glibc si cette dernière ne définit pas la balise de version « GLIBC_ABI_GNU_TLS ». Sauf si désactivée par l’option --disable-gnu-tls-tag lors de la compilation du lieur, lorsqu’aucune option n’est spécifiée, le lieur ajoutera la dépendance de balise de version « GLIBC_ABI_GNU_TLS » si les entrées ont un appel « ___tls_get_addr » et si libc.so définit la balise de version « GLIBC_ABI_GNU_TLS ». Pris en charge pour Linux/i386.
--gnu2-tls-tag
--no-gnu2-tls-tag
Ajoute une dépendance de balise de version « GLIBC_ABI_GNU2_TLS » dans les programmes et les bibliothèques partagées de sortie lors du lien avec glibc si les fichiers objets d’entrée ont une relocation « R_386_TLS_DESC_CALL » ou « R_X86_64_TLSDESC_CALL ». La sortie ne pourra pas être chargée et exécutée au moment de l’exécution avec glibc si cette dernière ne définit pas la balise de version « GLIBC_ABI_GNU2_TLS ». Sauf si désactivée par l’option --disable-gnu2-tls-tag lors de la compilation du lieur, lorsqu’aucune option n’est spécifiée, le lieur ajoutera la balise de version « GLIBC_ABI_GNU2_TLS » si les entrées ont une relocation « R_386_TLS_DESC_CALL » ou « R_X86_64_TLSDESC_CALL » et si libc.so définit la balise de version « GLIBC_ABI_GNU2_TLS ». Pris en charge pour Linux/i386 et Linux/x86_64.
-( archives -)
--start-group archives --end-group
Les archives doivent être une liste de fichiers d’archive. Elles peuvent être soit des noms de fichiers explicites, soit des options -l.
Les archives spécifiées sont recherchées de manière répétée jusqu’à ce qu’il n’y ait plus de références indéfinies. Normalement, une archive n’est recherchée qu’une seule fois dans l’ordre spécifié sur la ligne de commande. Si un symbole dans cette archive est nécessaire pour résoudre un symbole indéfini référencé par un objet dans une archive qui apparaît plus tard sur la ligne de commande, le linker ne pourra pas résoudre cette référence. En regroupant les archives, elles seront toutes recherchées de manière répétée jusqu’à ce que toutes les références possibles soient résolues.
L’utilisation de cette option entraîne un coût de performance important. Il est préférable de l’utiliser uniquement lorsque des références circulaires inévitables existent entre deux archives ou plus.
--accept-unknown-input-arch
--no-accept-unknown-input-arch
Indique au linker d’accepter les fichiers d’entrée dont l’architecture ne peut pas être reconnue. L’hypothèse est que l’utilisateur sait ce qu’il fait et souhaite délibérément inclure ces fichiers d’entrée inconnus. C’était le comportement par défaut du linker avant la version 2.14. Le comportement par défaut à partir de la version 2.14 consiste à rejeter ces fichiers d’entrée, et l’option --accept-unknown-input-arch a été ajoutée pour restaurer l’ancien comportement.
--as-needed
--no-as-needed
Cette option affecte les balises ELF DT_NEEDED pour les bibliothèques dynamiques mentionnées sur la ligne de commande après l’option --as-needed. Normalement, le linker ajoutera une balise DT_NEEDED pour chaque bibliothèque dynamique mentionnée sur la ligne de commande, quel que soit le fait que la bibliothèque soit réellement nécessaire ou non. --as-needed fait qu’une balise DT_NEEDED n’est émise que pour une bibliothèque qui, à ce moment-ci du lien, satisfait une référence de symbole non faible indéfinie à partir d’un fichier objet normal ou, si la bibliothèque n’est pas trouvée dans les listes DT_NEEDED des autres bibliothèques nécessaires, une référence de symbole non faible indéfinie à partir d’une autre bibliothèque dynamique nécessaire. Les fichiers objets ou les bibliothèques apparaissant sur la ligne de commande après la bibliothèque en question n’affectent pas le fait de savoir si la bibliothèque est considérée comme nécessaire. Ceci est similaire aux règles d’extraction des fichiers objets à partir des archives. --no-as-needed restaure le comportement par défaut.
Remarque : sur les systèmes basés sur Linux, l’option --as-needed a également une incidence sur le comportement des options --rpath et --rpath-link. Voir la description de l’option --rpath-link pour plus de détails.
--add-needed
--no-add-needed
Ces deux options ont été abandonnées en raison de la similitude de leurs noms avec les options --as-needed et --no-as-needed. Elles ont été remplacées par --copy-dt-needed-entries et --no-copy-dt-needed-entries.
-assert keyword
Cette option est ignorée pour la compatibilité avec SunOS.
-Bdynamic
-dy
-call_shared
Effectuer un lien avec les bibliothèques dynamiques. Ceci n’a de sens que sur les plateformes pour lesquelles les bibliothèques partagées sont prises en charge. Cette option est normalement la valeur par défaut sur ces plateformes. Les différentes variantes de cette option servent à assurer la compatibilité avec divers systèmes. Vous pouvez utiliser cette option plusieurs fois sur la ligne de commande : elle affecte la recherche de bibliothèques pour les options -l qui la suivent.
-Bgroup
Définir le drapeau « DF_1_GROUP » dans l’entrée « DT_FLAGS_1 » de la section dynamique. Cela fait en sorte que le chargeur dynamique traite les recherches dans cet objet et ses dépendances uniquement à l’intérieur du groupe. L’option --unresolved-symbols=report-all est implicite. Cette option n’a de sens que sur les plateformes ELF qui prennent en charge les bibliothèques partagées.
-Bstatic
-dn
-non_shared
-static
Ne pas effectuer de lien avec les bibliothèques partagées. Ceci n’a de sens que sur les plateformes pour lesquelles les bibliothèques partagées sont prises en charge. Les différentes variantes de cette option servent à assurer la compatibilité avec divers systèmes. Vous pouvez utiliser cette option plusieurs fois sur la ligne de commande : elle affecte la recherche de bibliothèques pour les options -l qui la suivent. Cette option implique également --unresolved-symbols=report-all. Cette option peut être utilisée avec -shared. Cela signifie qu’une bibliothèque partagée est en train d’être créée, mais que toutes les références externes de la bibliothèque doivent être résolues en incluant des entrées à partir de bibliothèques statiques.
-Bsymbolic
Lors de la création d’une bibliothèque partagée, lier les références aux symboles globaux à la définition dans la bibliothèque partagée, le cas échéant. Normalement, il est possible pour un programme lié à une bibliothèque partagée de remplacer la définition dans la bibliothèque partagée. Cette option n’a de sens que sur les plateformes ELF qui prennent en charge les bibliothèques partagées.
-Bsymbolic-functions
Lors de la création d’une bibliothèque partagée, lier les références aux symboles de fonctions globaux à la définition dans la bibliothèque partagée, le cas échéant. Cette option n’a de sens que sur les plateformes ELF qui prennent en charge les bibliothèques partagées.
-Bno-symbolic
Cette option peut annuler les options -Bsymbolic et -Bsymbolic-functions spécifiées précédemment.
--dynamic-list=dynamic-list-file
Spécifier le nom d’un fichier de liste dynamique au lieur. Ceci est généralement utilisé lors de la création de bibliothèques partagées pour spécifier une liste de symboles globaux dont les références ne doivent pas être liées à la définition dans la bibliothèque partagée, ou pour créer des exécutables liés dynamiquement afin de spécifier une liste de symboles qui doivent être ajoutés à la table des symboles dans l’exécutable. Cette option n’a de sens que sur les plateformes ELF qui prennent en charge les bibliothèques partagées.
Le format de la liste dynamique est le même que celui du nœud de version sans portée ni nom de nœud. Voir VERSION pour plus d'informations.
--dynamic-list-data
Inclut tous les symboles de données globales dans la liste dynamique.
--dynamic-list-cpp-new
Fournit la liste dynamique intégrée pour les opérateurs C++ new et delete. Ceci est principalement utile pour la construction de libstdc++ partagée.
--dynamic-list-cpp-typeinfo
Fournit la liste dynamique intégrée pour l'identification du type d'exécution C++.
--check-sections
--no-check-sections
Demande au linker de ne pas vérifier les adresses des sections après leur assignation pour détecter d'éventuels chevauchements. Normalement, le linker effectue cette vérification et, s'il détecte des chevauchements, il produit les messages d'erreur appropriés. Le linker connaît les sections de superposition et tient compte de celles-ci. Le comportement par défaut peut être restauré en utilisant l'option de ligne de commande --check-sections. Le chevauchement des sections n'est généralement pas vérifié pour les liens repositionnables. Vous pouvez forcer la vérification dans ce cas en utilisant l'option --check-sections.
--copy-dt-needed-entries
--no-copy-dt-needed-entries
Cette option affecte le traitement des bibliothèques dynamiques référencées par les balises DT_NEEDED dans les bibliothèques dynamiques ELF mentionnées sur la ligne de commande. Normalement, le linker n'ajoute pas une balise DT_NEEDED au fichier binaire de sortie pour chaque bibliothèque mentionnée dans une balise DT_NEEDED d'une bibliothèque dynamique d'entrée. Cependant, si --copy-dt-needed-entries est spécifié sur la ligne de commande, toutes les bibliothèques dynamiques qui le suivent auront leurs entrées DT_NEEDED ajoutées. Le comportement par défaut peut être restauré avec --no-copy-dt-needed-entries.
Cette option a également un effet sur la résolution des symboles dans les bibliothèques dynamiques. Avec --copy-dt-needed-entries, les bibliothèques dynamiques mentionnées sur la ligne de commande seront recherchées de manière récursive, en suivant leurs balises DT_NEEDED vers d'autres bibliothèques, afin de résoudre les symboles requis par le fichier binaire de sortie. Avec le réglage par défaut, cependant, la recherche des bibliothèques dynamiques qui le suivent s'arrête à la bibliothèque dynamique elle-même. Aucune liaison DT_NEEDED ne sera parcourue pour résoudre les symboles.
--cref
Affiche une table de références croisées. Si un fichier de cartographie du linker est généré, la table de références croisées est imprimée dans le fichier de cartographie. Sinon, elle est imprimée sur la sortie standard.
Le format de la table est intentionnellement simple, afin qu'il puisse être facilement traité par un script si nécessaire. Les symboles sont imprimés, triés par nom. Pour chaque symbole, une liste de noms de fichiers est fournie. Si le symbole est défini, le premier fichier de la liste est l'emplacement de la définition. Si le symbole est défini comme une valeur commune, tous les fichiers où cela se produit apparaissent ensuite. Enfin, tous les fichiers qui font référence au symbole sont répertoriés.
--ctf-variables
--no-ctf-variables
Le format de débogage CTF prend en charge une section qui encode les noms et les types des variables trouvées dans le programme qui n'apparaissent dans aucune table de symboles. Ces variables ne peuvent clairement pas être consultées par adresse par les débogueurs classiques, de sorte que l'espace utilisé pour leurs types et leurs noms est généralement gaspillé : les types sont généralement petits, mais les noms ne le sont pas souvent. --ctf-variables permet de générer une telle section. Le comportement par défaut peut être restauré avec --no-ctf-variables.
--ctf-share-types=method
Ajuste la méthode utilisée pour partager les types entre les unités de traduction dans CTF.
share-unconflicted
Place tous les types qui n'ont pas de définitions ambiguës dans le dictionnaire partagé, où les débogueurs peuvent facilement y accéder, même s'ils n'apparaissent que dans une unité de traduction. C'est le comportement par défaut.
share-duplicated
Place uniquement les types qui apparaissent dans plusieurs unités de traduction dans le dictionnaire partagé : les types qui n'ont qu'une seule définition sont placés dans les dictionnaires par unité de traduction. Les types qui ont des définitions ambiguës dans plusieurs unités de traduction sont toujours placés dans les dictionnaires par unité de traduction. Cela a tendance à rendre le CTF plus volumineux, mais peut réduire la quantité de CTF dans le dictionnaire partagé. Pour les très grands projets, cela peut accélérer l'ouverture du CTF et économiser de la mémoire dans le consommateur CTF au moment de l'exécution.
--no-define-common
Cette option empêche l'affectation d'adresses aux symboles communs. La commande de script "INHIBIT_COMMON_ALLOCATION" a le même effet.
L'option --no-define-common permet de dissocier la décision d'affecter des adresses aux symboles communs du choix du type de fichier de sortie ; sinon, un type de sortie non relocalisable force l'affectation d'adresses aux symboles communs. L'utilisation de --no-define-common permet aux symboles communs qui sont référencés à partir d'une bibliothèque partagée de se voir attribuer des adresses uniquement dans le programme principal. Cela élimine l'espace dupliqué inutilisé dans la bibliothèque partagée et empêche également toute confusion possible quant à la résolution du mauvais doublon lorsqu'il existe de nombreux modules dynamiques avec des chemins de recherche spécialisés pour la résolution des symboles au moment de l'exécution.
--force-group-allocation
Cette option amène le lien à placer les membres du groupe de sections comme des sections d'entrée normales et à supprimer les groupes de sections. C'est le comportement par défaut pour un lien final, mais cette option peut être utilisée pour modifier le comportement d'un lien relocalisable (-r). La commande de script "FORCE_GROUP_ALLOCATION" a le même effet.
--defsym=symbol=expression
Crée un symbole global dans le fichier de sortie, contenant l'adresse absolue donnée par l'expression. Vous pouvez utiliser cette option autant de fois que nécessaire pour définir plusieurs symboles dans la ligne de commande. Une forme limitée d'arithmétique est prise en charge pour l'expression dans ce contexte : vous pouvez donner une constante hexadécimale ou le nom d'un symbole existant, ou utiliser "+" et "-" pour ajouter ou soustraire des constantes hexadécimales ou des symboles. Si vous avez besoin d'expressions plus élaborées, envisagez d'utiliser le langage de script du lien. Remarque : il ne doit y avoir aucun espace entre le symbole, le signe égal ("=") et l'expression.
L'éditeur de liens traite les arguments --defsym et -T dans l'ordre, en plaçant --defsym avant -T, ce qui définira le symbole avant que le script de l'éditeur de liens de -T ne soit traité, tandis que le placer après -T définira le symbole après que le script de l'éditeur de liens a été traité. Cette différence a des conséquences sur les expressions dans le script de l'éditeur de liens qui utilisent les symboles --defsym, et l'ordre correct dépendra de ce que vous essayez d'accomplir.
^ -demangle[=style]
^ -no-demangle
Ces options contrôlent si les noms des symboles doivent être démêlés dans les messages d'erreur et autres sorties. Lorsqu'on demande à l'éditeur de liens de démêler, il tente de présenter les noms des symboles d'une manière lisible : il supprime les tirets bas en tête s'ils sont utilisés par le format de fichier objet, et convertit les noms de symboles C++ complexes en noms lisibles par l'utilisateur. Différents compilateurs ont différents styles de complexité. L'argument optionnel de style de complexité peut être utilisé pour choisir un style de complexité approprié pour votre compilateur. L'éditeur de liens effectuera la complexité par défaut, à moins que la variable d'environnement COLLECT_NO_DEMANGLE ne soit définie. Ces options peuvent être utilisées pour remplacer la valeur par défaut.
^ Ifile
^ -dynamic-linker=file
Définit le nom de l'éditeur de liens dynamique. Ceci n'a de sens que lors de la génération d'exécutables ELF liés dynamiquement. L'éditeur de liens dynamique par défaut est généralement correct ; ne l'utilisez pas à moins que vous ne sachiez ce que vous faites.
^ -no-dynamic-linker
Lors de la création d'un fichier exécutable, omettez la demande d'utiliser un éditeur de liens dynamique au moment du chargement. Ceci n'a de sens que pour les exécutables ELF qui contiennent des relocalisations dynamiques, et nécessite généralement un code de point d'entrée capable de traiter ces relocalisations.
^ -embedded-relocs
Cette option est similaire à l'option --emit-relocs, sauf que les relocalisations sont stockées dans une section spécifique à la cible. Cette option n'est prise en charge que par les cibles BFIN, CR16 et M68K.
^ -disable-multiple-abs-defs
N'autorisez pas plusieurs définitions avec des symboles inclus dans le nom de fichier invoqués par -R ou --just-symbols.
^ -fatal-warnings
^ -no-fatal-warnings
Traitez tous les avertissements comme des erreurs. Le comportement par défaut peut être restauré avec l'option --no-fatal-warnings.
^ w
^ -no-warnings
N'affichez aucun message d'avertissement ou d'erreur. Ceci remplacera --fatal-warnings s'il a été activé. Cette option peut être utilisée lorsqu'il est connu que le fichier binaire de sortie ne fonctionnera pas, mais qu'il est toujours nécessaire de le créer.
^ -force-exe-suffix
Assurez-vous qu'un fichier de sortie a un suffixe .exe.
Si un fichier de sortie entièrement lié et créé avec succès n'a pas de suffixe .exe ou .dll, cette option force l'éditeur de liens à copier le fichier de sortie vers un fichier du même nom avec un suffixe .exe. Cette option est utile lors de l'utilisation de fichiers Makefile Unix non modifiés sur un hôte Microsoft Windows, car certaines versions de Windows ne lanceront pas une image à moins qu'elle ne se termine par un suffixe .exe.
--gc-sections
--no-gc-sections
Active la suppression des sections d'entrée inutilisées par le ramasse-miettes. Cette option est ignorée pour les cibles qui ne la prennent pas en charge. Le comportement par défaut (qui consiste à ne pas effectuer cette suppression) peut être restauré en spécifiant --no-gc-sections sur la ligne de commande. Notez que la suppression pour les cibles aux formats COFF et PE est prise en charge, mais l'implémentation est actuellement considérée comme expérimentale.
--gc-sections détermine quelles sections d'entrée sont utilisées en examinant les symboles et les relocations. La section contenant le symbole d'entrée et toutes les sections contenant des symboles non définis sur la ligne de commande seront conservées, ainsi que les sections contenant des symboles référencés par des objets dynamiques. Notez que, lors de la création de bibliothèques partagées, le lieur doit supposer que tout symbole visible est référencé. Une fois cet ensemble initial de sections déterminé, le lieur marque de manière récursive comme utilisées toutes les sections référencées par leurs relocations. Voir --entry, --undefined et --gc-keep-exported.
Cette option peut être définie lors d'un lien partiel (activé avec l'option -r). Dans ce cas, la racine des symboles conservés doit être explicitement spécifiée par l'une des options --entry, --undefined ou --gc-keep-exported, ou par une commande "ENTRY" dans le script du lieur.
En tant qu'extension GNU, les sections d'entrée ELF marquées avec le drapeau "SHF_GNU_RETAIN" ne seront pas supprimées par le ramasse-miettes.
--print-gc-sections
--no-print-gc-sections
Affiche toutes les sections supprimées par le ramasse-miettes. La liste est affichée sur stderr. Cette option n'est effective que si la suppression a été activée via l'option --gc-sections. Le comportement par défaut (qui consiste à ne pas afficher les sections qui sont supprimées) peut être restauré en spécifiant --no-print-gc-sections sur la ligne de commande.
--gc-keep-exported
Lorsque --gc-sections est activé, cette option empêche la suppression des sections d'entrée inutilisées qui contiennent des symboles globaux ayant une visibilité par défaut ou protégée. Cette option est destinée à être utilisée pour les exécutables où les sections non référencées seraient supprimées par le ramasse-miettes, quelle que soit la visibilité externe des symboles qu'elles contiennent. Notez que cette option n'a aucun effet lors du lien d'objets partagés, car il s'agit déjà du comportement par défaut. Cette option n'est prise en charge que pour les cibles au format ELF.
--print-output-format
Affiche le nom du format de sortie par défaut (éventuellement influencé par d'autres options de la ligne de commande). Il s'agit de la chaîne qui apparaîtrait dans une commande "OUTPUT_FORMAT" du script du lieur.
--print-memory-usage
Affiche la taille utilisée, la taille totale et la taille utilisée des régions mémoire créées avec la commande MEMORY. Ceci est utile sur les cibles embarquées pour avoir une vue d'ensemble rapide de la quantité de mémoire libre. Le format de la sortie comprend un en-tête et une ligne par région. Voici un exemple de sortie :
Région de mémoire Taille utilisée Taille de la région % d'utilisation
ROM : 256 Ko 1 Mo 25,00 %
RAM : 32 octets 2 Go 0,00 %
Remarque : si vous souhaitez obtenir des informations sur l’utilisation de la mémoire du linker lui-même, l’option `--stats` vous le permettra.
--help
Affiche un résumé des options de la ligne de commande sur la sortie standard, puis quitte.
--target-help
Affiche un résumé de toutes les options spécifiques à la cible sur la sortie standard, puis quitte.
-Map=mapfile
Affiche une carte de liaison dans le fichier mapfile. Voir la description de l’option `-M` ci-dessus. Si mapfile est simplement le caractère « - », la carte sera écrite sur la sortie standard.
Spécifier un répertoire comme mapfile permet d’écrire la carte de liaison dans un fichier à l’intérieur du répertoire. Normalement, le nom du fichier à l’intérieur du répertoire est calculé comme le nom de base du fichier de sortie, auquel « .map » est ajouté. Si, cependant, le caractère spécial « % » est utilisé, il sera remplacé par le chemin complet du fichier de sortie. De plus, si des caractères suivent le symbole « % », « .map » ne sera plus ajouté.
-o foo.exe -Map=bar [Crée ./bar]
-o ../dir/foo.exe -Map=bar [Crée ./bar]
-o foo.exe -Map=../dir [Crée ../dir/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir [Crée ../dir/foo.exe.map]
-o foo.exe -Map=% [Crée ./foo.exe.map]
-o ../dir/foo.exe -Map=% [Crée ../dir/foo.exe.map]
-o foo.exe -Map=%.bar [Crée ./foo.exe.bar]
-o ../dir/foo.exe -Map=%.bar [Crée ../dir/foo.exe.bar]
-o ../dir2/foo.exe -Map=../dir/% [Crée ../dir/../dir2/foo.exe.map]
-o ../dir2/foo.exe -Map=../dir/%.bar [Crée ../dir/../dir2/foo.exe.bar]
Il est incorrect de spécifier plus d’un caractère « % ».
Si le fichier map existe déjà, il sera remplacé par cette opération.
--no-keep-memory
Normalement, ld optimise la vitesse par rapport à l’utilisation de la mémoire en mettant en cache les tables de symboles des fichiers d’entrée en mémoire. Cette option indique à ld d’optimiser plutôt l’utilisation de la mémoire en relisant les tables de symboles au besoin. Cela peut être nécessaire si ld manque d’espace mémoire lors de la liaison d’un exécutable volumineux.
--no-undefined
-z defs
Signale les références de symboles non résolues provenant des fichiers objets ordinaires. Cela est fait même si le linker crée une bibliothèque partagée non symbolique. Le commutateur `--[no-]allow-shlib-undefined` contrôle le comportement pour signaler les références non résolues trouvées dans les bibliothèques partagées qui sont liées.
Les effets de cette option peuvent être annulés en utilisant « -z undefs ».
--allow-multiple-definition
-z muldefs
Normalement, lorsqu’un symbole est défini plusieurs fois, le linker signale une erreur fatale. Ces options autorisent plusieurs définitions et la première définition est utilisée.
--allow-shlib-undefined
--no-allow-shlib-undefined
Autorise ou interdit les symboles non définis dans les bibliothèques partagées. Ce commutateur est similaire à `--no-undefined`, sauf qu’il détermine le comportement lorsque les symboles non définis se trouvent dans une bibliothèque partagée plutôt que dans un fichier objet ordinaire. Cela n’affecte pas la façon dont les symboles non définis dans les fichiers objets ordinaires sont gérés.
Le comportement par défaut consiste à signaler les erreurs pour tous les symboles non définis référencés dans les bibliothèques partagées si le lieur est utilisé pour créer un exécutable, mais à les autoriser si le lieur est utilisé pour créer une bibliothèque partagée.
Les raisons pour lesquelles il est possible d'autoriser les références à des symboles non définis dans les bibliothèques partagées spécifiées au moment du lien sont les suivantes :
Une bibliothèque partagée spécifiée au moment du lien peut ne pas être la même que celle disponible au moment du chargement, de sorte que le symbole peut en fait être résolu au moment du chargement.
Il existe certains systèmes d’exploitation, par exemple BeOS et HPPA, pour lesquels les symboles non définis dans les bibliothèques partagées sont la norme.
Le noyau BeOS, par exemple, modifie les bibliothèques partagées au moment du chargement afin de sélectionner la fonction la plus appropriée pour l’architecture actuelle. Ceci est utilisé, par exemple, pour sélectionner dynamiquement une fonction memset appropriée.
--error-handling-script=scriptname
Si cette option est fournie, le lieur invoquera scriptname chaque fois qu’une erreur est rencontrée. Actuellement, cependant, seuls deux types d’erreurs sont pris en charge : les symboles manquants et les bibliothèques manquantes. Deux arguments seront passés au script : le mot-clé « undefined-symbol » ou « missing-lib » et le nom du symbole non défini ou de la bibliothèque manquante. L’objectif est que le script fournisse à l’utilisateur des suggestions sur l’endroit où le symbole ou la bibliothèque pourrait être trouvé. Une fois que le script a terminé son exécution, le message d’erreur normal du lieur sera affiché.
La disponibilité de cette option est contrôlée par une option de configuration, elle peut donc ne pas être présente dans des implémentations spécifiques.
--no-undefined-version
Normalement, lorsqu’un symbole a une version non définie, le lieur l’ignore. Cette option interdit les symboles dotés d’une version non définie et une erreur fatale sera émise à la place.
--default-symver
Crée et utilise une version de symbole par défaut (le soname) pour les symboles exportés non versionnés.
--default-imported-symver
Crée et utilise une version de symbole par défaut (le soname) pour les symboles importés non versionnés.
--no-warn-mismatch
Normalement, ld affiche une erreur si vous essayez de lier ensemble des fichiers d’entrée qui ne sont pas compatibles pour une raison ou une autre, peut-être parce qu’ils ont été compilés pour des processeurs différents ou pour des ordres d’octets différents. Cette option indique à ld qu’il doit autoriser silencieusement de telles erreurs possibles. Cette option ne doit être utilisée qu’avec prudence, dans les cas où vous avez pris des mesures spéciales qui garantissent que les erreurs du lieur sont inappropriées.
--no-warn-search-mismatch
Normalement, ld affiche un avertissement s’il trouve une bibliothèque incompatible lors d’une recherche de bibliothèque. Cette option désactive l’avertissement.
--no-whole-archive
Désactive l’effet de l’option --whole-archive pour les fichiers d’archive suivants.
--noinhibit-exec
Conserve le fichier exécutable lorsqu'il est encore utilisable. Normalement, le linker ne produit pas de fichier de sortie s'il rencontre des erreurs pendant le processus de liaison ; il se termine sans écrire de fichier de sortie lorsqu'il signale une erreur.
-nostdlib
Recherche uniquement dans les répertoires de bibliothèque spécifiés explicitement dans la ligne de commande. Les répertoires de bibliothèque spécifiés dans les scripts de liaison (y compris les scripts de liaison spécifiés dans la ligne de commande) sont ignorés.
--oformat=format-de-sortie
Le linker peut être configuré pour prendre en charge plus d'un type de fichier objet. Si votre linker est configuré de cette manière, vous pouvez utiliser l'option `--oformat` pour spécifier le format binaire pour le fichier objet de sortie. Même lorsque le linker est configuré pour prendre en charge des formats d'objet alternatifs, vous n'avez généralement pas besoin de le spécifier, car le linker doit être configuré pour produire par défaut un format de sortie courant sur chaque machine. `format-de-sortie` est une chaîne de texte, le nom d'un format particulier pris en charge par les bibliothèques BFD. (Vous pouvez lister les formats binaires disponibles avec `objdump -i`). La commande de script `OUTPUT_FORMAT` peut également spécifier le format de sortie, mais cette option la remplace.
--out-implib fichier
Crée une bibliothèque d'importation dans le fichier correspondant à l'exécutable que le linker génère (par exemple, un DLL ou un programme ELF). Cette bibliothèque d'importation (qui doit être appelée "*.dll.a" ou "*.a" pour les DLL) peut être utilisée pour lier les clients à l'exécutable généré ; ce comportement permet de supprimer une étape de création de bibliothèque d'importation séparée (par exemple, "dlltool" pour les DLL). Cette option n'est disponible que pour les ports i386 PE et ELF du linker.
-pie
--pic-executable
Crée un exécutable indépendant de la position. Ceci n'est actuellement pris en charge que sur les plateformes ELF. Les exécutables indépendants de la position sont relocalisés par le linker dynamique à l'adresse virtuelle que le système d'exploitation choisit pour eux, ce qui peut varier entre les invocations. Ils sont marqués ET_DYN dans l'en-tête du fichier ELF, mais diffèrent des bibliothèques partagées de plusieurs manières. En particulier, les symboles définis dans un PIE ne peuvent pas être remplacés par un autre objet, comme c'est le cas dans une bibliothèque partagée.
-no-pie
Crée un exécutable dépendant de la position. C'est la valeur par défaut.
-qmagic
Cette option est ignorée pour la compatibilité Linux.
-Qy Cette option est ignorée pour la compatibilité SVR4.
--relax
--no-relax
Une option avec des effets spécifiques à la machine. Cette option n'est prise en charge que sur quelques plateformes.
Sur certaines plateformes, l'option --relax effectue des optimisations globales spécifiques à la cible qui deviennent possibles lorsque le linker résout l'adressage dans le programme, telles que la relaxation des modes d'adressage, la synthèse de nouvelles instructions, la sélection de versions plus courtes des instructions actuelles et la combinaison des valeurs constantes.
Sur certaines plateformes, ces optimisations globales au moment de la liaison peuvent rendre le débogage symbolique de l'exécutable résultant impossible. Ceci est connu pour être le cas pour les familles de processeurs Matsushita MN10200 et MN10300.
Sur les plateformes où cette fonctionnalité est prise en charge, l'option --no-relax la désactivera.
Sur les plateformes où cette fonctionnalité n'est pas prise en charge, les options --relax et --no-relax sont acceptées, mais ignorées.
--retain-symbols-file=filename
Conserve uniquement les symboles répertoriés dans le fichier filename, en supprimant tous les autres. Le fichier filename est simplement un fichier texte brut, avec un nom de symbole par ligne. Cette option est particulièrement utile dans les environnements (tels que VxWorks) où une grande table de symboles globales est accumulée progressivement, afin de préserver la mémoire d'exécution.
--retain-symbols-file ne supprime pas les symboles non définis ou les symboles nécessaires aux relocations.
Vous ne pouvez spécifier --retain-symbols-file qu'une seule fois dans la ligne de commande. Elle remplace -s et -S.
-rpath=dir
Ajoute un répertoire au chemin de recherche des bibliothèques d'exécution. Ceci est utilisé lors du lien d'un exécutable ELF avec des objets partagés. Tous les arguments -rpath sont concaténés et transmis au lieur d'exécution, qui les utilise pour localiser les objets partagés lors de l'exécution.
L'option -rpath est également utilisée pour localiser les objets partagés qui sont nécessaires aux objets partagés inclus explicitement dans le lien ; voir la description de l'option -rpath-link. La recherche dans -rpath de cette manière n'est prise en charge que par les lieurs natifs et les lieurs croisés qui ont été configurés avec l'option --with-sysroot.
Si -rpath n'est pas utilisé lors du lien d'un exécutable ELF, le contenu de la variable d'environnement "LD_RUN_PATH" sera utilisé si elle est définie.
L'option -rpath peut également être utilisée sur SunOS. Par défaut, sur SunOS, le lieur forme un chemin de recherche d'exécution à partir de toutes les options -L qui lui sont données. Si une option -rpath est utilisée, le chemin de recherche d'exécution sera formé exclusivement à l'aide des options -rpath, en ignorant les options -L. Ceci peut être utile lors de l'utilisation de gcc, qui ajoute de nombreuses options -L qui peuvent se trouver sur des systèmes de fichiers montés NFS.
Pour la compatibilité avec d'autres lieurs ELF, si l'option -R est suivie d'un nom de répertoire plutôt que d'un nom de fichier, elle est traitée comme l'option -rpath.
-rpath-link=dir
Lorsque vous utilisez ELF ou SunOS, une bibliothèque partagée peut en nécessiter une autre. Cela se produit lorsqu'un lien "ld -shared" inclut une bibliothèque partagée comme l'un des fichiers d'entrée.
Lorsque le lieur rencontre une telle dépendance lors d'un lien non partagé et non relocalisable, il essaiera automatiquement de localiser la bibliothèque partagée requise et de l'inclure dans le lien, si elle n'est pas incluse explicitement. Dans un tel cas, plusieurs répertoires sont recherchés, comme décrit ci-dessous. L'option -rpath-link spécifie le premier ensemble de répertoires à rechercher. Cette option peut spécifier une séquence de noms de répertoires en fournissant une liste de noms séparés par des deux-points, ou en apparaissant plusieurs fois.
Les jetons $ORIGIN et $LIB peuvent apparaître dans ces répertoires de recherche. Ils seront remplacés par le chemin complet du répertoire contenant le programme ou l'objet partagé dans le cas de $ORIGIN et soit lib - pour les binaires 32 bits - soit lib64 - pour les binaires 64 bits - dans le cas de $LIB.
La forme alternative de ces jetons - ${ORIGIN} et ${LIB} peut également être utilisée. Le jeton $PLATFORM n’est pas pris en charge.
L’option --rpath-link doit être utilisée avec prudence, car elle remplace le chemin de recherche qui a pu être compilé dans une bibliothèque partagée. Dans ce cas, il est possible d’utiliser involontairement un chemin de recherche différent de celui que le chargeur dynamique utiliserait lors de l’exécution.
Lorsque des bibliothèques partagées supplémentaires sont requises, le lieur recherchera les répertoires dans l’ordre indiqué ci-dessous afin de les trouver. Notez cependant que cela ne s’applique qu’aux bibliothèques supplémentaires nécessaires pour satisfaire les bibliothèques partagées déjà incluses. Cela ne s’applique pas aux bibliothèques incluses via l’option de ligne de commande -l. Les recherches pour les bibliothèques -l ne sont effectuées que dans les répertoires spécifiés par l’option -L.
Tous les répertoires spécifiés par les options -rpath-link.
Tous les répertoires spécifiés par les options -rpath. La différence entre -rpath et -rpath-link est que les répertoires spécifiés par les options -rpath sont inclus dans l’exécutable et utilisés lors de l’exécution, tandis que l’option -rpath-link n’est effective que lors du lien. La recherche de -rpath de cette manière est uniquement prise en charge par les lieurs natifs et les lieurs croisés configurés avec l’option --with-sysroot.
Sur un système ELF, pour les lieurs natifs, si les options -rpath et -rpath-link n’ont pas été utilisées, rechercher le contenu de la variable d’environnement "LD_RUN_PATH".
Sur SunOS, si l’option -rpath n’a pas été utilisée, rechercher tous les répertoires spécifiés à l’aide des options -L.
Pour un lieur natif, rechercher le contenu de la variable d’environnement "LD_LIBRARY_PATH".
Pour un lieur ELF natif, les répertoires dans "DT_RUNPATH" ou "DT_RPATH" d’une bibliothèque partagée sont recherchés pour les bibliothèques partagées dont elle a besoin. Les entrées "DT_RPATH" sont ignorées si des entrées "DT_RUNPATH" existent.
Pour un lieur pour un système Linux, si le fichier /etc/ld.so.conf existe, la liste des répertoires trouvés dans ce fichier. Remarque : le chemin de ce fichier est préfixé par la valeur "sysroot", si celle-ci est définie, puis par toute chaîne "prefix" si le lieur a été configuré avec l’option --prefix=<path>.
Pour un lieur natif sur un système FreeBSD, tous les répertoires spécifiés par la macro "_PATH_ELF_HINTS" définie dans le fichier d’en-tête elf-hints.h.
Tous les répertoires spécifiés par une commande "SEARCH_DIR" dans un script de lieur donné sur la ligne de commande, y compris les scripts spécifiés par -T (mais pas -dT).
Les répertoires par défaut, généralement /lib et /usr/lib.
Tous les répertoires spécifiés par un plug-in LDPT_SET_EXTRA_LIBRARY_PATH.
Tous les répertoires spécifiés par une commande "SEARCH_DIR" dans un script de lieur par défaut.
Notez cependant que sur les systèmes basés sur Linux, il existe une restriction supplémentaire : si l’option --as-needed est active et qu’une bibliothèque partagée est trouvée, ce qui satisferait normalement la recherche, et que cette bibliothèque n’a pas de balise DT_NEEDED pour libc.so, et qu’il existe une bibliothèque partagée plus tard dans l’ensemble des répertoires de recherche qui satisfait également la recherche et que cette deuxième bibliothèque a une balise DT_NEEDED pour libc.so, alors la deuxième bibliothèque sera sélectionnée au lieu de la première.
Si la bibliothèque partagée requise n’est pas trouvée, le linker émettra un avertissement et poursuivra le processus de liaison.
--section-ordering-file=script
Cette option est utilisée pour compléter le script de linker actuel avec un mappage supplémentaire des sections d’entrée vers les sections de sortie. Ce fichier doit utiliser la même syntaxe pour « SECTIONS » que celle utilisée dans les scripts de linker normaux, mais il ne doit faire que placer les sections d’entrée dans les sections de sortie. @pxref{SECTIONS}
Une deuxième contrainte concernant le script d’ordre des sections est qu’il ne peut référencer que les sections de sortie qui sont déjà définies par le script de linker actuellement utilisé (c’est-à-dire le script de linker par défaut ou un script spécifié sur la ligne de commande). L’avantage du script d’ordre des sections est toutefois que les sections d’entrée sont mappées au début des sections de sortie, ce qui permet de garantir l’ordre des sections dans la section de sortie. Par exemple, imaginez que le script de linker par défaut ressemble à ceci :
SECTIONS {
.text : { *(.text.hot) ; *(.text .text.*) }
.data : { *(.data.big) ; *(.data .data.*) }
}
Si un fichier d’ordre des sections comme celui-ci est utilisé :
.text : { *(.text.first) ; *(.text.z*) }
.data : { foo.o(.data.first) ; *(.data.small) }
Cela serait équivalent à un script de linker comme celui-ci :
SECTIONS {
.text : { *(.text.first) ; *(.text.z*) ; *(.text.hot) ; *(.text .text.*) }
.data : { foo.o(.data.first) ; *(.data.small) ; *(.data.big) ; *(.data .data.*) }
}
L’avantage du fichier d’ordre des sections est qu’il peut être utilisé pour ordonner les sections qui sont importantes pour l’utilisateur sans avoir à se soucier des autres sections, régions de mémoire ou autres éléments.
-shared
-Bshareable
Crée une bibliothèque partagée. Ceci est actuellement pris en charge uniquement sur les plateformes ELF, XCOFF et SunOS. Sur SunOS, le linker créera automatiquement une bibliothèque partagée si l’option -e n’est pas utilisée et qu’il existe des symboles non définis dans la liaison.
--sort-common
--sort-common=ascending
--sort-common=descending
Cette option indique à ld de trier les symboles communs par alignement dans l’ordre croissant ou décroissant lorsqu’il les place dans les sections de sortie appropriées. Les alignements de symboles pris en compte sont seize octets ou plus, huit octets, quatre octets, deux octets et un octet. Ceci est destiné à empêcher les espaces entre les symboles dus aux contraintes d’alignement. Si aucun ordre de tri n’est spécifié, l’ordre décroissant est supposé.
--sort-section=name
Cette option appliquera « SORT_BY_NAME » à tous les modèles de section génériques dans le script du linker.
--sort-section=alignment
Cette option applique « SORT_BY_ALIGNMENT » à tous les modèles de sections génériques dans le script de l’éditeur de liens.
--spare-dynamic-tags=count
Cette option spécifie le nombre d’emplacements vides à laisser dans la section .dynamic des objets partagés ELF. Des emplacements vides peuvent être nécessaires pour les outils de post-traitement, tels que le pré-éditeur de liens. La valeur par défaut est 5.
--split-by-file[=size]
Similaire à --split-by-reloc, mais crée une nouvelle section de sortie pour chaque fichier d’entrée lorsque la taille est atteinte. La taille est par défaut de 1 si elle n’est pas spécifiée.
--split-by-reloc[=count]
Tente de créer des sections supplémentaires dans le fichier de sortie afin qu’aucune section de sortie unique dans le fichier ne contienne plus de count relocalisations. Ceci est utile pour générer des fichiers relocalisables volumineux destinés à être téléchargés dans certains noyaux en temps réel dotés du format de fichier objet COFF ; étant donné que COFF ne peut pas représenter plus de 65 535 relocalisations dans une seule section. Notez que cela ne fonctionnera pas avec les formats de fichiers objets qui ne prennent pas en charge les sections arbitraires. L’éditeur de liens ne divisera pas les sections d’entrée individuelles pour les redistribuer, donc si une section d’entrée unique contient plus de count relocalisations, une section de sortie contiendra ce nombre de relocalisations. count a une valeur par défaut de 32 768.
--stats[=filename]
Calcule et affiche les statistiques sur le fonctionnement de l’éditeur de liens, telles que le temps d’exécution et l’utilisation de la mémoire.
Si l’argument de nom de fichier facultatif n’est pas fourni, seules les informations de base sont affichées et envoyées au flux de sortie d’erreur standard. Si l’argument de nom de fichier est fourni, des informations détaillées sont écrites dans le fichier nommé. Si le nom de fichier est défini sur uniquement le symbole, les informations détaillées sont envoyées au flux de sortie standard. Si le nom de fichier commence par +, le fichier est ouvert en mode ajout plutôt qu’en mode d’écrasement.
Si l’option -Map a été activée, les informations sont également enregistrées dans le fichier map. Remarque : si les deux options --stats et -Map ont été fournies avec des arguments de nom de fichier et qu’ils correspondent, les informations ne seront écrites qu’une seule fois, et non deux fois.
Si la variable d’environnement « LD\_STATS » est définie, cela se comporte comme l’option --stats. Si la valeur de la variable est une chaîne, celle-ci sera utilisée comme nom du fichier dans lequel les informations doivent être enregistrées. Sinon, les informations seront envoyées au flux de sortie standard. L’utilisation de la variable d’environnement permet d’enregistrer les statistiques sans avoir à modifier la ligne de commande de l’éditeur de liens. Remarque : si à la fois la variable d’environnement et l’option --stats sont utilisées, l’option --stats prévaut.
Les informations détaillées fournies incluent le temps CPU utilisé et, si l’appel de fonction de bibliothèque système getrusage() est disponible, l’utilisation de la mémoire est également enregistrée. Ces informations sont signalées pour les différentes parties du processus d’édition de liens, appelées phases. De plus, les informations sont également signalées pour une phase spéciale appelée TOUT, qui couvre l’ensemble du processus d’édition de liens. Notez que les phases individuelles peuvent contenir ou se chevaucher, il ne faut donc pas supposer que les ressources globales utilisées par l’éditeur de liens sont la somme des ressources utilisées par les phases individuelles.
De plus, lorsqu'un rapport d'informations détaillées est généré, la version du linker, les arguments de la ligne de commande et l'heure de début du linker sont également inclus. Cela facilite la gestion des situations où plusieurs liens sont invoqués par un système de construction et permet d'identifier exactement quels arguments ont été responsables de la génération des statistiques rapportées.
La sortie étendue ressemble à ceci :
Stats : linker version : (GNU Binutils) 2.44.50.20250401
Stats : linker started : Wed Apr 2 09:36:41 2025
Stats : args : ld -z norelro -z nomemory-seal -z no-separate-code -o a.out [...]
Stats : phase cpu time memory user time system time
Stats : name (microsec) (KiB) (seconds) (seconds)
Stats : ALL 390082 217740 0 0
Stats : ctf processing 12 0 0 0
Stats : string merge 1324 0 0 0
Stats : parsing 349 288 0 0
Stats : plugins 1 0 0 0
Stats : processing files 259616 214524 0 0
Stats : write 116493 0 0 0
--no-stats
Désactive le rapport des statistiques d'utilisation, même si celui-ci a été activé via l'option de ligne de commande --stats ou la variable d'environnement LD_STATS.
--sysroot=directory
Utilise le répertoire spécifié comme emplacement du sysroot, en remplaçant la valeur par défaut configurée. Cette option n'est prise en charge que par les linkers qui ont été configurés à l'aide de l'option --with-sysroot.
--task-link
Cette option est utilisée par les cibles COFF/PE pour créer un fichier objet lié en mode tâche, dans lequel tous les symboles globaux ont été convertis en symboles statiques.
--traditional-format
Pour certaines cibles, la sortie de ld diffère de celle de certains linkers existants. Cette option demande à ld d'utiliser le format traditionnel à la place.
Par exemple, sur SunOS, ld combine les entrées en double dans la table de chaînes de symboles. Cela peut réduire la taille d'un fichier de sortie avec des informations de débogage complètes de plus de 30 %. Malheureusement, le programme SunOS « dbx » ne peut pas lire le programme résultant (« gdb » n'a aucun problème). L'option --traditional-format indique à ld de ne pas combiner les entrées en double.
--section-start=sectionname=org
Place une section dans le fichier de sortie à l'adresse absolue spécifiée par org. Vous pouvez utiliser cette option autant de fois que nécessaire pour placer plusieurs sections dans la ligne de commande. org doit être un entier hexadécimal unique ; pour la compatibilité avec d'autres linkers, vous pouvez omettre le préfixe « 0x » généralement associé aux valeurs hexadécimales. Remarque : il ne doit y avoir aucun espace entre sectionname, le signe égal (« = ») et org.
--image-base=org
Lors de l'utilisation de ELF, c'est la même chose que -Ttext-segment, les deux options définissant efficacement l'adresse de base de l'exécutable ELF.
Lors de l'utilisation de PE, utilisez la valeur comme adresse de base de votre programme ou de votre DLL. Il s'agit du plus petit emplacement mémoire qui sera utilisé lorsque votre programme ou votre DLL sera chargé. Pour réduire la nécessité de la relocalisation et améliorer les performances de vos DLL, chacune doit avoir une adresse de base unique et ne pas chevaucher d'autres DLL. La valeur par défaut est 0x400000 pour les exécutables et 0x10000000 pour les DLL.
-Tbss=org
-Tdata=org
-Ttext=org
Identique à --section-start, avec ".bss", ".data" ou ".text" comme nom de section.
-Ttext-segment=org
Lors de la création d'un exécutable ELF, cela définira l'adresse du premier octet du premier segment. Notez que lorsque -pie est utilisé avec -Ttext-segment=org, l'exécutable de sortie est marqué ET_EXEC de sorte que l'adresse du premier octet du segment de texte soit garantie d'être org au moment de l'exécution.
-Trodata-segment=org
Lors de la création d'un exécutable ELF ou d'un objet partagé pour une cible où les données en lecture seule se trouvent dans leur propre segment distinct du texte exécutable, cela définira l'adresse du premier octet du segment de données en lecture seule.
-Tldata-segment=org
Lors de la création d'un exécutable ELF ou d'un objet partagé pour le modèle de mémoire moyenne x86-64, cela définira l'adresse du premier octet du segment ldata.
--unresolved-symbols=method
Détermine la manière de gérer les symboles non résolus. Il existe quatre valeurs possibles pour la méthode :
ignore-all
Ne signale aucun symbole non résolu.
report-all
Signale tous les symboles non résolus. Il s'agit de la valeur par défaut.
ignore-in-object-files
Signale les symboles non résolus qui sont contenus dans les bibliothèques partagées, mais les ignore s'ils proviennent de fichiers objets réguliers.
ignore-in-shared-libs
Signale les symboles non résolus qui proviennent de fichiers objets réguliers, mais les ignore s'ils proviennent de bibliothèques partagées. Cela peut être utile lors de la création d'un binaire dynamique et si l'on sait que toutes les bibliothèques partagées qui doivent y être référencées sont incluses dans la ligne de commande de l'éditeur de liens.
Le comportement pour les bibliothèques partagées peut également être contrôlé par l'option --[no-]allow-shlib-undefined.
Normalement, l'éditeur de liens générera un message d'erreur pour chaque symbole non résolu signalé, mais l'option --warn-unresolved-symbols peut modifier cela en un avertissement.
--dll-verbose
--verbose[=NUMBER]
Affiche le numéro de version de ld et répertorie les émulations de l'éditeur de liens prises en charge. Affiche les fichiers d'entrée qui peuvent et ne peuvent pas être ouverts. Affiche le script de l'éditeur de liens utilisé par l'éditeur de liens. Si l'argument optionnel NUMBER est supérieur à 1, l'état des symboles du plugin sera également affiché.
--version-script=version-scriptfile
Spécifie le nom d'un script de version pour l'éditeur de liens. Ceci est généralement utilisé lors de la création de bibliothèques partagées pour spécifier des informations supplémentaires sur la hiérarchie des versions de la bibliothèque créée. Cette option est entièrement prise en charge sur les plateformes ELF qui prennent en charge les bibliothèques partagées ; voir VERSION. Elle est partiellement prise en charge sur les plateformes PE, qui peuvent utiliser des scripts de version pour filtrer la visibilité des symboles en mode d'exportation automatique : tout symbole marqué comme local dans le script de version ne sera pas exporté.
--warn-common
Affiche un avertissement lorsqu'un symbole courant est combiné avec un autre symbole courant ou avec une définition de symbole. Les éditeurs de liens Unix autorisent cette pratique un peu négligée, mais les éditeurs de liens sur certains autres systèmes d'exploitation ne l'autorisent pas. Cette option vous permet de trouver des problèmes potentiels liés à la combinaison de symboles globaux. Malheureusement, certaines bibliothèques C utilisent cette pratique, vous pouvez donc obtenir des avertissements concernant les symboles des bibliothèques ainsi que dans vos programmes.
Il existe trois types de symboles globaux, illustrés ici par des exemples en C :
int i = 1 ;
Une définition, qui se trouve dans la section de données initialisées du fichier de sortie.
extern int i ;
Une référence indéfinie, qui n'alloue pas d'espace. Il doit y avoir soit une définition, soit un symbole courant pour la variable quelque part.
int i ;
Un symbole courant. S'il n'y a qu'un (ou plusieurs) symbole(s) courant(s) pour une variable, il se trouve dans la zone de données non initialisées du fichier de sortie. L'éditeur de liens fusionne plusieurs symboles courants pour la même variable en un seul symbole. S'ils sont de tailles différentes, il choisit la plus grande taille. L'éditeur de liens transforme un symbole courant en déclaration s'il existe une définition de la même variable.
L'option --warn-common peut produire cinq types d'avertissements. Chaque avertissement se compose d'une paire de lignes : la première décrit le symbole rencontré et la seconde décrit le symbole précédent rencontré avec le même nom. Un ou les deux symboles seront un symbole courant.
Transformer un symbole courant en référence, car il existe déjà une définition pour le symbole.
<fichier>(<section>): avertissement : symbole courant de `<symbole>'
remplacé par une définition
<fichier>(<section>): avertissement : défini ici
Transformer un symbole courant en référence, car une définition ultérieure pour le symbole est rencontrée. Il s'agit du même cas que le précédent, sauf que les symboles sont rencontrés dans un ordre différent.
<fichier>(<section>): avertissement : définition de `<symbole>'
remplace le symbole courant
<fichier>(<section>): avertissement : le symbole courant est ici
Fusionner un symbole courant avec un symbole courant précédent de la même taille.
<fichier>(<section>): avertissement : plusieurs symboles courants
de `<symbole>'
<fichier>(<section>): avertissement : le symbole courant précédent est ici
Fusionner un symbole courant avec un symbole courant précédent plus grand.
<fichier>(<section>): avertissement : symbole courant de `<symbole>'
remplacé par un symbole courant plus grand
<fichier>(<section>): avertissement : le symbole courant plus grand est ici
Fusionner un symbole courant avec un symbole courant précédent plus petit. Il s'agit du même cas que le précédent, sauf que les symboles sont rencontrés dans un ordre différent.
<file>(<section>): warning : common de `<symbol>'
remplace une section common plus petite
<file>(<section>): warning : la section common plus petite se trouve ici
--warn-constructors
Avertit si des constructeurs globaux sont utilisés. Ceci n’est utile que pour certains formats de fichiers objets. Pour les formats tels que COFF ou ELF, le lieur ne peut pas détecter l’utilisation de constructeurs globaux.
--warn-execstack
--warn-execstack-objects
--no-warn-execstack
Sur les plateformes ELF, le lieur peut générer des messages d’avertissement s’il est invité à créer un fichier de sortie qui contient une pile exécutable. Il existe trois états possibles :
Ne générer aucun avertissement.
Générer toujours des avertissements, même si la pile exécutable est demandée via l’option de ligne de commande -z execstack.
Générer un avertissement uniquement si un fichier objet demande une pile exécutable, mais pas si l’option -z
execstack est utilisée.
L’état par défaut dépend de la manière dont le lieur a été configuré lors de sa compilation. L’option
--no-warn-execstack met toujours le lieur dans l’état sans avertissement. L’option
--warn-execstack met le lieur dans l’état « avertissement toujours ». L’option
--warn-execstack-objects met le lieur dans l’état « avertissement uniquement pour les fichiers objets ».
Remarque : les fichiers d’entrée au format ELF peuvent spécifier qu’ils ont besoin d’une pile exécutable en ayant une
section .note.GNU-stack avec le bit exécutable défini dans ses indicateurs de section. Ils peuvent spécifier
qu’ils n’ont pas besoin d’une pile exécutable en ayant la même section, mais sans le bit d’indicateur exécutable défini. Si un fichier d’entrée n’a pas de section .note.GNU-stack, le comportement par défaut est spécifique à la cible. Pour certaines cibles, l’absence d’une telle section implique qu’une pile exécutable est requise. C’est souvent un problème pour les fichiers assembleur créés manuellement.
--error-execstack
--no-error-execstack
Si le lieur va générer un message d’avertissement concernant une pile exécutable, l’option --error-execstack transformera cet avertissement en une erreur. Remarque : cette option ne modifie pas l’état de génération d’avertissement d’exécution du lieur. Utilisez --warn-execstack ou --warn-execstack-objects pour définir un état d’avertissement spécifique.
L’option --no-error-execstack rétablira le comportement par défaut, qui consiste à générer des messages d’avertissement.
--warn-multiple-gp
Avertit si plusieurs valeurs de pointeur global sont requises dans le fichier de sortie. Ceci n’est significatif que pour certains processeurs, tels que l’Alpha. Plus précisément, certains processeurs placent les constantes de grande valeur dans une section spéciale. Un registre spécial (le pointeur global) pointe vers le milieu de cette section, de sorte que les constantes peuvent être chargées efficacement via un mode d’adressage relatif à la base. Étant donné que le décalage en mode d’adressage relatif à la base est fixe et relativement petit (par exemple, 16 bits), cela limite la taille maximale du pool de constantes. Ainsi, dans les programmes volumineux, il est souvent nécessaire d’utiliser plusieurs valeurs de pointeur global afin de pouvoir adresser toutes les constantes possibles. Cette option provoque l’émission d’un avertissement chaque fois que cela se produit.
--warn-once
N'afficher qu'un seul avertissement pour chaque symbole non défini, plutôt qu'un avertissement par module qui y fait référence.
--warn-rwx-segments
--no-warn-rwx-segments
Avertir si le linker crée un segment chargeable, de taille non nulle, qui possède les trois drapeaux de permission (lecture, écriture et exécution). Un tel segment représente une vulnérabilité de sécurité potentielle. De plus, des avertissements seront générés si un segment de stockage local de thread est créé avec le drapeau de permission d'exécution, que les drapeaux de lecture et/ou d'écriture soient définis ou non.
Ces avertissements sont activés par défaut. Ils peuvent être désactivés via l'option --no-warn-rwx-segments et réactivés via l'option --warn-rwx-segments.
--error-rwx-segments
--no-error-rwx-segments
Si le linker va générer un message d'avertissement concernant un segment exécutable, accessible en écriture ou un segment TLS exécutable, l'option --error-rwx-segments transformera cet avertissement en erreur. L'option --no-error-rwx-segments rétablira le comportement par défaut, qui consiste simplement à générer un message d'avertissement.
Note : l'option `--error-rwx-segments` n'active pas en soi les avertissements concernant ces segments. Ces avertissements sont soit activés par défaut, si le linker a été configuré de cette manière, soit via l'option de ligne de commande `--warn-rwx-segments`.
--warn-section-align
Avertir si l'adresse d'une section de sortie est modifiée en raison d'un alignement. Généralement, l'alignement est défini par une section d'entrée. L'adresse ne sera modifiée que si elle n'est pas explicitement spécifiée, c'est-à-dire si la commande « SECTIONS » ne spécifie pas une adresse de début pour la section.
--warn-textrel
Avertir si le linker ajoute DT_TEXTREL à un exécutable ou un objet partagé indépendant de la position.
--warn-alternate-em
Avertir si un objet possède un code machine ELF alternatif.
--warn-unresolved-symbols
Si le linker va signaler un symbole non résolu (voir l'option --unresolved-symbols), il générera normalement une erreur. Cette option permet de générer un avertissement au lieu d'une erreur.
--error-unresolved-symbols
Cela restaure le comportement par défaut du linker, qui consiste à générer des erreurs lorsqu'il signale des symboles non résolus.
--whole-archive
Pour chaque archive mentionnée sur la ligne de commande après l'option --whole-archive, inclure chaque fichier objet de l'archive dans le lien, plutôt que de rechercher dans l'archive les fichiers objets requis. Ceci est généralement utilisé pour transformer un fichier d'archive en une bibliothèque partagée, en forçant l'inclusion de chaque objet dans la bibliothèque partagée résultante. Cette option peut être utilisée plus d'une fois.
Deux remarques lors de l'utilisation de cette option avec gcc : Premièrement, gcc ne connaît pas cette option, vous devez donc utiliser -Wl,-whole-archive. Deuxièmement, n'oubliez pas d'utiliser -Wl,-no-whole-archive après votre liste d'archives, car gcc ajoutera sa propre liste d'archives à votre lien et vous ne voudrez peut-être pas que ce drapeau affecte également ces dernières.
--wrap=symbol
Utiliser une fonction d’enveloppement pour le symbole. Toute référence non définie à un symbole sera résolue en « __wrap_symbol ». Toute référence non définie à « __real_symbol » sera résolue en symbole.
Cela peut être utilisé pour fournir un enveloppement pour une fonction système. La fonction d’enveloppement doit être nommée « __wrap_symbol ». Si elle souhaite appeler la fonction système, elle doit appeler « __real_symbol ».
Voici un exemple simple :
void *
__wrap_malloc (size_t c)
{
printf ("malloc appelé avec %zu\n", c);
return __real_malloc (c);
}
Si vous liez d’autres codes à ce fichier en utilisant --wrap malloc, alors tous les appels à « malloc » appelleront la fonction « __wrap_malloc » à la place. L’appel à « __real_malloc » dans « __wrap_malloc » appellera la fonction « malloc » réelle.
Vous pouvez également fournir une fonction « \_\_real\_malloc », de sorte que les liens sans l’option --wrap réussissent. Si vous le faites, vous ne devez pas placer la définition de « \_\_real\_malloc » dans le même fichier que « \_\_wrap\_malloc », sinon l’assembleur peut résoudre l’appel avant que le lieur n’ait la possibilité de le remplacer par « malloc ».
Seules les références non définies sont remplacées par le lieur. Ainsi, les références internes d’une unité de traduction à un symbole ne sont pas résolues en « \_\_wrap\_symbol ». Dans le prochain exemple, l’appel à « f » dans « g » n’est pas résolu en « \_\_wrap\_f ».
int
f (void)
{
return 123;
}
int
g (void)
{
return f();
}
--eh-frame-hdr
--no-eh-frame-hdr
Demander (--eh-frame-hdr) ou supprimer (--no-eh-frame-hdr) la création de la section « .eh\_frame\_hdr » et de l’en-tête de segment ELF « PT_GNU_EH_FRAME ».
--no-ld-generated-unwind-info
Demander la création d’informations de déroulement « .eh\_frame » pour les sections de code générées par le lieur, telles que le PLT.
Cette option est activée par défaut si le lieur prend en charge les informations de déroulement générées. Cette option contrôle également la génération des informations de trace de pile « .sframe » pour les sections de code générées par le lieur, telles que le PLT.
--enable-new-dtags
--disable-new-dtags
Ce lieur peut créer les nouveaux balises dynamiques dans ELF. Mais les anciens systèmes ELF peuvent ne pas les comprendre. Si vous spécifiez --enable-new-dtags, les nouvelles balises dynamiques seront créées si nécessaire et les anciennes balises dynamiques seront omises. Si vous spécifiez --disable-new-dtags, aucune nouvelle balise dynamique ne sera créée. Par défaut, les nouvelles balises dynamiques ne sont pas créées. Notez que ces options ne sont disponibles que pour les systèmes ELF.
--hash-size=number
Définir la taille par défaut des tables de hachage du lieur sur un nombre premier proche du nombre. L’augmentation de cette valeur peut réduire le temps nécessaire au lieur pour effectuer ses tâches, au détriment d’une augmentation des besoins en mémoire du lieur. De même, la réduction de cette valeur peut réduire les besoins en mémoire au détriment de la vitesse. La valeur par défaut est de 4051 dans des circonstances normales et de 1021 si l’option de ligne de commande --reduce-memory-overheads est utilisée.
--hash-style=style
Définit le type de table de hachage du lieur. style peut être « sysv » pour la section ELF classique « .hash », « gnu » pour la nouvelle section GNU « .gnu.hash » ou « both » pour les deux tables de hachage, la section ELF classique « .hash » et la nouvelle section GNU « .gnu.hash ». La valeur par défaut dépend de la configuration du lieur, mais pour la plupart des systèmes basés sur Linux, elle sera « both ».
--compress-debug-sections=none
--compress-debug-sections=zlib
--compress-debug-sections=zlib-gnu
--compress-debug-sections=zlib-gabi
--compress-debug-sections=zstd
Sur les plateformes ELF, ces options contrôlent la manière dont les sections de débogage DWARF sont compressées à l’aide de zlib.
--compress-debug-sections=none n’effectue pas de compression des sections de débogage DWARF.
--compress-debug-sections=zlib-gnu compresse les sections de débogage DWARF et renomme celles-ci afin qu’elles commencent par .zdebug au lieu de .debug. --compress-debug-sections=zlib-gabi compresse également les sections de débogage DWARF, mais au lieu de les renommer, elle définit le drapeau SHF_COMPRESSED dans les en-têtes des sections.
L’option --compress-debug-sections=zlib est un alias de --compress-debug-sections=zlib-gabi.
--compress-debug-sections=zstd compresse les sections de débogage DWARF à l’aide de zstd.
Notez que cette option annule toute compression dans les sections de débogage d’entrée, de sorte que si un fichier binaire est lié avec --compress-debug-sections=none, par exemple, toutes les sections de débogage compressées dans les fichiers d’entrée seront décompressées avant d’être copiées dans le fichier binaire de sortie.
Le comportement de compression par défaut varie en fonction de la cible et des options de configuration utilisées pour créer la chaîne d’outils. La valeur par défaut peut être déterminée en examinant la sortie de l’option --help du lieur.
--reduce-memory-overheads
Cette option réduit les besoins en mémoire du lieur pendant l’exécution, au prix d’une vitesse de liaison plus lente. Elle a été introduite pour sélectionner l’ancien algorithme O(n^2) pour la génération de fichiers de mappage de liens, plutôt que le nouvel algorithme O(n) qui utilise environ 40 % de mémoire en plus pour le stockage des symboles.
Un autre effet de cette option est de définir la taille par défaut de la table de hachage à 1021, ce qui permet également de gagner de la mémoire au prix d’un allongement du temps d’exécution du lieur. Ceci n’est cependant pas fait si l’option --hash-size a été utilisée.
L’option --reduce-memory-overheads peut également être utilisée pour activer d’autres compromis dans les futures versions du lieur.
--max-cache-size=size
Normalement, ld met en cache les informations de relocalisation et les tables de symboles des fichiers d’entrée en mémoire avec une taille illimitée. Cette option définit la taille de cache maximale à size. Notez que si l’option de ligne de commande --no-keep-memory a été utilisée, le lieur agit comme si la taille de cache maximale avait été définie à 0, c’est-à-dire que rien n’est conservé.
--build-id
--build-id=style
Demande la création d’une section de note ELF « .note.gnu.build-id » ou d’une section COFF « .buildid ». Le contenu de la note est constitué de bits uniques identifiant ce fichier lié. style peut être « uuid » pour utiliser 128 bits aléatoires, « sha1 » pour utiliser un hachage SHA1 de 160 bits, « md5 » pour utiliser un hachage MD5 de 128 bits, ou « xx » pour utiliser un XXHASH de 128 bits sur les parties normatives du contenu de sortie, ou « 0xhexstring » pour utiliser une chaîne de bits choisie spécifiée sous forme d’un nombre pair de chiffres hexadécimaux (les caractères « - » et « : » entre les paires de chiffres sont ignorés). Si style est omis, « sha1 » est utilisé.
Les styles « md5 », « sha1 » et « xx » produisent un identifiant qui est toujours le même dans un fichier de sortie identique, mais qui est presque certainement unique parmi tous les fichiers de sortie non identiques. Il n’est pas destiné à être comparé en tant que somme de contrôle du contenu du fichier. Un fichier lié peut être modifié ultérieurement par d’autres outils, mais la chaîne de bits d’ID de build qui identifie le fichier lié d’origine ne change pas.
Le fait de passer « none » pour le style désactive le paramètre de toutes les options « --build-id » antérieures sur la ligne de commande.
--package-metadata=JSON
Demande la création d’une section de note ELF « .note.package ». Le contenu de la note est au format JSON, conformément à la spécification des métadonnées du package. Pour plus d’informations, voir : https://systemd.io/ELF_PACKAGE_METADATA/. L’argument JSON prend en charge le codage en pourcentage et le codage suivant : %[string] (où string fait référence au nom dans les références de caractères nommées HTML) : %[comma] pour ,, %[lbrace] pour {, %[quot] pour ", %[rbrace] pour } et %[space] pour le caractère d’espace. Si l’argument JSON est manquant ou vide, cela désactivera la création de la note de métadonnées, si elle a été activée par une occurrence antérieure de l’option --package-metadata. Si le linker a été compilé avec libjansson, la chaîne JSON sera validée.
Le linker PE i386 prend en charge l’option -shared, qui fait en sorte que la sortie soit une bibliothèque liée dynamiquement (DLL) au lieu d’un exécutable normal. Vous devez nommer la sortie "*.dll" lorsque vous utilisez cette option. De plus, le linker prend entièrement en charge les fichiers "*.def" standard, qui peuvent être spécifiés sur la ligne de commande du linker comme un fichier objet (en fait, il doit précéder les archives à partir desquelles il exporte des symboles, afin de s’assurer qu’ils sont liés, comme un fichier objet normal).
En plus des options communes à toutes les cibles, le linker PE i386 prend en charge des options de ligne de commande supplémentaires qui sont spécifiques à la cible PE i386. Les options qui prennent des valeurs peuvent être séparées de leurs valeurs par un espace ou un signe égal.
--add-stdcall-alias
Si cette option est donnée, les symboles avec un suffixe stdcall (@nn) seront exportés tels quels, ainsi qu’avec le suffixe supprimé. [Cette option est spécifique à la version du linker ciblant PE i386]
--base-file file
Utilise le fichier en tant que nom du fichier dans lequel enregistrer les adresses de base de tous les déplacements nécessaires pour générer des DLL avec dlltool. [Il s’agit d’une option spécifique à PE i386]
--dll
Crée une DLL au lieu d’un exécutable normal. Vous pouvez également utiliser -shared ou spécifier un « LIBRARY » dans un fichier ".def" donné. [Cette option est spécifique à la version du linker ciblant PE i386]
--enable-long-section-names
--disable-long-section-names
Les variantes PE du format d'objet COFF ajoutent une extension qui permet l'utilisation de noms de section de plus de huit caractères, la limite normale pour COFF. Par défaut, ces noms ne sont autorisés que dans les fichiers objets, car les images exécutables entièrement liées ne contiennent pas la table de chaînes COFF nécessaire pour prendre en charge les noms plus longs. En tant qu'extension GNU, il est possible de les autoriser également dans les images exécutables, ou de les interdire (probablement inutilement !) dans les fichiers objets, en utilisant ces deux options. Les images exécutables générées avec ces longs noms de section sont légèrement non conformes à la norme, car elles contiennent une table de chaînes, et peuvent générer des résultats déroutants lorsqu'elles sont examinées avec des outils PE non GNU, tels que des visualisateurs et des décompilateurs de fichiers. Cependant, GDB s'appuie sur l'utilisation des longs noms de section PE pour trouver les sections d'informations de débogage Dwarf-2 dans une image exécutable au moment de l'exécution, et donc, si aucune des options n'est spécifiée dans la ligne de commande, ld activera les longs noms de section, annulant le comportement par défaut et techniquement correct, lorsqu'il détecte la présence d'informations de débogage lors de la liaison d'une image exécutable et sans supprimer les symboles. [Cette option est valide pour toutes les versions du linker ciblant PE]
--enable-stdcall-fixup
--disable-stdcall-fixup
Si le linker trouve un symbole qu'il ne peut pas résoudre, il tentera d'effectuer une "liaison approximative" en recherchant un autre symbole défini qui ne diffère que par le format du nom du symbole (cdecl vs. stdcall) et il résoudra ce symbole en effectuant la liaison avec la correspondance. Par exemple, le symbole indéfini "_foo" peut être lié à la fonction "_foo@12", ou le symbole indéfini "_bar@16" peut être lié à la fonction "_bar". Lorsque le linker effectue cette opération, il affiche un avertissement, car il devrait normalement échouer à la liaison, mais parfois, les bibliothèques d'importation générées à partir de DLL tierces peuvent nécessiter cette fonctionnalité pour être utilisables. Si vous spécifiez --enable-stdcall-fixup, cette fonctionnalité est entièrement activée et aucun avertissement n'est affiché. Si vous spécifiez --disable-stdcall-fixup, cette fonctionnalité est désactivée et ces incompatibilités sont considérées comme des erreurs. [Cette option est spécifique à la version du linker ciblant i386 PE]
--leading-underscore
--no-leading-underscore
Pour la plupart des cibles, le préfixe de symbole par défaut est un trait de soulignement et est défini dans la description de la cible. Avec cette option, il est possible de désactiver/activer le préfixe de symbole par défaut.
--export-all-symbols
Si cette option est fournie, tous les symboles globaux dans les objets utilisés pour créer une DLL seront exportés par la DLL. Notez qu'il s'agit du comportement par défaut s'il n'y a autrement aucun symbole exporté. Lorsque les symboles sont explicitement exportés via des fichiers DEF ou implicitement exportés via des attributs de fonction, le comportement par défaut est de ne rien exporter d'autre à moins que cette option ne soit fournie. Notez que les symboles "DllMain@12", "DllEntryPoint@0", "DllMainCRTStartup@12" et "impure_ptr" ne seront pas automatiquement exportés. De plus, les symboles importés d'autres DLL ne seront pas réexportés, ni les symboles spécifiant la disposition interne de la DLL, tels que ceux commençant par "_head_" ou se terminant par "_iname". En outre, aucun symbole de "libgcc", "libstd++", "libmingw32" ou "crtX.o" ne sera exporté. Les symboles dont les noms commencent par "__rtti_" ou "__builtin_" ne seront pas exportés, afin de faciliter les DLL C++. Enfin, il existe une liste étendue de symboles privés de Cygwin qui ne sont pas exportés (évidemment, cela s'applique lorsque l'on crée des DLL pour les cibles Cygwin). Ces éléments Cygwin à exclure sont : "_cygwin_dll_entry@12", "_cygwin_crt0_common@8", "_cygwin_noncygwin_dll_entry@12", "_fmode", "_impure_ptr", "cygwin_attach_dll", "cygwin_premain0", "cygwin_premain1", "cygwin_premain2", "cygwin_premain3" et "environ". [Cette option est spécifique à la version du linker ciblant i386 PE]
--exclude-symbols symbole,symbole,...
Spécifie une liste de symboles qui ne doivent pas être automatiquement exportés. Les noms des symboles peuvent être délimités par des virgules ou des deux-points. [Cette option est spécifique au port i386 PE du linker]
--exclude-all-symbols
Spécifie qu'aucun symbole ne doit être automatiquement exporté. [Cette option est spécifique au port i386 PE du linker]
--file-alignment
Spécifie l'alignement du fichier. Les sections du fichier commencent toujours à des décalages de fichier qui sont des multiples de ce nombre. Par défaut, la valeur est 512. [Cette option est spécifique au port i386 PE du linker]
--heap reserve
--heap reserve,commit
Spécifie le nombre d'octets de mémoire à réserver (et éventuellement à allouer) pour être utilisés comme tas pour ce programme. Par défaut, 1 Mo est réservé et 4 Ko est alloué. [Cette option est spécifique au port i386 PE du linker]
--kill-at
Si cette option est spécifiée, les suffixes stdcall (@nn) seront supprimés des symboles avant qu'ils ne soient exportés. [Cette option est spécifique au port i386 PE du linker]
--large-address-aware
Si cette option est spécifiée, le bit approprié dans le champ « Caractéristiques » de l’en-tête COFF est défini pour indiquer que ce fichier exécutable prend en charge les adresses virtuelles supérieures à 2 gigaoctets. Cela doit être utilisé en conjonction avec l’option /3GB ou /USERVA=valeur mégaoctets dans la section « [systèmes d’exploitation] » du fichier BOOT.INI. Sinon, ce bit n’a aucun effet. [Cette option est spécifique aux ports PE du linker]
--disable-large-address-aware
Annule l’effet d’une option --large-address-aware précédente. Ceci est utile si --large-address-aware est toujours défini par le pilote du compilateur (par exemple, Cygwin gcc) et que le fichier exécutable ne prend pas en charge les adresses virtuelles supérieures à 2 gigaoctets. [Cette option est spécifique aux ports PE du linker]
--major-image-version valeur
Définit le numéro principal de la « version de l’image ». Par défaut, la valeur est 1. [Cette option est spécifique au port i386 PE du linker]
--major-os-version value
Définit le numéro principal de la « version du système d’exploitation ». La valeur par défaut est 4. [Cette option est spécifique à la version i386 PE du linker.]
--major-subsystem-version value
Définit le numéro principal de la « version du sous-système ». La valeur par défaut est 4. [Cette option est spécifique à la version i386 PE du linker.]
--minor-image-version value
Définit le numéro mineur de la « version de l’image ». La valeur par défaut est 0. [Cette option est spécifique à la version i386 PE du linker.]
--minor-os-version value
Définit le numéro mineur de la « version du système d’exploitation ». La valeur par défaut est 0. [Cette option est spécifique à la version i386 PE du linker.]
--minor-subsystem-version value
Définit le numéro mineur de la « version du sous-système ». La valeur par défaut est 0. [Cette option est spécifique à la version i386 PE du linker.]
--output-def file
Le linker créera le fichier file qui contiendra un fichier DEF correspondant à la DLL que le linker génère. Ce fichier DEF (qui doit être appelé « *.def ») peut être utilisé pour créer une bibliothèque d’importation avec « dlltool » ou peut être utilisé comme référence pour les symboles exportés automatiquement ou implicitement. [Cette option est spécifique à la version i386 PE du linker.]
--enable-auto-image-base
--enable-auto-image-base=value
Choisir automatiquement la base de l’image pour les DLL, éventuellement en commençant par la valeur base, sauf si une valeur est spécifiée à l’aide de l’argument « --image-base ». En utilisant un hachage généré à partir du nom de la DLL pour créer des bases d’image uniques pour chaque DLL, on évite les collisions en mémoire et les relocalisations qui peuvent retarder l’exécution du programme. [Cette option est spécifique à la version i386 PE du linker.]
--disable-auto-image-base
Ne pas générer automatiquement une base d’image unique. S’il n’y a pas de base d’image spécifiée par l’utilisateur (« --image-base »), utiliser la valeur par défaut de la plateforme. [Cette option est spécifique à la version i386 PE du linker.]
--dll-search-prefix string
Lors du lien dynamique vers une DLL sans bibliothèque d’importation, rechercher « <string><basename>.dll » au lieu de « lib<basename>.dll ». Ce comportement permet de faire facilement la distinction entre les DLL créées pour les différentes « sous-plateformes » : native, Cygwin, Uwin, PW, etc. Par exemple, les DLL Cygwin utilisent généralement « --dll-search-prefix=cyg ». [Cette option est spécifique à la version i386 PE du linker.]
--enable-auto-import
Effectuer un lien sophistiqué de « _symbol » vers « __imp__symbol » pour les importations de données à partir de DLL, ce qui permet de contourner le mécanisme dllimport côté utilisateur et de référencer des noms de symboles non modifiés. [Cette option est spécifique à la version i386 PE du linker.]
Les remarques suivantes concernent l’implémentation d’origine de la fonctionnalité et sont aujourd’hui obsolètes pour les cibles Cygwin et MinGW.
Remarque : L’utilisation de l’extension « auto-import » rendra la section de texte du fichier image accessible en écriture. Cela ne respecte pas la spécification du format PE-COFF publiée par Microsoft.
Remarque : l'utilisation de l'extension « auto-import » entraînera également le placement des données en lecture seule qui seraient normalement placées dans la section « .rdata » dans la section « .data » à la place. Ceci est fait afin de résoudre un problème avec les constantes qui est décrit ici : http://www.cygwin.com/ml/cygwin/2004-09/msg01101.html
L'utilisation de « auto-import » fonctionnera généralement « tel quel » — mais parfois, vous pouvez voir ce message :
« la variable « <var> » ne peut pas être importée automatiquement. Veuillez lire la documentation de l'option « --enable-auto-import » de ld pour plus de détails. »
Ce message se produit lorsqu'une expression (ou sous-expression) accède à une adresse qui est en fin de compte donnée par la somme de deux constantes (les tables d'importation Win32 n'autorisent qu'une seule). Les cas où cela peut se produire incluent l'accès aux champs membres de variables de structure importées à partir d'un DLL, ainsi que l'utilisation d'un index constant dans un tableau de variables importé à partir d'un DLL. Toute variable multi-mot (tableaux, structures, long long, etc.) peut déclencher cette condition d'erreur. Cependant, quel que soit le type de données exact de la variable exportée en cause, ld la détectera toujours, émettra l'avertissement et quittera.
Il existe plusieurs façons de résoudre cette difficulté, quel que soit le type de données de la variable exportée :
Une façon est d'utiliser l'option « --enable-runtime-pseudo-reloc ». Cela laisse la tâche d'ajuster les références dans votre code client pour l'environnement d'exécution, de sorte que cette méthode ne fonctionne que lorsque l'environnement d'exécution prend en charge cette fonctionnalité.
Une deuxième solution consiste à forcer l'une des « constantes » à être une variable, c'est-à-dire inconnue et non optimisable au moment de la compilation. Pour les tableaux, il existe deux possibilités : a) rendre l'index (l'adresse du tableau) une variable, ou b) rendre l'« index constant » une variable. Ainsi :
extern type extern_array[];
extern_array[1] -->
{ volatile type *t=extern_array; t[1] }
ou
extern type extern_array[];
extern_array[1] -->
{ volatile int t=1; extern_array[t] }
Pour les structures (et la plupart des autres types de données multi-mots), la seule option est de rendre la structure elle-même (ou le long long, ou le...) variable :
extern struct s extern_struct;
extern_struct.field -->
{ volatile struct s *t=&extern_struct; t->field }
ou
extern long long extern_ll;
extern_ll -->
{ volatile long long * local_ll=&extern_ll; *local_ll }
Une troisième méthode pour gérer cette difficulté consiste à abandonner « auto-import » pour le symbole en cause et à le marquer avec « __declspec(dllimport) ». Cependant, dans la pratique, cela nécessite l'utilisation de #defines au moment de la compilation pour indiquer si vous construisez un DLL, si vous construisez du code client qui sera lié au DLL, ou si vous construisez/liez simplement une bibliothèque statique. En faisant le choix entre les différentes méthodes pour résoudre le « problème d'adresse directe avec décalage constant », vous devez tenir compte de l'utilisation réelle typique :
Original :
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}
Solution 1 :
--foo.h
extern int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
/* Cette solution est pour win32 et cygwin ; ne pas « optimiser » */
volatile int *parr = arr;
printf("%d\n",parr[1]);
}
Solution 2 :
--foo.h
/* Remarque : l’exportation automatique est supposée (pas de __declspec(dllexport)) */
#if (defined(_WIN32) || defined(__CYGWIN__)) && \
!(defined(FOO_BUILD_DLL) || defined(FOO_STATIC))
#define FOO_IMPORT __declspec(dllimport)
#else
#define FOO_IMPORT
#endif
extern FOO_IMPORT int arr[];
--foo.c
#include "foo.h"
void main(int argc, char **argv){
printf("%d\n",arr[1]);
}
Une quatrième façon d’éviter ce problème consiste à revoir votre bibliothèque pour utiliser une
interface fonctionnelle plutôt qu’une interface de données pour les variables problématiques
(par exemple, des fonctions d’accès `set_foo()` et `get_foo()`).
--disable-auto-import
Ne tentez pas d’effectuer un chaînage sophistiqué de « \_symbol » vers « \_\_imp\_\_symbol » pour les
imports de DONNÉES à partir de DLL. [Cette option est spécifique à la version i386 PE du linker]
--enable-runtime-pseudo-reloc
Si votre code contient des expressions décrites dans la section --enable-auto-import, c’est-à-dire des
imports de DONNÉES à partir d’une DLL avec un décalage différent de zéro, cette option créera un
vecteur de « relocalisations pseudo au moment de l’exécution » qui peuvent être utilisées par l’environnement
d’exécution pour ajuster les références à ces données dans votre code client. [Cette option est spécifique à la
version i386 PE du linker]
--disable-runtime-pseudo-reloc
Ne créez pas de relocalisations pseudo pour les imports de DONNÉES à partir de DLL avec un décalage différent
de zéro. [Cette option est spécifique à la version i386 PE du linker]
--enable-extra-pe-debug
Affichez des informations de débogage supplémentaires relatives au chaînage des symboles d’importation
automatique. [Cette option est spécifique à la version i386 PE du linker]
--section-alignment
Définit l’alignement de section. Les sections en mémoire commenceront toujours à des adresses qui sont un
multiple de ce nombre. La valeur par défaut est 0x1000. [Cette option est spécifique à la version i386 PE du linker]
--stack reserve
--stack reserve,commit
Spécifiez le nombre d’octets de mémoire à réserver (et éventuellement à allouer) à utiliser comme pile
pour ce programme. La valeur par défaut est de 2 Mo réservés, 4 Ko alloués. [Cette option est spécifique à la
version i386 PE du linker]
--subsystem which
--subsystem which:major
--subsystem which:major.minor
Spécifie le sous-système sous lequel votre programme s’exécutera. Les valeurs valides pour which sont
« native », « windows », « console », « posix » et « xbox ». Vous pouvez également définir la version du
sous-système. Les valeurs numériques sont également acceptées pour which. [Cette option est spécifique à la
version i386 PE du linker]
Les options suivantes définissent des indicateurs dans le champ « DllCharacteristics » de l’en-tête de fichier
PE : [Ces options sont spécifiques aux versions PE du linker]
--high-entropy-va
--disable-high-entropy-va
L'image est compatible avec la randomisation de l'espace d'adressage (ASLR) sur 64 bits. Cette option est activée par défaut pour les images PE 64 bits dans les environnements MinGW.
Cette option implique également --dynamicbase et --enable-reloc-section.
--dynamicbase
--disable-dynamicbase
L'adresse de base de l'image peut être relocalisée à l'aide de la randomisation de l'espace d'adressage (ASLR). Cette fonctionnalité a été introduite avec MS Windows Vista pour les images PE i386. Cette option est activée par défaut pour les environnements MinGW, mais peut être désactivée via l'option --disable-dynamicbase. Cette option implique également --enable-reloc-section.
--forceinteg
--disable-forceinteg
Les contrôles d'intégrité du code sont appliqués. Cette option est désactivée par défaut.
--nxcompat
--disable-nxcompat
L'image est compatible avec la prévention de l'exécution des données (DEP). Cette fonctionnalité a été introduite avec MS Windows XP SP2 pour les images PE i386. L'option est activée par défaut pour les environnements MinGW.
--no-isolation
--disable-no-isolation
Bien que l'image prenne en charge l'isolation, n'isolez pas l'image. Cette option est désactivée par défaut.
--no-seh
--disable-no-seh
L'image n'utilise pas SEH. Aucun gestionnaire SE ne peut être appelé à partir de cette image. Cette option est désactivée par défaut.
--no-bind
--disable-no-bind
Ne liez pas cette image. Cette option est désactivée par défaut.
--wdmdriver
--disable-wdmdriver
Le pilote utilise le modèle de pilote MS Windows. Cette option est désactivée par défaut.
--tsaware
--disable-tsaware
L'image est compatible avec Terminal Server. Cette option est désactivée par défaut.
--insert-timestamp
--no-insert-timestamp
Insérez un horodatage réel dans l'image. Il s'agit du comportement par défaut, car il correspond au code existant et garantit que l'image fonctionnera avec d'autres outils propriétaires. Le problème avec ce comportement par défaut est qu'il entraînera la production d'images légèrement différentes chaque fois que les mêmes sources seront liées. L'option --no-insert-timestamp peut être utilisée pour insérer une valeur nulle pour l'horodatage, ce qui garantit que les binaires produits à partir de sources identiques seront identiques.
Si --insert-timestamp est activé, l'heure insérée est soit l'heure à laquelle a lieu le lien, soit, si la variable d'environnement "SOURCE_DATE_EPOCH" est définie, le nombre de secondes depuis l'époque Unix, comme spécifié par cette variable.
--enable-reloc-section
--disable-reloc-section
Créez la table de relocalisation de base, ce qui est nécessaire si l'image est chargée à une adresse de base différente de celle spécifiée dans l'en-tête PE. Cette option est activée par défaut.
La cible C6X uClinux utilise un format binaire appelé DSBT pour prendre en charge les bibliothèques partagées. Chaque bibliothèque partagée du système doit avoir un index unique ; tous les exécutables utilisent un index de 0.
--dsbt-size size
Cette option définit le nombre d'entrées dans la table DSBT de l'exécutable ou de la bibliothèque partagée actuelle sur la valeur spécifiée. Par défaut, une table de 64 entrées est créée.
--dsbt-index index
Cette option définit l’index DSBT de l’exécutable ou de la bibliothèque partagée actuelle à index. La valeur par défaut est 0, ce qui est approprié pour la génération d’exécutables. Si une bibliothèque partagée est générée avec un index DSBT de 0, les relocations "R_C6000_DSBT_INDEX" sont copiées dans le fichier de sortie.
L’option --no-merge-exidx-entries désactive la fusion des entrées exidx adjacentes dans les informations de déroulement de la pile.
--branch-stub
Cette option active la relaxation des branches du linker en insérant des sections de stub de branche lorsque cela est nécessaire pour étendre la portée des branches. Cette option n’est généralement pas requise, car C-SKY prend en charge les instructions de branche et d’appel qui peuvent accéder à la plage de mémoire complète, et la relaxation des branches est normalement gérée par le compilateur ou l’assembleur.
--stub-group-size=N
Cette option permet un contrôle plus précis de la création de stubs de branche par le linker. Elle définit la taille maximale d’un groupe de sections d’entrée qui peuvent être gérées par une seule section de stub. Une valeur négative de N place les sections de stub après leurs branches, tandis qu’une valeur positive permet aux sections de stub d’apparaître avant ou après les branches. Les valeurs de 1 ou -1 indiquent que le linker doit choisir des valeurs par défaut appropriées.
Les linkers 68HC11 et 68HC12 prennent en charge des options spécifiques pour contrôler le mappage de la commutation de banque de mémoire et la génération de code trampoline.
--no-trampoline
Cette option désactive la génération de trampoline. Par défaut, un trampoline est généré pour chaque fonction distante qui est appelée à l’aide d’une instruction « jsr » (cela se produit lorsqu’un pointeur vers une fonction distante est pris).
--bank-window name
Cette option indique au linker le nom de la région de mémoire dans la spécification MEMORY qui décrit la fenêtre de banque de mémoire. La définition d’une telle région est ensuite utilisée par le linker pour calculer le paginage et les adresses dans la fenêtre de mémoire.
Les options suivantes sont prises en charge pour contrôler la génération de GOT lors du linkage pour les cibles 68K.
--got=type
Cette option indique au linker le schéma de génération de GOT à utiliser. Le type doit être l’un des éléments suivants : single, negative, multigot ou target. Pour plus d’informations, consultez l’entrée Info pour ld.
Les options suivantes sont prises en charge pour contrôler la génération d’instructions microMIPS et les vérifications de relaxation des branches pour les transitions de mode ISA lors du linkage pour les cibles MIPS.
--insn32
--no-insn32
Ces options contrôlent le choix des instructions microMIPS utilisées dans le code généré par le linker, par exemple dans le PLT ou les stubs de liaison paresseuse, ou dans la relaxation. Si --insn32 est utilisé, le linker n’utilise que les encodages d’instructions 32 bits. Par défaut ou si --no-insn32 est utilisé, tous les encodages d’instructions sont utilisés, y compris les encodages 16 bits lorsque cela est possible.
--ignore-branch-isa
--no-ignore-branch-isa
Ces options contrôlent les vérifications de relaxation des branches pour les transitions de mode ISA non valides. Si --ignore-branch-isa est utilisé, le linker accepte toutes les relocations de branche et toute transition de mode ISA requise est perdue dans le calcul de la relocation, à l’exception de certains cas d’instructions « BAL » qui répondent aux conditions de relaxation et sont converties en instructions « JALX » équivalentes, car la relocation associée est calculée. Par défaut ou si --no-ignore-branch-isa est utilisé, une vérification est effectuée, ce qui entraîne la perte d’une transition de mode ISA et la génération d’une erreur.
--compact-branches
--no-compact-branches
Ces options contrôlent la génération d'instructions compactes par l'éditeur de liens dans les entrées PLT pour MIPS R6.
Pour la cible pdp11-aout, trois variantes du format de sortie peuvent être produites, sélectionnées par les options suivantes. La variante par défaut pour pdp11-aout est l'option --omagic, tandis que pour les autres cibles, --nmagic est la valeur par défaut. L'option --imagic est définie uniquement pour la cible pdp11-aout, tandis que les autres sont décrites ici telles qu'elles s'appliquent à la cible pdp11-aout.
-N
--omagic
Marque la sortie comme « OMAGIC » (0407) dans l'en-tête a.out pour indiquer que le segment de texte ne doit pas être protégé en écriture et partagé. Étant donné que les sections texte et données sont toutes deux lisibles et accessibles en écriture, la section de données est allouée immédiatement après le segment de texte. Il s'agit du format le plus ancien pour les programmes exécutables PDP11 et c'est la valeur par défaut de ld sur les systèmes PDP11 Unix, du début jusqu'à 2.11BSD.
-n
--nmagic
Marque la sortie comme « NMAGIC » (0410) dans l'en-tête a.out pour indiquer que lorsque le fichier de sortie est exécuté, la partie texte sera en lecture seule et partagée entre tous les processus exécutant le même fichier. Cela implique de déplacer les zones de données vers le premier seuil de page possible de 8 Ko après la fin du texte. Cette option crée un format exécutable pur.
-z
--imagic
Marque la sortie comme « IMAGIC » (0411) dans l'en-tête a.out pour indiquer que lorsque le fichier de sortie est exécuté, les zones de texte et de données du programme seront chargées dans des espaces d'adressage distincts à l'aide de la fonctionnalité d'instruction et d'espace de données séparés de l'unité de gestion de la mémoire des modèles plus grands du PDP11. Cela double l'espace d'adressage disponible pour le programme. La seule différence de format de sortie entre cette option et les autres, en plus du numéro magique, est que les sections texte et données commencent toutes les deux à l'emplacement 0. L'option -z sélectionnait ce format dans 2.11BSD. Cette option crée un format exécutable distinct.
--no-omagic
Équivalent à --nmagic pour pdp11-aout.
ENVIRONNEMENT
Vous pouvez modifier le comportement de ld avec les variables d'environnement « GNUTARGET », « LDEMULATION » et « COLLECT_NO_DEMANGLE ».
« GNUTARGET » détermine le format de fichier objet d'entrée si vous n'utilisez pas -b (ou son synonyme --format). Sa valeur doit être l'un des noms BFD pour un format d'entrée. S'il n'y a pas de « GNUTARGET » dans l'environnement, ld utilise le format naturel de la cible. Si « GNUTARGET » est défini sur « default », BFD tente de découvrir le format d'entrée en examinant les fichiers binaires d'entrée ; cette méthode réussit souvent, mais il existe des ambiguïtés potentielles, car il n'existe aucun moyen de garantir que le numéro magique utilisé pour spécifier les formats de fichiers objets est unique. Cependant, la procédure de configuration de BFD sur chaque système place le format conventionnel de ce système en premier dans la liste de recherche, de sorte que les ambiguïtés sont résolues en faveur de la convention.
"LDEMULATION" détermine l’émulation par défaut si vous n’utilisez pas l’option -m. L’émulation peut
affecter divers aspects du comportement de l’éditeur de liens, en particulier le script de l’éditeur de liens par défaut. Vous pouvez lister les émulations disponibles avec les options --verbose ou -V. Si l’option -m n’est pas utilisée et que la variable d’environnement "LDEMULATION" n’est pas définie, l’émulation par défaut dépend de la façon dont l’éditeur de liens a été configuré.
Normalement, l’éditeur de liens désintègre par défaut les symboles. Cependant, si "COLLECT_NO_DEMANGLE" est défini dans l’environnement, il ne désintègrera pas les symboles. Cette variable d’environnement est utilisée de manière similaire par le programme wrapper de l’éditeur de liens "gcc". La valeur par défaut peut être remplacée par les options --demangle et --no-demangle.
Si l’option spécifique PE/COFF --insert-timestamp est active et que la variable d’environnement SOURCE_DATE_EPOCH est définie, la valeur de l’horodatage dans cette variable sera insérée dans l’en-tête COFF au lieu de l’heure actuelle.
Si la variable d’environnement "LD_STATS" est définie, les informations sur l’utilisation des ressources de l’éditeur de liens seront enregistrées, comme si l’option --stats avait été utilisée. Si la variable "LD_STATS" a une valeur de chaîne, cette valeur sera utilisée comme nom du fichier dans lequel les informations doivent être stockées. Sinon, les informations seront envoyées au flux de sortie standard.
VOIR AUSSI
ar(1), nm(1), objcopy(1), objdump(1), readelf(1) et les entrées Info pour binutils et ld.
COPYRIGHT
Copyright (c) 1991-2025 Free Software Foundation, Inc.
La permission est accordée de copier, distribuer et/ou modifier ce document selon les termes de la GNU Free Documentation License, Version 1.3 ou toute version ultérieure publiée par la Free Software Foundation ; sans sections invariantes, sans textes de couverture et sans textes de quatrième de couverture. Une copie de la licence est incluse dans la section intitulée « GNU Free Documentation License ».