Libtool supprime-t-il toutes les options avec -M?

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

  • L’option -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).