libc如何提供两个名称的函数?

在直接绑定(-B direct)出现之前,libc提供了许多具有两个名称的函数。 例如,getpwent()和_getpwent()。 这两个名称在libc中引用了完全相同的function。

libc如何使两个函数名指向同一个实现?

我认为它不应该像写两次相同的代码那么容易。

它是通过弱别名完成的,这是一种“非标准”链接器技巧,自早期unices以来一直存在,并且得到了我所知道的所有unix编译器/链接器的支持。 它基本上完成为:

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

通常用宏来抽象它一点点。 这使得符号foo默认具有与符号__foo相同的地址和类型,但允许它被其他地方的“强”定义覆盖。

getpwent()实现只是简单地调用_getpwent()。 这样做的原因是隐藏函数调用中的一些function,并避免称为命名空间污染。 通过这种方式,您可以创建一种抽象,允许您隐藏用户的内容。 同样领先的下划线和双下划线是系统保留的,并且是备份,以确保您不会覆盖诸如宏定义之类的内容。