Введение

Библиотека бинарных файловых дескрипторов (Binary File Descriptor, BFD) — основной механизм проекта GNU для переносимой обработки объектных файлов различных форматов. По состоянию на 2003 год она поддерживает приблизительно 50 форматов файлов для около 25 архитектур наборов команд.

История

Когда Дэвид Хенкель Уоллес из Cygnus Support предложил разработать библиотеку как способ открыть новые бизнес-возможности для компании, Ричард Столлман сказал, что это будет сложно; ответом Дэвида было, что это не такая уж и "большая проблема". Сокращенно "BFD", это и стало названием библиотеки. "Binary File Descriptor" был придуман позже как акроним, расшифровывающий "BFD".

Дизайн

BFD работает, представляя общий абстрактный вид объектных файлов. Объектный файл имеет "заголовок" с описательной информацией, переменное количество "секций", каждая из которых имеет имя, некоторые атрибуты и блок данных, таблицу символов, записи о перемещениях и так далее. Внутри BFD преобразует данные из абстрактного представления в детали организации бит/байт, необходимые для целевого процессора и формата файла. Его ключевые функции включают обработку различий в порядке байтов, например, между little-endian хостом и big-endian целью, корректное преобразование между 32-битными и 64-битными данными, а также детали адресной арифметики, определяемые записями о перемещениях. Библиотеку BFD можно логически разделить на две части: front-end и back-end. Front-end предоставляет общий интерфейс, независимый от базового представления объектных файлов. Пользователи взаимодействуют с объектными файлами через этот интерфейс. Даже если пользователю неизвестна структура объектных файлов, он все равно может использовать этот интерфейс. Это сокрытие деталей обеспечивается back-end. Back-end реализует взаимодействие front-end интерфейса со структурой объектных файлов. При появлении нового типа объектных файлов back-end должен зарегистрировать этот тип и реализовать его, если требуется поддержка в приложении BFD. Хотя BFD изначально разрабатывался как универсальная библиотека для широкого спектра инструментов, частая необходимость в адаптации API к возможностям новых систем ограничивает его применение. Основными клиентами BFD являются GNU Assembler (GAS), GNU Linker (GLD), другие инструменты GNU Binary Utilities ("binutils") и GNU Debugger (GDB). В результате BFD не распространяется отдельно, а всегда поставляется вместе с релизами binutils и GDB. Тем не менее, BFD является критически важным компонентом при использовании инструментов GNU для разработки встраиваемых систем. Библиотеку BFD можно использовать для чтения структурированных данных из дампа памяти.