2017-01-30 4 views
0

Est-il possible d'utiliser un script d'éditeur de liens ou un fichier mapfile pour renommer un symbole? J'essaye d'adapter du code écrit dans un mélange de C++ et de Fortran pour qu'il fonctionne avec plus d'un compilateur Fortran - sous Linux. Il est actuellement écrit pour le compilateur Solaris Studio avec l'option de sensibilité à la casse activée. Je voudrais gérer les variations dans le nom du symbole Fortran mangling automatiquement (comme dans le Makefile).renommer un symbole à l'aide d'un script d'éditeur de liens

Il ne semble pas être possible de créer des alias ainsi, un script de liaison contenant:

C_Function_ = c_function; 

triera-travail. Malheureusement, ajouter l'option -T pour faire référence à ce script provoque d'autres changements de comportement et j'obtiens des erreurs dues au fait que libdl.so.2/librt.so.1 n'est pas trouvé. Existe-t-il une sorte de script d'éditeur de liens par défaut que je dois inclure ou quelque chose? J'ai essayé avec les linkers bfd et gold sur Linux.

Répondre

2

Vous ne pouvez pas renommer vraiment des symboles, mais vous pouvez définir des alias des symboles existants comme

PROVIDE(c_function = C_function_); 
... 

dans un script de liaison.

Si vous passez ce script de liaison avec l'option -T-ld, il remplacera le script éditeur de liens (par défaut) d'origine. Si vous préférez avoir le script de l'éditeur de liens étendre la valeur par défaut, passez-le sans l'option -T (comme vous le feriez avec un fichier objet supplémentaire).

De cette façon, tout devrait fonctionner comme prévu.

+0

Merci, en omettant le '-T' résout cela. Que fait le 'PROVIDE'? Cela l'empêche de fonctionner dans le cas où le symbole est compilé dans une bibliothèque partagée. – okapi

+0

'PROVIDE()' garantit que le symbole est seulement aliasé si le nom utilisé n'existe pas déjà. Je ne sais pas pourquoi cela devrait entrer en conflit avec la construction d'une bibliothèque partagée, cependant. – mfro