Вы хотите знать о утилите objcopy
, которую обычно выпускают вместе с GCC. Это компонент пакета инструментов binutils, наиболее заметным из которых является компоновщик, ld
.
Процесс заключается в том, что вы скомпилируете исходный файл (ы) и соедините их как обычно. Это дает вам готовый исполняемый файл в эльфе (или другом перемещаемом бинарном формате, зависящем от платформы). Затем вы используете objcopy для преобразования исполняемого файла в плоское двоичное изображение.
Это наиболее полезно для подготовки кода, который должен быть запущен с ПЗУ, где вы хотите убедиться, что используете подходящую библиотеку времени выполнения C для целевой платформы и, вероятно, необходимо настроить файл сценария компоновщика, а также предоставить ваш собственный код запуска C.
Если ваша цель - получить что-то вроде файла .so для загрузки в существующий процесс, тогда имейте в виду, что часть работы загрузчика разделяемой библиотеки заключается в том, чтобы фактически завершить привязку, чтобы символы в .so-файле, который ссылается на адреса в основном исполняемом файле (или других .so-файлах), решаются во время загрузки. Использование objcopy этого не сделает, и поэтому для функций, загруженных таким образом, может быть сложно правильно использовать существующую библиотеку времени выполнения C и объекты, которые она поддерживает, например, открытые файлы.
Независимо от ваших целей, вам нужно будет захватить контроль над компоновщиком, чтобы найти ваш бинарный файл по известному адресу. Для этого вам понадобится создать сценарий компоновщика. Документация для языка скриптов находится в the binutils manual. Вас будут интересовать разделы «.text *» и, возможно, в разделах «.rodata *», если вы планируете инициализировать глобальные переменные. Фактически организация этой инициализации остается в качестве упражнения для читателя.
В целом, это только верхушка очень большого айсберга. Я бы предложил потратить некоторое время на сборку кросс-компилятора, чтобы увидеть, как эти вещи используются на практике. Сообщества AVR и MSP430 используют GCC, имеют активное участие и недорогое (и часто даже с открытым исходным кодом) оборудование для начала работы.
Это не тот файл объекта? – aaronasterling
Нет, по крайней мере, объектные файлы содержат информацию о том, какие символы они экспортируют (для использования компоновщиком) –
Любые конкретные причины, по которым вы не хотите использовать библиотеку dll/shared? Есть * лот * ловушек с сырыми двоичными файлами. – snemarch