LD_PRELOAD для методов класса C++

Я должен вмешаться на вызове метода в программу C++ (класс находится в отдельной общей библиотеке). Я думал, что мог использовать LD_PRELOAD, но я не уверен, как это работало бы (я только нашел примеры функций C): существует ли способ установить вмешательство для отдельного метода, не копируя ни по какому коду со вставленной реализации класса?

7
задан BruceBerry 5 August 2010 в 00:50
поделиться

2 ответа

Это было бы не очень переносимо, но вы могли бы написать свою промежуточную функцию на C и дать ей искаженное имя метода C ++. Конечно, вам придется явно обрабатывать этот параметр, но я думаю, что все ELF ABI просто рассматривают его как невидимый первый аргумент.

2
ответ дан 7 December 2019 в 01:14
поделиться

Просто создайте файл для вставленного кода (убедившись, что реализация не соответствует требованиям. ) ... пространства имен, имя класса и функция должны быть такими же, как для метода, который вы хотите перехватить. В определении вашего класса не упоминайте другие методы, которые вы не хотите перехватывать. Помните, что 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

8
ответ дан 7 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: