Вы должны убедиться, что все функции стандартной библиотеки, которые вам когда-либо понадобятся, будут вызваны хотя бы один раз, и поэтому они будут включены в ваш двоичный базовый код.
Для вашего "переменного" кода у вас должен быть видтаблицы прыжков в начале блока.Ваш базовый код вызывает функцию в коде переменной, и таблица переходов переходит к фактической точке входа функции (или вы можете иметь функции-оболочки), например:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) { return 0;} /* function not yet developed */
char _f2(int a, int b) { return 0;} /* function not yet developed */
и в коде, который был разработан:
char f1(int a, int b) { return _f1(a,b)}
char f2(int a, int b) { return _f2(a,b)}
char _f1(int a, int b) {
/* lots of complex stuff */
return result;
}
char _f2(int a, int b) {
/* lots of complex stuff */
return result;
}
Здесь функции f1
, f2
и т. Д. Все будут находиться в фиксированном месте кода переменной и поэтому могут вызываться из базового кода.После того, как окончательная версия блока кода мигает, они вызывают свою окончательную версию.
Примечание: я не уверен, как обрабатывать функции вызова кода переменной из стандартной библиотеки, которая находится в вашей базеобласть кодаЛинкер для блока переменных должен либо дублировать загрузку функции в коде переменной, либо знать его абсолютное местоположение в области базового кода.Вы должны проверить документацию компоновщика / загрузчика для этого.