Как создать статические связанные общие библиотеки

Для моей магистерской работы я пытаюсь адаптировать подход с общей библиотекой для встроенной системы ARM Cortex-M3. Поскольку у нашей целевой платы нет MMU, я думаю, что не имеет смысла использовать «нормальные» динамические разделяемые библиотеки. Поскольку .text выполняется непосредственно из флэш-памяти, а .data копируется в RAM во время загрузки, я не могу адресовать .data относительно кода, поэтому ПОЛУЧИЛСЯ тоже. GOT должен быть доступен через абсолютный адрес, который должен быть определен во время соединения. Так почему бы не назначить фиксированные абсолютные адреса всем символам во время соединения ...?

Из книги«Линкеры и загрузчики» Мне стало известно о «статических связанных общих библиотеках, то есть библиотеках, где адреса программ и данных в библиотеках связаны с исполняемыми файлами во время компоновки». Связанная глава описывает, как такие библиотеки могут быть созданы в целом, и дает ссылки на Unix System V, BSD / OS; но также упоминает Linux и системный вызов uselib (). К сожалению, в книге нет информации о том, как на самом деле создавать такие библиотеки, как инструменты и / или переключатели компилятора / компоновщика. Кроме этой книги я почти не нашел другой информации о таких библиотеках "в дикой природе". Единственное, что я нашел в этом отношении, былоPrelink для Linux. Но так как это работает с "нормальными" динамическими библиотеками, это не совсем то, что я ищу.

Я боюсь, что использование таких библиотек очень специфично, поэтому не существует общих инструментов для их создания. Хотя упомянутый syscall uselib () в этом контексте заставляет меня задуматься. Но я хотел убедиться, что ничего не упустил, прежде чем взломать свой собственный компоновщик ...;) Так кто-нибудь может дать мне больше информации о таких библиотеках?

Кроме того, мне интересно, есть ли какой-либо переключатель gcc / ld, который связывает и перемещает файл, но сохраняет записи перемещения в файле - чтобы его можно было переместить? Я нашел опцию "-r", но это полностью пропускает процесс перемещения. У кого-нибудь есть идея?

редактировать:

Да, я также знаю о скриптах компоновщика. Сgcc libfoo.c -o libfoo -nostdlib -e initLib -Ttext 0xdeadc0de Мне удалось получить какой-то связанный и перемещенный объектный файл. Но до сих пор я не нашел возможности связать основную программу с этим и использовать ее в качестве разделяемой библиотеки. («Нормальный способ» связывания динамической разделяемой библиотеки будет отклонен компоновщиком.)

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

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