En C, est-il possible de changer le nom de la fonction exscope en un autre?

tout.

Je veux lier une bibliothèque qui appelle la fonction malloc() . Cependant, mon environnement cible est différent et malloc() est fourni en tant que fonction inline.

Comment puis-je faire l’appel de la bibliothèque à malloc() directement à la routine malloc() de mon environnement cible?

Est-il possible de changer le nom de la fonction exscope? Si tel est le cas, je peux d’abord coder my_malloc() , l’exporter en tant que malloc() et lier la bibliothèque à celle-ci:

 #include  // malloc() is inline function declared there void my_malloc (void) { malloc (void); } 

Plus spécifiquement, la librairie est une dissortingbution linux et dépend donc de libc. Mais mon environnement est intégré et ne possède pas de bibliothèque libc et malloc() , free() , … sont implémentés de manière personnalisée. Certaines sont des fonctions en ligne et d’autres des fonctions de bibliothèque.

L’éditeur de liens GNU (ld) prend en charge un paramètre --wrap=functionname . Je citerai simplement la documentation de la page de manuel car elle contient un exemple qui devrait faire exactement ce dont vous avez besoin:

–wrap = symbol Utilisez une fonction wrapper pour le symbole. Toute référence indéfinie au symbole sera résolue en “__wrap_symbol”. Toute référence non définie à “__real_symbol” sera résolue en symbole.

Ceci peut être utilisé pour fournir un wrapper pour une fonction système. La fonction wrapper doit s’appeler “__wrap_symbol”. S’il souhaite appeler la fonction système, il doit appeler “__real_symbol”.

Voici un exemple sortingvial:

 void * __wrap_malloc (size_t c) { printf ("malloc called with %zu\n", c); return __real_malloc (c); } 

Si vous liez un autre code à ce fichier en utilisant --wrap malloc , tous les appels à ” malloc ” appellent alors la fonction "__wrap_malloc “. L’appel à ” __real_malloc ” dans ” __wrap_malloc ” appellera la vraie fonction ” malloc “.

Vous voudrez peut-être fournir une fonction ” __real_malloc ” afin que les liens sans l’option --wrap réussissent. Si vous faites cela, vous ne devriez pas mettre la définition de ” __real_malloc ” dans le même fichier que ” __wrap_malloc “; Si vous le faites, l’assembleur peut résoudre l’appel avant que l’éditeur de liens ait une chance de l’envelopper à ” malloc “.

Je pense que l’atsortingbut alias pourrait résoudre votre problème:

 alias ("target") The alias atsortingbute causes the declaration to be emitted as an alias for another symbol, which must be specified. For instance, void __f () { /* Do something. */; } void f () __atsortingbute__ ((weak, alias ("__f"))); defines `f' to be a weak alias for `__f'. In C++, the mangled name for the target must be used. It is an error if `__f' is not defined in the same translation unit. Not all target machines support this atsortingbute. 

http://gcc.gnu.org/onlinedocs/gcc/Function-Atsortingbutes.html

Qu’en est-il de:

 #define malloc my_malloc #include  #undef malloc int malloc(size_t sz) { return my_malloc(sz); } #define malloc my_malloc // use your malloc here