Preview

Труды Института системного программирования РАН

Расширенный поиск

Оптимизация динамической загрузки библиотек на архитектуре ARM

https://doi.org/10.15514/ISPRAS-2016-28(1)-4

Аннотация

В статье рассматривается подход к оптимизации вызовов внешних функций в позиционно-независимом коде, основанный на выдаче вызовов непосредственно через глобальную таблицу смещений (GOT), минуя таблицу компоновки процедур (PLT). Стандартные механизмы кодогенерации на операционной системе Linux предполагают создание PLT не только для основного модуля (который является позиционно-зависимым и полагается на механизм PLT для вызовов внешних процедур), но и для динамических библиотек, где PLT используется также для организации ленивого связывания; однако использование PLT требует дополнительной инструкции перехода, может иметь низкую локальность по кешу и на некоторых архитектурах накладывает дополнительные ограничения на работу компилятора в месте вызова. Реализация вызовов внешних функций в виде косвенных переходов на адреса, загруженные непосредственно из GOT в месте вызова, позволяет избежать недостатков вызовов через PLT ценой отказа от возможности ленивого связывания и, возможно, увеличения размера кода. Была исследована реализация этой оптимизации для архитектур x86 и ARM в компиляторе GCC. Было обнаружено, что на архитектуре ARM отсутствуют типы релокаций, которые позволили бы генерировать оптимальный код для загрузок из GOT. Для решения этой проблемы в GCC и Binutils (в ассемблере и компоновщике) были реализованы недостающие типы релокаций, позволяющие построить адрес позиции в GOT относительно счетчика команд, используя инструкции movt, movw. Проведенное тестирование свидетельствует, что предложенная оптимизация позволяет получить увеличение производительности, несмотря на увеличение размеров динамических библиотек.

Об авторах

Е. А. Кудряшов
Институт системного программирования РАН
Россия


Д. М. Мельник
Институт системного программирования РАН
Россия


А. В. Монаков
Институт системного программирования РАН
Россия


Список литературы

1. J. Levine. Linkers and Loaders. Morgan-Kauffman, p. 256, October 1999.

2. J. Greenhalgh. [AArch64] Tighten direct call pattern to repair -fno-plt. https://gcc.gnu.org/ml/gcc-patches/2015-08/msg00152.html.

3. A. Monakov. PIC calls without PLT, generic implementation. https://gcc.gnu.org/ml/gcc-patches/2015-05/msg00225.html.

4. D. Melnik. Developing Interblock Combine Pass in GCC. GNU Tools Cauldron 2013. https://gcc.gnu.org/wiki/cauldron2013.

5. ARM Architecture Reference Manual, ARMv7-A and ARMv7-R edition, Section A2.8.6.60, 04 June 2009.

6. Веб-сайт SQLite. http://www.sqlite.org/about.html.


Рецензия

Для цитирования:


Кудряшов Е.А., Мельник Д.М., Монаков А.В. Оптимизация динамической загрузки библиотек на архитектуре ARM. Труды Института системного программирования РАН. 2016;28(1):63-80. https://doi.org/10.15514/ISPRAS-2016-28(1)-4

For citation:


Kudryashov E.A., Melnik D.M., Monakov A.V. Dynamic loader optimization for ARM. Proceedings of the Institute for System Programming of the RAS (Proceedings of ISP RAS). 2016;28(1):63-80. (In Russ.) https://doi.org/10.15514/ISPRAS-2016-28(1)-4



Creative Commons License
Контент доступен под лицензией Creative Commons Attribution 4.0 License.


ISSN 2079-8156 (Print)
ISSN 2220-6426 (Online)