RTLD_FIRST на Mac выполняет работу RTLD_DEEP_BIND на Linux? - PullRequest
2 голосов
/ 26 августа 2011

Мое понимание RTLD_DEEP_BIND в linux заключается в том, что если у вас есть функция A () в основной программе и две функции A () и B () в динамически связанной библиотеке (назовите ее lib), где B определяется как

B()
{
   A();
}

Тогда вызов B () ВСЕГДА будет заканчиваться вызовом A из библиотеки.Это работа, которую RTLD_FIRST делает на Mac?Извините - меня смущают документы.

Ответы [ 2 ]

2 голосов
/ 08 августа 2014

То, что RTLD_DEEPBIND, по-видимому, используется по умолчанию в OS X. В OS X по умолчанию используется нечто, называемое двухуровневым пространством имен для динамических библиотек.(Вы можете принудительно использовать плоские пространства имен либо во время соединения, либо во время загрузки.) В двухуровневом пространстве имен ссылки на символы записывают не только имя символа, но и библиотеку, с которой символ был разрешен во время ссылки.Затем во время загрузки символ разрешается только для той же библиотеки.

1 голос
/ 08 августа 2014

Нет. RTLD_FIRST - это просто флаг, который влияет на поведение dlsym при вызове с результирующим дескриптором, а RTLD_DEEPBIND влияет на то, как символы разрешаются при загрузке библиотеки. Они оба довольно плохо документированы, но эту информацию я нашел на страницах руководства для OSX и Linux.

...