在直接绑定(-B direct)出现之前,libc提供了很多 具有两个名称的函数。例如,getpwent()和_getpwent()。 这两个名称在libc中完全相同。
libc如何使两个函数名指向同一个实现?
我认为它不应该像写两次相同的代码那么容易。
答案 0 :(得分:9)
这是通过弱别名完成的一个“非标准”链接器技巧,自早期unices以来一直存在,并且我所知道的所有unix编译器/链接器都支持它。它基本上完成了:
void __foo(void);
void foo(void) __attribute__((weak, alias("__foo")));
通常用宏来抽象它一点点。这使得符号foo
默认具有与符号__foo
相同的地址和类型,但允许它被其他地方的“强”定义覆盖。
答案 1 :(得分:1)
getpwent()实现只是简单地调用_getpwent()。这样做的原因是隐藏函数调用中的一些功能,并避免称为命名空间污染。通过这种方式,您可以创建一种抽象,允许您隐藏用户的内容。同样领先的下划线和双下划线是系统保留的,并且是备份,以确保您不会覆盖诸如宏定义之类的内容。