Я пишу простой загрузчик ELF для пользовательского пространства под Linux (почему? для 'fun'). Мой загрузчик на данный момент довольно прост и предназначен для загрузки только статически связанных файлов ELF, содержащих позиционно-независимый код.
Обычно, когда программа загружается загрузчиком ядра ELF, она загружается в собственное адресное пространство. Таким образом, сегмент данных и сегмент кода могут быть загружены с правильным виртуальным адресом, указанным в сегментах ELF.
В моем случае, однако, я запрашиваю адреса из ядра через mmap
и может или не могу получить адреса, запрошенные в сегментах ELF. Это не проблема для сегмента кода, поскольку он независим от позиции. Однако, если сегмент данных не загружен с ожидаемым адресом, код не сможет правильно ссылаться на что-либо, хранящееся в сегменте данных.
В самом деле, мой загрузчик, похоже, отлично работает с простым исполняемым сборником, который не содержит никаких данных. Но как только я добавляю сегмент данных и ссылаюсь на него, исполняемый файл не работает правильно или SEGFAULT.
Как, если возможно, я могу исправить любые ссылки на сегмент данных, чтобы указать на правильное место? Есть ли место для перемещения в (статическом) файле ELF для этой цели?