Как libc предоставляет функции с двумя именами? - PullRequest
4 голосов
/ 13 июля 2011

До появления прямой привязки (-B direct) libc предоставил много функции с двумя именами. Например, getpwent () и _getpwent (). Эти два имени относятся к одной и той же функции в libc.

Как libc заставляет два имени функции указывать на одну и ту же реализацию?

Я думаю, что это не должно быть так просто, как писать один и тот же код дважды.

Ответы [ 2 ]

9 голосов
/ 13 июля 2011

Это делается с помощью слабых псевдонимов"нестандартного" трюка с компоновщиком, который использовался с ранних версий и поддерживается всеми известными мне компиляторами / компоновщиками Unix.В основном это делается так:

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

часто с макросами, чтобы немного абстрагировать его.Это делает его таким, что символ foo будет иметь тот же адрес и тип, что и символ __foo по умолчанию, но позволяет переопределить его «сильным» определением где-то еще.

1 голос
/ 13 июля 2011

Реализация getpwent () просто вызывает _getpwent ().Это делается для того, чтобы скрыть некоторые функциональные возможности от вызовов функций и избежать того, что называется загрязнением пространства имен.Таким образом, вы можете создать своего рода абстракцию, которая позволяет скрывать вещи от пользователя.Кроме того, ведущие и двойные подчеркивания зарезервированы системой и являются резервными копиями, чтобы гарантировать, что вы не переопределите что-либо, например, в определениях макросов.

...