Habillage des symboles lors de la liaison sur OS X

J’essaie d’envelopper un symbole par un autre pendant le lien. Si j’ai bien compris, cela se fait facilement avec l’option ld –wrap, mais elle n’est pas disponible sous OS X. Il y a ‘-idefinition: indirection’, voici comment j’essaie de sortingcher main pour qu’il affiche 42:

a.cpp:

int foo() { return 1; } 

b.cpp:

 int wrap_foo() { return 42; } 

main.cpp:

 #include  int foo(); int wrap_foo(); int main() { printf("%d\n", foo()); } 

Comment je les construis et les relie:

 $ gcc -c *.cpp $ gcc -Wl,-i__Z3foov:__Z8wrap_foov *.o duplicate symbol __Z3foov in: ao bo ld: 1 duplicate symbol for architecture x86_64 

Est-il même possible de réaliser ce que je veux?


EDIT: Dans ma tâche, je n’ai pas le contrôle sur a.cpp et main.cpp (je n’ai que des objects pour eux), mais je peux écrire n’importe quel code et faire tout ce dont j’ai besoin avec les objects avant link.

J’ai trouvé la suite suivante qui concernait une tâche similaire (et la décrit mieux) GNU gcc / ld – encapsulant un appel à symbol avec l’appelant et l’appelé définis dans le même fichier object Relecture des réponses déjà présent et je vais avoir une collision.

Comment supprimer foo d’ao sans toucher au code source?

Est-ce que cela doit être fait à la liaison contre l’exécution? Notez parfaitement ce que vous essayez de faire, alors il vous suffit de demander.

Le problème avec l’utilisation de cette commande est la création d’un nouveau symbole, raison pour laquelle vous obtenez le symbole dupliqué.

 -alias symbol_name alternate_symbol_name Create an alias named alternate_symbol_name for the symbol symbol_name. By default the alias symbol has global visibil- ity. This option was previous the -idef:indir option. 

Si vous n’avez pas un fichier.cpp qui définit foo (c’est-à-dire que vous omettez foo), vous pouvez faire quelque chose comme ceci:

 tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov bo main.o tmp$ ./a.out 42 

Ce que vous pouvez toujours faire est de faire en sorte que a.cpp ait un autre foo comme original_foo . De cette façon, si vous vouliez cette implémentation, vous pouvez utiliser un alias pour mapper cela sur foo . Pas parfait, mais cela donnerait à peu près ce que vous voulez. Vous êtes déjà en train de tenter de l’ajuster au niveau du lien, de sorte que cela semble potentiellement acceptable.