setcontext и makecontext для вызова универсального указателя на функцию

В другом вопросе у меня возникла проблема с переносом кода:

unsigned long stack[] = { 1, 23, 33, 43 };

/* save all the registers and the stack pointer */
unsigned long esp;
asm __volatile__ ( "pusha" );
asm __volatile__ ( "mov %%esp, %0" :"=m" (esp));

for( i = 0; i < sizeof(stack); i++ ){
    unsigned long val = stack[i];
    asm __volatile__ ( "push %0" :: "m"(val) );
}

unsigned long ret = function_pointer();

/* restore registers and stack pointer */
asm __volatile__ ( "mov %0, %%esp" :: "m" (esp) );
asm __volatile__ ( "popa" );

Для 64-битной платформы, и многие ребята говорили мне, что вместо этого я должен использовать набор функций setcontext() и makecontext() из-за различий в преобразовании вызовов между 32 и 64 битами и переносимости. вопросы.

Ну, я действительно не могу найти какую-либо полезную документацию в Интернете или, по крайней мере, не ту, которая мне нужна для реализации этого, так как же я могу использовать эти функции для помещения аргументов в стек, вызова универсального указателя на функцию, получения возвращаемого значения? а потом восстанавливать регистры?


person Simone Margaritelli    schedule 26.03.2010    source источник


Ответы (2)


Наконец, я использую libffi.

person Simone Margaritelli    schedule 07.04.2010

На странице Википедии есть достойный пример.

Это не то решение, которое вы ищете. makecontext принимает не массив, а список переменных аргументов. Итак, чтобы вызвать его, вам нужна функция для преобразования массива в список аргументов. Поскольку это то, для чего вам нужен makecontext, к тому времени, когда вы сможете его использовать, вы уже решили свою проблему.

Я не знаю, какое решение, но это тупик.

person R Samuel Klatchko    schedule 26.03.2010
comment
Хорошо, но КАК мне вставить значения ulong в стек? - person Simone Margaritelli; 26.03.2010
comment
Хорошо, понял, но проблема в том, что makecontext хочет аргументы функций, и я не знаю их количества, они могут быть 2 аргументами, как ни один, или 4... - person Simone Margaritelli; 26.03.2010