Это распространенная проблема среди встраиваемых систем людей. Этот метод часто используется для копирования из постоянной памяти в оперативную память (с возможностью записи и чтения). Не существует ни элегантного, ни стандартного решения, использующего стандартные C или C ++.
Более простое решение - использовать компоновщик для определения новых нестандартных сегментов. Используйте нестандартный #pragma
, чтобы указать компилятору поместить функцию в новый сегмент. Используйте нестандартную директиву компилятора для доступа к начальному и конечному адресам этого сегмента. Это позволит вам получить размер функции.
Более безопасный метод для места назначения - создать еще один сегмент с атрибутами исполняемого файла и записи. Скопируйте данные из сегмента функции в этот исполняемый сегмент. Установите указатель на функцию, указывающую на начало этого сегмента. Выполнить функцию через указатель.
Другое решение - выполнить это на ассемблере. Часто ассемблеры дают вам больше свободы (стрелять ногой), чтобы манипулировать памятью на более низком уровне.
Кроме того, просмотрите загрузчик операционной системы, атрибуты памяти и схемы защиты. Некоторые операционные системы могут ограничивать такое поведение привилегиями ядра или выше.