2013-03-04 5 views
3

Скажем, у меня есть два исполняемых файла, которые необходимо загрузить в одном и том же адресном пространстве на разных адресах. Я хочу, чтобы эти два исполняемых файла были отдельными файлами, но позволяли им вызывать функции из другого.Связывание отдельных двоичных файлов

Например, если исполняемый файл А, который должен быть загружен в 0x1000, содержит функцию void foo() на 0x1ABC и исполняемому B, загруженной в 0x2000, вызывает foo(), я хочу, чтобы в конечном итоге, как call 0x1ABC в исполняемом B.

Причина, по которой мне это нужно, это игрушка ОС. Мне нужен мой загрузчик, чтобы узнать, где мой обработчик прерываний, и где начинается код ядра. Я мог бы сжать все это в один файл, но я бы предпочел.

На данный момент я решаю проблему, вручную загружая необходимые функции на «приятных» адресах и вручную записывая переходы на них. Это работает, но, говоря об иглах, он субоптимален.

ответ

0

Я, кажется, нашел его. В ld linker scrips есть опция (NOLOAD) для разделов, которые, как предполагается, уже находятся в памяти.

Например, если foo.o хочет вызвать функцию из bar.o, скрипт линкера для создания foo.bin без учета какой-либо код из bar.o в нем будет иметь

SECTIONS 
{ 
    . = 0x1000; 
    foo : { foo.o (*) } 

    . = 0x2000; 
    bar (NOLOAD) : { bar.o (*) } 
} 
0

Один из вариантов заключается в том, чтобы указать адреса функции по второму пути. Это может быть файл, например, или фиксированный адрес памяти. Если у вас есть полный контроль над системой, последняя версия должна работать хорошо.

Смежные вопросы