Мне очень трудно представить, что вы хотите сделать, но если вы заинтересованы в наличии ссылки на приложение для вашего загрузчика / ПЗУ, см. Загрузка файла символов при ссылке для подсказкичто ты мог сделать.
Создайте свое «исходное» (?) Изображение, очистите его mapfile и создайте файл символов, а затем используйте его при связывании своего «прыжкового» (?) Изображения.
Это означает, что вынеобходимо связать ваше изображение «прыжок» с конкретной версией вашего «исходного» изображения.
Если вам нужно, чтобы они были независимыми от полуверсии (т.е. вы определяете набор экспортируемых функций, но вы можете перестроить их с любой стороны), то вам нужно экспортировать указатели функций в известные места в вашем "Исходное изображение и ссылка на эти функциональные указатели в вашем изображении «прыжка».Вы можете упростить бухгалтерию, сделав структуру указателей на функции доступными к функциям с обеих сторон.
Например:
shared_functions.h:
struct FunctionPointerTable
{
void(*function1)(int);
void(*function2)(char);
};
extern struct FunctionPointerTable sharedFunctions;
Источникфайл в «исходном» изображении:
void function1Implementation(int a)
{
printf("You sent me an integer: %d\r\n", a);
function2Implementation((char)(a%256))
sharedFunctions.function2((char)(a%256));
}
void function2Implementation(char b)
{
printf("You sent me an char: %c\r\n", b);
}
struct FunctionPointerTable sharedFunctions =
{
function1Implementation,
function2Implementation,
};
Исходный файл в «исходном» изображении:
#include "shared_functions.h"
sharedFunctions.function1(1024);
sharedFunctions.function2(100);
Когда вы компилируете / ссылаетесь на «исходный код», возьмите его файл карты и извлеките местоположениеof sharedFunctions и создайте файл символов, который связан с исходным изображением «прыжка».
Примечание: printf
s (или все, что напрямую вызывается совместно используемыми функциями) будет происходить из изображения «источника»(а не изображение "прыжка").
Если вам нужно, чтобы они исходили из изображения «jump» (или были переопределены), то вам нужно получить к ним доступ через ту же таблицу указателей функций, а изображение «jump» должно исправить таблицу указателей функцийс его версией соответствующей функции.Я обновил function1 (), чтобы показать это.Прямой вызов функции 2 всегда будет «исходной» версией.Его версия вызова совместно используемой функции будет проходить через таблицу переходов и будет вызывать версию «source», если только изображение «jump» не обновит таблицу функций, чтобы указать на ее реализацию.
Вы МОЖЕТЕ уйти от структуры,но затем вам нужно экспортировать указатели на функции один за другим (не большая проблема), но вы хотите сохранить их в порядке и в фиксированном месте, что означает явное размещение их в файле дескриптора компоновщика и т. д. и т. д. Я показалметод структуры, чтобы отогнать это до самого простого примера.
Как вы можете видеть, все становится довольно проблематично, и есть некоторый штраф (вызов через указатель функции медленнее, потому что вам нужно загрузить адрес, чтобы перейти к нему)