什么是“名称空间清洁度”,glibc如何实现?

JL2*_*210 8 c posix libc language-lawyer

我最近在@zwol的回答中遇到了这一段:

__libc_上前缀read是因为实际上有三个不同的名字read在C库:read__read,和__libc_read。这是一种实现“命名空间整洁”的技巧,如果您打算实施完全成熟且完全符合标准的C库,则只需担心。简短的版本是C库中有许多需要调用的函数read,但是其中一些不能使用名称 read来调用它,因为从技术上来讲,允许C程序定义一个名为read自身的函数。

你们中有些人可能知道,我正着手实现自己的完全成熟且完全符合标准的C库,因此我想了解更多详细信息。

什么是“名称空间清洁度”,glibc如何实现?

Kaz*_*Kaz 7

首先,请注意,标识符read完全不被ISO C保留。严格符合ISO C规范的程序可以具有称为的外部变量或函数read。但是,POSIX具有称为的功能read。那么我们如何拥有一个read同时允许C程序的POSIX平台呢?毕竟freadfgets可能使用read; 他们不会休息吗?

一种方法是分裂的所有POSIX的东西单独的库中:用户必须链接-lio或任何获得readwrite等功能(再有fread,并getc使用一些替代读功能,因此他们即使不工作-lio)。

glibc中的方法不是使用符号read,而是使用__libc_read保留名称空间中的替代名称来避免出现这种情况。readPOSIX程序的可用性是通过为制作read一个弱别名来实现的__libc_read。外部引用read但未定义的程序将到达read别名为的弱符号__libc_read。定义的程序read将覆盖弱符号,并且它们对它们的引用都read将被覆盖。

重要的是,这对没有影响__libc_read。此外,图书馆本身,需要使用的read功能,调用其内部__libc_read名称是由程序不受影响。

因此,所有这些都增加了清洁度。这不是在具有许多组件的情况下可行的名称空间整洁的通用形式,但是它在两方情况下起作用,其中我们唯一的要求是将“系统库”和“用户应用程序”分开。