приведите указатель к функтору и назовите его - PullRequest
0 голосов
/ 05 июля 2010

я могу сделать что-то вроде:

typedef void (*functor)(void* param);

//machine code of function
char functionBody[] = {
    0xff,0x43,0xBC,0xC0,0xDE,....
}
//cast pointer to function
functor myFunc = (functor)functionBody;
//call to functor
myFunc(param);

Ответы [ 4 ]

1 голос
/ 05 июля 2010

Формально язык C не допускает преобразований между указателями на функции и указателями на объекты, поэтому это невозможно сделать.

Однако, многие реализации C - возможно, даже «большинство» - поддерживают это как расширение. Работает ли это или нет, зависит от таких вещей, как разрешения памяти и когерентность кэша, которые будут меняться в зависимости от вашей архитектуры и операционной системы.

0 голосов
/ 05 июля 2010

Это может сработать.Возможно, использование const char [] для машинных инструкций еще лучше, поскольку на многих платформах статическое постоянное хранилище размещается в разделе памяти программ, доступном только для чтения.

0 голосов
/ 05 июля 2010

В современных операционных системах это зависит от того, помечена ли память как исполняемая или нет. В системах POSIX может иметь возможность получить исполняемую память, используя mmap. Имейте в виду, что даже на данной архитектуре процессора соглашение о вызовах может отличаться. Например, если вызывающая сторона ожидает, что вызываемый объект удалит аргументы из стека, ваш код должен сделать это лучше, иначе при возврате произойдет сбой. (Обычно C ABI не предъявляют этого глупого требования, но есть над чем подумать.)

Вместо того, чтобы пытаться вызывать ваш машинный код непосредственно как указатель на функцию C, может быть лучше написать встроенную оболочку asm, которая его вызывает. Таким образом, вы можете контролировать соглашение о вызовах.

0 голосов
/ 05 июля 2010

Зависит от защитного кольца.

на большинстве популярных настольных платформ вы не сможете выполнить код в data segment из-за привилегий страницы.

...