Я пытаюсь написать программу, которая будет запускать функцию из динамической библиотеки c с ее именем, аргументами и их типами, введенными пользователем. Я могу получить указатель void * на эту функцию, используя dlsym(func_name)
, однако заранее не знаю типы аргументов и их количество, поэтому не могу разыменовать этот указатель обычным способом.
Если я копирую байтовые представления всех аргументов в массиве char *
, могу ли я вызвать функцию с этим массивом в качестве аргументов? Например, при вызове printf в сборке я могу добавить в стек аргументы и строку форматирования и вызвать printf. Может быть, я могу сделать что-то подобное в C или использовать ассемблерные вставки?
Например, предположим, что функция void func(int, double);
, и мне даны аргументы int a
и double b
. Затем я бы создал массив:
char buf[sizeof(int) + sizeof(double)]
memcpy(buf, &a, sizeof(int))
memcpy(buf + sizeof(int), &b, sizeof(double))
и использовал бы его в качестве аргументов, помещаемых в стек.
Пользователь вводит имя функции, строку, описывающую ее тип, и сами аргументы. Например:
func_name
viid
5
6
2.34
func_name - это имя функции, которая будет использоваться в dlsym. viid означает, что функция имеет тип void func_name(int, int, double)
(первый символ - это тип возвращаемого значения, остальные - аргументы. v = void, i = int, d = double). Остальные аргументы.