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

ура

Другие вопросы по тегам