LD_PRELOAD для методов класса C ++ - PullRequest
6 голосов
/ 05 августа 2010

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

Ответы [ 2 ]

8 голосов
/ 05 августа 2010

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

Тогда беги аля

LD_PRELOAD=&#96;pwd&#96;/libx2.so ./libx_client

Приветствия

2 голосов
/ 05 августа 2010

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

...