Простой способ изменить порядок разделов файла ELF - PullRequest
6 голосов
/ 16 июля 2010

Я ищу простой способ изменить порядок разделов файла ELF.У меня есть последовательность пользовательских разделов, которые я бы хотел, чтобы все были выровнены в определенном порядке.

Единственный способ, который я нашел, - это использовать скрипт Linker.Однако в документации указано, что указание пользовательского сценария компоновщика переопределяет значение по умолчанию.Скрипт компоновщика по умолчанию содержит много контента, который мне не нужно дублировать в моем собственном скрипте, просто чтобы три секции всегда были вместе в определенном порядке.Кажется, не очень удобно жестко кодировать поведение компоновщика.

Почему я хочу это сделать?У меня есть раздел данных, который мне нужен, чтобы знать расположение памяти во время выполнения (начало и конец).Итак, я создал два дополнительных раздела и поместил в них переменные дозорного.Затем я хочу использовать ячейки памяти этих переменных, чтобы узнать размер неизвестного участка в памяти.

.markerA 
    int markerA;
.targetSection
    ... Lots of variables ...
.markerB
    int markerB;

В приведенном выше примере я бы знал, что данные в .targetSection находятся между адресомmarkerA и markerB.

Есть ли другой способ сделать это?Существуют ли библиотеки, которые позволили бы мне прочитать образ исполняемого ELF и определить местоположение и размер раздела?

Ответы [ 4 ]

4 голосов
/ 20 мая 2011

Вы можете получить адреса загруженных разделов, проанализировав формат ELF-файла.Подробности можно найти, например, в

) для краткого впечатления о том, какая информация доступна, которую стоитпосмотрите на readelf

readelf -S <filename> 

возвращает список всех разделов, содержащихся в.

  1. Разделы, которые были отображены в памяти, были напечатаны как PROGBITS.
  2. Адрес вашегоискомый отображается в столбце Addr.
  3. Чтобы получить место в памяти, вы должны добавить адрес загрузки вашего исполняемого / общего объекта

Есть несколько способов определитьадрес загрузки вашего исполняемого / разделяемого объекта:

  1. вы можете проанализировать / proc / [pid] / maps (первый столбец содержит адрес загрузки). [pid] - это идентификатор процесса
  2. если вам известна одна функция, содержащаяся в вашем файле, вы можете применить dlsym для получения указателя на функцию.Этот указатель является входным параметром для dladdr, возвращающей структуру Dl_info, содержащуюзапрашиваемый адрес загрузки

Для получения информации ELF библиотека

  • libelf

может быть полезным компаньоном (я обнаружил ее после изучениявышеупомянутый TIS, поэтому я только кратко рассмотрел его и не знаю более глубоких деталей)

Я надеюсь, что этот набросок возможного решения поможет.

1 голос
/ 21 мая 2011

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

0 голосов
/ 27 июля 2014

Боюсь, что переопределить скрипт ссылки по умолчанию - это простое решение.

Так как вы беспокоитесь о том, что он может не быть гибким (даже я думаю, что скрипт связи действительно часто меняется), вы могли бы написать скриптсгенерировать скрипт ссылки на основе стандартного ld-скрипта хост-системы ("ld --verbose") и вставить в него ваши специальные разделы.

0 голосов
/ 10 июня 2011

Вы можете посмотреть библиотеку ELFIO . Он содержит примеры WriteObj и Writer. Используя библиотеку, вы сможете программно создавать / изменять двоичный файл ELF.

...