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