Я должен вмешаться на вызове метода в программу C++ (класс находится в отдельной общей библиотеке). Я думал, что мог использовать LD_PRELOAD, но я не уверен, как это работало бы (я только нашел примеры функций C): существует ли способ установить вмешательство для отдельного метода, не копируя ни по какому коду со вставленной реализации класса?
Это было бы не очень переносимо, но вы могли бы написать свою промежуточную функцию на C и дать ей искаженное имя метода C ++. Конечно, вам придется явно обрабатывать этот параметр, но я думаю, что все ELF ABI просто рассматривают его как невидимый первый аргумент.
Просто создайте файл для вставленного кода (убедившись, что реализация не соответствует требованиям. ) ... пространства имен, имя класса и функция должны быть такими же, как для метода, который вы хотите перехватить. В определении вашего класса не упоминайте другие методы, которые вы не хотите перехватывать. Помните, что LD_PRELOAD требуется полный путь к перехватывающему общему объекту.
Например, чтобы перехватить void X :: fn1 (), создайте файл libx2.cc с:
#include <iostream> class X { public: void X::fn1(); }; void X::fn1() { std::cout << "X2::fn()\n"; }
Затем скомпилируйте его:
g++ -shared -o libx2.so libx2.cc
Затем запустите ala
LD_PRELOAD=`pwd`/libx2.so ./libx_client
Cheers