Relatif à un précédent Question de la mine
J'ai interposé avec succès c'est avec certains hôtes, voici mon code: p> maintenant, quand Je fais ce qui suit, je reçois une boucle infinie suivie d'une faute SEG, par exemple: p> Toutefois si je commencez le alors peut-être avec "LS" qui signifie éditer
Notez que le programme hôte suivant fonctionne correctement - malloc code>, mais
calloc code> semble être plus problématique. P>
calloc code > se bloque dans une boucle infinie avec un possible interne
calloc code> appel interne
dlsym code>. Cependant, un hôte de test de base n'expose pas ce comportement, mais la commande "ls" de mon système fait. P>
interposeur de calloc code> interposant, il Presque semble em> fonctionner: p>
init () code> est appelé deux fois. p>
init () code> est uniquement appelé une seule fois, et
calloc code> est interposé avec succès, comme vous pouvez le constater à partir de la sortie. p>
5 Réponses :
En ce qui concerne En ce qui concerne le __ nano_init () code> être appelé deux fois: vous avez déclaré la fonction en tant que constructeur, il est donc appelé lorsque la bibliothèque est chargée et qu'elle s'appelle une seconde fois explicitement lorsque votre
MALLOC () code> et
calloc () code> Les implémentations sont d'abord appelées. Choisir un. P>
calloc () code> Interposeur Crashing Votre application: certaines des fonctions que vous utilisez, y compris
dlsym () code> et
fprintf () < / Code> peut-être eux-mêmes tenter d'allouer de la mémoire, appelant vos fonctions d'interpose. Considérez les conséquences et agissez en conséquence. P>
Voir mon édition avec un exemple d'hôte qui semble fonctionner correctement.
La deuxième partie de votre réponse est correcte. La première partie sur le constructeur n'est pas, car le remplacement se produit avant le constructeur - uniquement pour certains exécutables, qui finissent par appeler l'init deux fois directement (pas via constructeur).
Il est possible que ce qui se passait la première fois autour était que certains exécutables appelleraient masloc () code> /
calloc () code> dans leurs propres initialisateurs avant le tour de la vôtre.
Utilisation de dlsym code> L'accrochage basé sur le dlsym peut entraîner des crashs, comme
dlsym code> rappelle dans l'allocator de la mémoire. Au lieu d'utiliser Hooks MALLOC , comme je l'ai suggéré dans votre question préalable ; Ceux-ci peuvent être installés sans invoquer
dlsym code> du tout. p>
Ok je vais juste supposer dans ce cas dlsym code> ne fonctionnera pas - malgré les nombreux exemples sur Internet qui montrent de remplacer les fonctions de mémoire avec elle. Je vais essayer de formuler une nouvelle question alors montrant l'un de ces exemples.
@Justicle, juste parce que cela pourrait avoir travaillé si vous n'avez accroché que certaines des fonctions, ou peut-être avoir travaillé à un moment donné dans le passé, cela ne signifie pas que cela fonctionnera avec de nouvelles versions de Glibc. Utilisez les fonctions de crochet; Ce sont les seuls ceux qui sont garantis pour fonctionner correctement.
En outre, il n'y a aucune mention de problèmes avec dlsym code> dans tous les exemples que je peux trouver, et jusqu'à présent, je n'ai pas trouvé personne indiquant pourquoi les crochets seraient meilleurs que le précharge. Je suppose que je ne peux pas croire que je suis la première personne à essayer ceci ...
Peut-être qu'ils n'essayent pas avec calloc code>? En tout cas, il est suffisamment clair que cela ne fonctionne pas, et glibc a cette belle fonctionnalité qui fait ce que vous voulez de manière prise en charge, alors utilisez-le déjà :)
OK Le centime vient de laisser tomber: d Allocators de remplacement qui fonctionnent via LD_ProLoad fournissent un remplacement complet i> pour les fonctions de mémoire, pas seulement un passage à travers. Donc, 1) Il n'y a pas de question "my_awesum_calloc" impliquée par libc fonctionne comme dlsym code>. et 2) L'appel DLSYM n'est pas nécessaire, car vous n'avez pas besoin de l'ancienne mise en œuvre.
@Justicule, et i> il fournit un pointeur de fonction directe à la mise en œuvre originale sans vous déranger avec DLSYM :) [Notez que DLSym et vos amis i> retourneront dans votre calloc de remplacement - mais depuis Vous avez le pointeur à l'original sans utiliser dlsym, ce n'est pas un problème]
Les crochets sont obsolètes, car ils ne sont pas un fil de sécurité. Voir la section Notes dans ce lien Man7.org/Linux/man-pages/ Man3 / Malloc_hook.3.html . De plus, je ne pense pas que les crochets couvrent CalloC.
Vous pouvez vous éloigner d'un calloc pauvre préliminaire qui retourne simplement NULL. Cela fonctionne réellement sur Linux, YMMV.
static void* poor_calloc(size_t nmemb, size_t size) { // So dlsym uses calloc internally, which will lead to infinite recursion, since our calloc calls dlsym. // Apparently dlsym can cope with slightly wrong calloc, see for further explanation: // http://blog.bigpixel.ro/2010/09/interposing-calloc-on-linux return NULL; // This is a poor implementation of calloc! }
Je sais que je suis un peu en retard (6 ans). Mais je voulais remplacer calloc () code> aujourd'hui et faire face à un problème car
dlsym () code> utilise en interne
calloc () code>. J'ai résolu l'utilisation d'une technique simple et j'ai pensé à le partager ici:
tampon code> satisfait à la nécessité de
dlsym () code> jusqu'à ce que le vrai
calloc () code> a été localisé et mon "code> pointeur de fonction calloc_ptr code> initialisé" p> p>
Vous pouvez également utiliser SBRK pour allouer la mémoire pour "Mauvais CalloC". P>
Vérifiez cette solution: blog.bigpixel.ro/2010/09/interpose -Calloc-on-Linux ça marche même que ça ne devrait pas ...