Comment la libc fournit-elle des fonctions avec deux noms?

Avant l’avènement de la liaison directe (-B direct), la libc fournissait de nombreuses fonctions avec deux noms. Par exemple, getpwent () et _getpwent (). Ces deux noms font référence à la même fonction dans libc.

Comment la libc fait-elle que deux noms de fonctions pointent vers la même implémentation?

Je pense que cela ne devrait pas être aussi simple que d’écrire deux fois le même code.

Cela se fait via des alias faibles, un truc “non standard” pour les lieurs, qui existe depuis les premières unités et qui est supporté par tous les compilateurs / linkers Unix que je connaisse. C’est essentiellement fait comme:

void __foo(void); void foo(void) __atsortingbute__((weak, alias("__foo"))); 

souvent avec des macros pour le résumer un peu. Cela __foo que le symbole foo aura la même adresse et le même type que le symbole __foo par défaut, mais permet de le remplacer par une définition “forte” ailleurs.

L’implémentation de getpwent () appelle simplement _getpwent () aussi simple que cela. Ceci est fait pour masquer certaines fonctionnalités des appels de fonction et pour éviter quelque chose appelé pollution des espaces de noms. De cette façon, vous pouvez créer une sorte d’abstraction qui vous permet de cacher des choses à l’utilisateur. Les traits de soulignement et doubles soulignements sont également réservés par le système et sont des sauvegardes destinées à vous assurer de ne pas remplacer quelque chose comme les définitions de macro.