setcontext и makecontext для вызова общего указателя на функцию - PullRequest
2 голосов
/ 26 марта 2010

В другой вопрос У меня была проблема с портированием кода

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 битами и проблем переносимости.

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

Ответы [ 2 ]

1 голос
/ 07 апреля 2010

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

0 голосов
/ 26 марта 2010

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

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

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

...