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

时间:2011-07-12 23:53:47

标签: c libc

  

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

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

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

2 个答案:

答案 0 :(得分:9)

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

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

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

答案 1 :(得分:1)

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