блокировка вызова к `dlsym` (RTLD_NEXT) - PullRequest
1 голос
/ 03 октября 2019

Я пытаюсь обернуть функцию. Для этого я подумал об использовании dlsym, чтобы получить реальное расположение функции в памяти после ввода моей динамической библиотеки.

Я работаю на MacOS Mojave (10.14.6) с Apple clang version 11.0.0 (clang-1100.0.33.8).

Iпопытался запустить довольно простой код, отображающий сообщение каждый раз, когда вызывался malloc.

Поэтому я использовал код этого поста: Переопределение 'malloc' с использованием механизма LD_PRELOAD

Мой тестовый код был:

#include <stdlib.h>

int main()
{
    (void)malloc(1);
    (void)malloc(1);
    return (0);
}

Я внедрил динамическую библиотеку, используя DYLD_INSERT_LIBRARIES=./mylib.so DYLD_FORCE_FLAT_NAMESPACE=1 в OSX и LD_PRELOAD=./mylib.so в Ubuntu.

В OSX программа блокируется наdlsym вызов, где, как и в окне настройки Ubuntu, программа работает нормально.

EDIT:

Как указывалось @R .., реализация dlsym в OSX вызывает malloc (см. источники: https://opensource.apple.com/source/cctools/cctools-667.8.0/libdyld/dlopen.c)

Ответы [ 2 ]

1 голос
/ 03 октября 2019

Вы также можете впасть в бесконечную рекурсию из-за вызова fprintf(), поэтому использование этого кода для вставки на malloc() опасно (скопировано из связанного вопроса ):

void *malloc(size_t size)
{
    void *p = NULL;
    fprintf(stderr, "malloc(%d) = ", size);
    p = real_malloc(size);
    fprintf(stderr, "%p\n", p);
    return p;
}

Библиотечный код, такой как fprintf(), может вызывать malloc().

1 голос
/ 03 октября 2019

Вероятно, что вызов dlsym вызывает рекурсивный вызов malloc, что, в свою очередь, вызывает рекурсивный вызов dlsym, который блокирует второй раз, потому что он уже удерживает некоторую блокировку. Использование предзагрузочных библиотек для переноса malloc вместо полной его замены, как правило, является плохой идеей по этой и другим причинам.

Возможно, вы сможете использовать LD_AUDIT илиэквивалентная функциональность в OSX (если есть) для печати следа при вызове malloc. В противном случае вы могли бы вставить полную замену malloc с выводом отладки.

...