Украсить функцию в библиотеке - PullRequest
2 голосов
/ 06 мая 2019

У меня есть общая библиотека, для которой мне нужно написать тесты. Допустим, в библиотеке есть функция func ():

// from the library
<some_type> func(<some_params>); // signature of the function func

В документации библиотеки говорится, что эта функция должна вызываться при определенных условиях. Чтобы проверить это требование, я пишу свою собственную функцию func () с той же сигнатурой в тестовом файле:

// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
    is_func_called = true;
}

Правильный ли этот подход? Моя реализация func () гарантированно переопределит реализацию в библиотеке?

А иногда необходимо иметь возможность декорировать func () из библиотеки (вместо переопределения):

// test.cpp
bool is_func_called = false;
<some_type> func(<some_params>) {
    is_func_called = true;
    func(); // a call to the implementation in the library
}

Как получить доступ к реализации в библиотеке, если я переопределил ее?

Среда: Ubuntu, g ++.

В настоящее время я работаю с общей библиотекой. Но я на самом деле интересуюсь как общими, так и статическими библиотеками.

1 Ответ

2 голосов
/ 06 мая 2019

Хорошо, вы можете использовать трюк LD_LIBRARY_PRELOAD в Linux.

Скомпилировать собственную реализацию func() в разделяемую библиотеку.

gcc -shared -fPIC func.c -o func.so

Затем в приглашении оболочки

> LD_LIBRARY_PRELOAD=func.so ./main

и будет вызвана ваша версия func ().

Если вы хотите объединить вызовы - сначала украсьте оригинальный func () с помощью func (), тогда код должен выглядеть следующим образом

typedef a (*original_func_type)(B b);

a func(B b) {
    ... // whatever code you want
    original_func_type orig_func;
    orig_func = (original_func_type)dlsym(RTLD_NEXT, "func");
    return orig_func(b);
}

Это то, что вы хотите?

ОБНОВЛЕНИЕ

Более мирский учебник .Еще один учебник .Ссылка на учебник по символам / ссылки

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