Библиотека BFD: Архитектура и применение объектных файлов GNU
Binary File Descriptor library
Библиотека BFD GNU: портативная работа с объектными файлами. Поддержка ~50 форматов, 25 архитектур. История названия: от шутки до "Binary File Descriptor".
Сравнивайте с английским: нажмите на абзац — оригинал откроется в окне. Кнопка EN под абзацем показывает его прямо в тексте.
Содержание
Введение
Библиотека бинарных файловых дескрипторов (Binary File Descriptor, BFD) — основной механизм проекта GNU для переносимой обработки объектных файлов различных форматов. По состоянию на 2003 год она поддерживает приблизительно 50 форматов файлов для около 25 архитектур наборов команд.
The Binary File Descriptor library (BFD) is the GNU Project's main mechanism for the portable manipulation of object files in a variety of formats. as of 2003, it supports approximately 50 file formats for some 25 instruction set architectures.
История
Когда Дэвид Хенкель Уоллес из Cygnus Support предложил разработать библиотеку как способ открыть новые бизнес-возможности для компании, Ричард Столлман сказал, что это будет сложно; ответом Дэвида было, что это не такая уж и "большая проблема". Сокращенно "BFD", это и стало названием библиотеки. "Binary File Descriptor" был придуман позже как акроним, расшифровывающий "BFD".
When David Henkel Wallace of Cygnus Support proposed developing the library as a way to open up new business opportunities for the company, Richard Stallman said that it would be difficult; David's response was that it wasn't such a "Big Fucking Deal". Abbreviated to "BFD", this became the library name. "Binary File Descriptor" was invented later as a backronym for "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 можно использовать для чтения структурированных данных из дампа памяти.
BFD works by presenting a common abstract view of object files. An object file has a "header" with descriptive info; a variable number of "sections" that each has a name, some attributes, and a block of data; a symbol table; relocation entries; and so forth. Internally, BFD translates the data from the abstract view into the details of the bit/byte layout required by the target processor and file format. Its key services include handling byte order differences, such as between a little endian host and big endian target, correct conversion between 32 bit and 64 bit data, and details of address arithmetic specified by relocation entries. BFD library can be logically divided into two parts. The front end and the back end. The front end gives a common interface independent of underlying object file view. Users will be interacting with the object files with this interface. Even if the layout of the object files are not to known the user, user still be able to use the interface. This hiding of the detail is done with the help of the back end. The back end implements how the front end interface interacts with the object files layout. Whenever a new object files type is introduced the back end needs to register the type and implement it if it needs to be supported by the BFD application. Although BFD was originally designed to be a generic library usable by a wide variety of tools, the frequent need to tinker with the API to accommodate new systems' capabilities has tended to limit its use; BFD's main clients are the GNU Assembler (GAS), GNU Linker (GLD), and other GNU Binary Utilities ("binutils") tools, and the GNU Debugger (GDB). As a result, BFD is not distributed separately, but is always included with releases of binutils and GDB. Nevertheless, BFD is a critical component in the use of GNU tools for embedded systems development. The BFD library can be used to read the structured data out of a core dump.