Нужна хорошая документация по линкеру! - PullRequest
4 голосов
/ 19 февраля 2010

Мне нужно написать небольшую библиотеку, которая будет загружена установкой LD_PRELOAD и которая переопределит некоторые функции в стандартной библиотеке C, но также вызовет эти функции в стандартной библиотеке. В частности, я хочу, чтобы моя новая блестящая библиотека позволяла пользователям предоставлять свой собственный resolv.conf, чтобы они могли, например, указать свой домен по умолчанию или установить в нем псевдонимы для длинных имен хостов. Мне понадобится хорошее понимание того, как работает компоновщик, если я собираюсь сделать это, поэтому кто-нибудь может указать мне какую-то хорошую документацию, которая не предполагает, что я все это уже знаю и просто нужна ссылка, но также не предполагает, что я полный идиот?

Ответы [ 3 ]

3 голосов
/ 19 февраля 2010

Если вы используете компоновщик GNU, вам нужно знать одну вещь - RTLD_NEXT. Это позволяет вам «найти следующее вхождение функции в порядке поиска после текущей библиотеки».

Таким образом, вы можете переопределить стандартную функцию и по-прежнему иметь возможность вызывать оригинальную версию.

Я использовал эту функцию в версии malloc, которая отслеживает статистику распределения. Мне нужно было переопределить malloc для сбора статистики, но я все еще хотел, чтобы исходная версия malloc выполняла распределение:

static void *(*next_malloc)(size_t) = NULL;

__attribute__ ((constructor))
static void
bootstrap() 
{
    next_malloc = dlsym(RTLD_NEXT, "malloc");
}

void *
malloc(size_t size)
{
    void *ptr = next_malloc(size);

    // collect some stats

    return ptr;
}
1 голос
/ 19 февраля 2010

Несколько хороших ответов, но никто не упомянул об одном ресурсе, который привел меня через это: Создание библиотеки вставок для развлечения и прибыли .

1 голос
/ 19 февраля 2010

Похоже, вы заинтересованы в динамической загрузке , а не в ссылках вообще.Вот как ODBC находит и использует конкретный драйвер во время выполнения, как то, что вы хотите делать со своим распознавателем.

Вместо того, чтобы гуглить вас по случайной ссылке, я дам вам несколько ключевых слов по динамическим ссылкам:

Основные понятия: "динамическая загрузка" "Независимый от позиции код" soname

Инструменты: LD_DEBUG ldconfig ldd nm objdump

API C для динамической загрузки: dlfcn.h dlopen dlsym dlerror dlclose

Я нашел один хороший учебник, который, как я помню, был полезен, когда я работал с ODBC: http://www.ibm.com/developerworks/library/l-shobj/

Тем не менее, он рекомендует вызывать ld напрямую, что запрещено в gcc.,Вместо этого используйте параметр -shared:

g++ -shared -fPIC foo.c -o libfoo.so.1.0 -Wl,soname,libfoo.so.1

Также: Вам следует искать решения, которые не включают LD_PRELOAD или LD_LIBRARY_PATH, которые в основном являются инструментами отладки, а библиотеки, которые требуют их в работе, имеют недостатки: Почему LD_LIBRARY_PATH плохой LD_LIBRARY_PATH - не ответ LD_LIBRARY_PATH - просто скажите нет

ODBC избегает этого с помощью файла конфигурации odbc.ini, где вы указываете полный файлпуть к .so для использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...