Si une fonction de bibliothèque standard est réimplémentée, laquelle des deux est appelée?

Si une fonction de bibliothèque comme par exemple malloc est réimplémentée, il existe deux symboles portant ce nom, l’un dans un fichier object local et l’autre dans la bibliothèque système. Lequel des deux est utilisé quand une fonction par exemple stdio est utilisée, qui appelle malloc (et pourquoi)?

Le comportement du lien est, d’une manière générale:

  • Inclure tous les symboles définis dans les fichiers objects.
  • Ensuite, résolvez les non définis en utilisant les objects dans les bibliothèques.

Ainsi, si malloc est réimplémenté et lié en tant que fichier object, la version du fichier object remplacera la version des bibliothèques standard. Cependant, si le nouveau malloc est lié en tant que bibliothèque, cela dépend de l’ordre des liens entre les bibliothèques.

Une autre façon, en considérant le gnu binutils comme une scope, de remplacer les fonctions de la bibliothèque consiste à envelopper la fonction à l’aide du paramètre –wrap: https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ ld_3.html

En utilisant l’option –wrap ld, nous pouvons faire en sorte que les deux fonctions soient liées et que la fonction wrapper puisse appeler celle qui est enveloppée.

L’ordre de liaison dépend également de l’ordre des parameters de la ligne de commande. Donc, je considère ici que les libs sont listés après des objects car, en général, cela n’a pas de sens de placer les librairies avant les objects car leur objective est de fournir les symboles manquants demandés par ceux-ci.

Une réponse est que vous rencontrez énormément de problèmes en essayant de remplacer malloc. Ne pas y aller N’y pense même pas. Surtout si vous avez besoin de poser des questions sur stackoverflow, n’y pensez même pas.

Une autre réponse est que vous invoquez un comportement non défini, et le résultat probable est que la fonction malloc sera appelée pour vous nuire le plus. Si vous avez de la chance, en développement. Si vous avez moins de chance, une fois que votre code est entre les mains des clients. Ne le fais pas

Ecrire des wrappers autour de malloc avec de nouveaux noms est déjà assez grave. Essayer de remplacer malloc, c’est de la folie.