Эмуляция динамического загрузчика для смещения разделяемых библиотек

У меня есть интересная ситуация на работе, на которую я пытаюсь найти хорошее решение. У нас есть код, который работает на многоядерном MIPS bare metal (без ядра). У нас есть требование интегрироваться с некоторым сторонним кодом, который необходимо обновить. Я думал о компиляции стороннего кода как PIC, а затем с помощью GOT для символов кода/данных, когда я загружаю этот код (у меня есть контроль над тем, где будет находиться код). Кроме того, предположим, что интерфейсы в стороннем коде не изменяются, поэтому нет новых записей PLT/GOT. Будет ли это работать?. Что еще я должен учитывать?

Ответ 1

Правильный ответ длиннее, чем "встроить динамический компоновщик/загрузчик"? Ваша проблема кажется такой же, как и для ld.so и подобных. Описывая все вещи, которые должен учитывать динамический компоновщик/загрузчик, является тема книг, таких как "Линкеры и загрузчики" от Джона Левина.

Ответ 2

Будет ли Linux/Unix binutils objcopy быть тем, что вы ищете. Предполагая, что вы создаете все свои двоичные файлы сразу, вместо того, чтобы фактически динамически загружать их во время выполнения в произвольном порядке [и у вас недостаточно памяти для распространения их по этой памяти], я думаю, что это сработает.

Конечно, если вы ТОЛЬКО нуждаетесь в исправлении GOT, то я не понимаю, почему вы не можете просто это сделать - это не такая сложная задача, чтобы написать что-то в шляпе. Но objcopy уже написан и может выполнять довольно много бинарных/исполняемых "messing about" (я использовал его для создания загрузочных дисков для различных систем, включая BIOS roms для ПК и т.п.) [Не то, чтобы я придумал с идеей, больше похожей на то, что я взял чей-то файл makefile, в котором оказалось внутри, - я просто посмотрел, что он сделал, чтобы понять, как он сделал ром, когда что-то в какой-то момент не получилось)