J’essaie de localiser un échec de la liaison avec un fichier map sur Solaris. Le fichier mapfile manquant provoque l’erreur suivante lorsque j’essaie d’exécuter nos tests automatiques:
$ ./cryptestcwd v ld.so.1: cryptestcwd: fatal: /export/home/cryptopp/.libs/libcryptopp.so.6: hardware capability (CA_SUNW_HW_1) unsupported: 0x4800000 [ AES SSE4.1 ] Killed
Je suis allé aussi loin que cette règle Automake. libcryptopp_la_LINK
est manquant pour AM_LDFLAGS
. AM_LDFLAGS
contient l’option -M cryptopp.mapfile
.
libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libcryptopp_la_LDFLAGS) $(LDFLAGS) -o $@
J’ai essayé de le corriger avec sed
après la configure
:
libcryptopp_la_LINK = $(LIBTOOL) --tag=CXX $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CXXLD) $(AM_CXXFLAGS) \ $(CXXFLAGS) $(libcryptopp_la_LDFLAGS) -M cryptopp.mapfile $(LDFLAGS) -o $@
J’ai confirmé que le sed
est réussi, mais le même test échoue à nouveau. Lorsque les commandes sont appelées, -M
est manquant.
Le manuel libtool parle des arguments -M
sur Cygwin, mais pas de Solaris (et la discussion s’applique uniquement à GCC, pas aux autres compilateurs tels que IBM XL C / C ++, Sun C / C ++ et LLVM Clang):
Notez que vous devez également vous assurer que les répertoires Unix standard (tels que / bin, / lib, / usr, / etc) apparaissent à la racine du lecteur. Cela signifie que vous devez installer Cygwin lui-même dans le répertoire racine C: / (ou D: /, ou E: /, etc.), au lieu de l’installation recommandée dans C: / cygwin /. En outre, tous les noms de fichier utilisés dans le système de construction doivent être relatifs, les liens symboliques ne doivent pas être utilisés dans les arborescences de répertoires sources ou de construction, et toutes les options -M * de gcc, à l’exception de -MMD, doivent être évitées.
Il n’y a aucune autre mention de -M
.
Et il n’ya pas de diagnostic, comme “Suppression des options -M
dans l’éditeur de liens Sun” ou “Avertissement: libtool
ne comprend pas l’option -M
“ .
Ma question est la suivante: libtool
-M
et ses arguments pour une raison quelconque?
Libtool supprime certaines options de lien lors de la création d’une bibliothèque. Le manuel explique :
Lors de la création d’une bibliothèque partagée, mais pas lors de la compilation ou de la création d’un programme, libtool supprime certains indicateurs de la ligne de commande fournie par l’utilisateur. Cela est dû au fait que les indicateurs inconnus de libtool peuvent interférer avec la création de la bibliothèque ou requérir un support supplémentaire de libtool, et que le fait d’omettre des indicateurs est généralement le choix conservateur pour une construction réussie.
Personnellement, j’estime que la justification de ce comportement est un peu cavalière, et je pense en outre que cela justifie un avertissement de la part de libtool
, mais à moins que vous ne libtool
soulever un problème à ce sujet, c’est quasiment théorique.
L’expérimentation montre que -M
fait en effet partie des options proposées par libtool
. En particulier, si je spécifie LDFLAGS
contenant une option -M
sur la ligne de commande make
, je peux l’observer en écho dans la sortie make
lorsqu’il exécute le lien libtool
, mais pas dans le propre écho de la commande link réellement exécutée par libtool
. :
$ make LDFLAGS = “- M mapfile”
/ bin / sh ./libtool –tag = CC –mode = lien gcc -g -O2 -M fichier- map -o libmylib.la -rpath / usr / local / lib x.lo y.lo
libtool: link: gcc -shared -fPIC -DPIC .libs / xo .libs / yo -O2 -Wl, -soname -Wl, libmylib.so.0 -o .libs / libmylib.so.0.0.0
La documentation libtool
suggère deux solutions de contournement pour transmettre des options de lien qui seraient supprimées autrement:
Pour les options authentiques de l’ éditeur de liens, vous pouvez utiliser une ou plusieurs options -Xlinker
ou -Xlinker
pour transmettre vos options à libtool
et au pilote de l’éditeur de liens à l’éditeur de liens lui-même. Par exemple,
LDFLAGS=-Wl,-M,cryptopp.mapfile
Pour les options destinées spécifiquement au pilote de l’éditeur de liens, la documentation suggère d’append les indicateurs à la commande du pilote du compilateur (CC = “gcc -M mapfile”), mais cette libtool
est inefficace car la variable $(CC)
est développée par make
pour former libtool
ligne de commande, laissant toutes les options qu’il exprime exposées à libtool
pour le ssortingpping.
De plus, cependant, il y a
-XCClinker
selon laquelle les options peuvent être transmises au pilote de l’éditeur de liens (par opposition à l’éditeur de liens lui-même), mais son comportement semble un peu bizarre: il semble ignorer les options qui ne commencent pas par un trait d’union (tel que le nom de votre fichier de carte).