Как использовать параметры gcc —wrap=symbol в методе класса

#c #gcc

#c #gcc

Вопрос:

Это простой пример, который может помочь мне вывести malloc значение параметров

 void *__wrap_malloc(size_t size)
{
    printf("My malloc function!n");
    return __real_malloc(size);
}
 

Но я хочу использовать в методе класса, например

 class A{
public:
    void test(int a)
    {
        printf("%d", a):
    }
}
 

Это использование типа выдает ошибку.

 void A::__wrap_test(int a)
{
    printf("wrap");
    return A::test()
}
 

Может кто-нибудь сказать мне, как правильно его использовать?

Комментарии:

1. Я думаю, это помогло бы: en.wikipedia.org/wiki/Curiously_recurring_template_pattern

2. Изучите extern C

Ответ №1:

как правильно его использовать?

Чтобы использовать вообще, сначала у вас должен быть символ. Итак, сначала сделайте определение встроенной функции нестроевым, чтобы для него можно было сгенерировать символ. Затем вам нужно найти искаженное имя символа. Итак, сначала исправьте свои опечатки и скомпилируйте библиотеку в объектный файл:

 // a.hpp
class A {
public:
    void test(int a);
};

// a.cpp
#include <stdio.h>
#include "a.hpp"
void A::test(int a) {
    printf("%dn", a);
}
 

После компиляции проверьте сгенерированное искаженное имя символа:

 $ g   -c a.cpp amp;amp; nm a.o
                 U _GLOBAL_OFFSET_TABLE_
0000000000000000 T _ZN1A4testEi
                 U printf
 

Итак, здесь вы можете, наконец, получить имя символа для переноса : _ZN1A4testEi . Затем вы можете создать обработчик с оболочкой.

Я предполагаю, что, скорее всего, неверно, что первым аргументом функции-члена будет указатель на класс — я не проводил исследований по этой теме, и я не знаю, правда ли это. После получения имени символа мы можем написать основную программу:

 // main.cpp
#include "a.hpp"

extern "C" {
void __real__ZN1A4testEi(A *t, int a);
void __wrap__ZN1A4testEi(A *t, int a) {
    printf("wrap ");
    return __real__ZN1A4testEi(t, a);
}
};

int main() {
    A().test(5);
}
 

и компилировать и запускать с:

 $ g   -c -o a.o a.cpp
$ g   -c -o main.o main.cpp
$ g   -Wl,--wrap=_ZN1A4testEi a.o main.o -o main.out
$ ./main.out
wrap 5