Как хранить и вызывать скомпилированную функцию в C / C ++?

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

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

Мне не нужно компилировать новые функции во время выполнения, просто в буфере содержатся инструкции, соответствующие различным уже скомпилированным функциям во время выполнения. Например. Я мог бы иметь 3 скомпилированные функции и 1 буфер. Эти 3 функции известны во время компиляции, но во время выполнения буфер может соответствовать любому из 3 в разное время.

Редактировать: Чтобы уточнить, что можно было бы получить: у меня есть структура, членом которой будет этот буфер, и различные указатели на экземпляры этой структуры. Каждый буфер структуры может содержать различную скомпилированную функцию. Если бы я использовал указатель на функцию вместо буфера, мне пришлось бы загрузить указатель на функцию struct, а затем разыменовать указатель на функцию. С помощью буфера я могу просто переместить программный счетчик на смещение (относительное местоположение буфера) основания структуры. Это еще один уровень косвенности. Для очень маленьких функций это может быть экономией.

Изменить 2: дальнейшее уточнение:

С указателем на функцию:

Load pointer from &struct+offsetof(pointer) Jump to location contained in pointer

С буфером, который содержит машинный код:

Jump to &struct+offsetof(buffer)

Второй - меньше шагов.

Ответы на вопрос(12)

Ваш ответ на вопрос