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