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

Je *_*Rog 4 c libc

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

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

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

R..*_*R.. 9

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

void __foo(void);
void foo(void) __attribute__((weak, alias("__foo")));
Run Code Online (Sandbox Code Playgroud)

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

  • 不,为了在libc**中内部使用**而不是在用户程序中,需要别名.libc中的函数不能调用`getpwent`,因为`getpwent`不是C语言的一部分,应用程序可以很好地定义一个名为`getpwent`的函数来完成不同的操作.因此,如果libc中的函数需要为某个内部目的查找用户,则可能会调用`__getpwent`.此名称保留给实现,因此用户程序(重新)定义它(调用UB)是非法的. (2认同)