#c #c
#c #c
Вопрос:
Я вызываю функцию из общего объекта (a.so ). Я загрузил a.so с использованием dlopen и отображаемой функции с использованием dlsym.
int (*funcPtr)() = reinterpret_cast<int(*)()>(dlsym(some symbol..));
Мой вопрос в том, содержат ли мои входные переменные для funcPtr «это», как мне его затем привести?
ожидаемая функция
int func(*this, int,int,int,int)
Я пытаюсь привести его как таковой
class test
{
};
int (*funcPtr)(*test, int,int,int,int) = reinterpret_cast<int(*)(*test,int,int,int,int)>(dlsym(some symbol..));
Комментарии:
1. Всплывающий тест: как вы объявляете указатель на метод класса
this
. Вы повторно интерпретируете его, используя тот же тип, который вы использовали бы для объявления указателя на метод классаthis
, который принимает четыре целых числа в качестве параметра и возвращает значение int.2.
*this
не является типом, поэтому он не может отображаться как тип параметра функции. Как выглядит сигнатура этой функции, которую вы пытаетесь вызвать?3. Как он может содержать «это»?
4. Вы приводите адрес к указателю. Не то, что написано в вашем названии, на километр.
5. моя функция — int myFunc (класс * this, int a, int b, int c, int d). Я пытаюсь привести эту функцию через dlsym. Тем не менее, у меня возникли некоторые проблемы, пытаясь понять, что произойдет, если я создам псевдокласс и приведу его.
Ответ №1:
Мой вопрос в том, содержат ли мои входные переменные для funcPtr [указатель на объект класса], как мне его затем привести?
Точно таким же образом, за исключением того, что в списке аргументов есть указатель:
void* addr = dlsym(some symbol..);
int (*funcPtr)(test*) = reinterpret_cast<int(*)(test*)>(addr);
Или немного красивее с псевдонимом:
using func = int(test*);
func* funcPtr = reinterpret_cast<func*>(addr);
Чтобы выполнить это приведение, класс должен быть объявлен. Его не нужно определять. Вы можете объявить класс, подобный этому:
class test;
Комментарии:
1. Итак, что вы пытаетесь сказать, мне придется создать свой собственный класс и привести его? что, если я не знаю методы или переменные из класса в so?
2. Нет. Вам не следует создавать свой собственный класс. Класс не обязательно определять, чтобы выполнить это приведение. Вам действительно нужно привести, так как
dladdr
возвращает указатель void.3. итак, что вы имели в виду, если бы я объявил класс «test», и я мог бы использовать его в списке аргументов как таковой? ‘int ( funcPtr)(test ) = reinterpret_cast<int( )(test )>(addr);’
4. большое спасибо! спасибо за предоставление совета вместо снисходительных замечаний 🙂
5. @MichaelGoh Здесь нет снисходительных замечаний. Вы должны оценить советы, данные вам в комментариях, и тщательно обдумать ответы на свои вопросы.