Форум программистов, компьютерный форум CyberForum.ru

Компилирование С++ кода в бинарный - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 15, средняя оценка - 4.93
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
16.05.2009, 12:50     Компилирование С++ кода в бинарный #1
Подскажите пожалуйста как откомпилировать С++ код (несколько файлов) просто в один кусок бинарного кода по x86 процессоры без указания операционной системы на которой код будет работать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
16.05.2009, 12:55     Компилирование С++ кода в бинарный #2
1. откомпилировать в объектный файл, без линковки
2. объединить объкетники в один файл копированием в бинарном режиме
(например в Windows так copy /b 1.obj + 2.obj + 3.obj)
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
16.05.2009, 13:06     Компилирование С++ кода в бинарный #3
sopot
Такое сделать в общем-то нельзя, ибо форматы кодовский файлов, например, на виндах и линухе не совпадают. Либо тебе нужно получить объектный файл для каждого исходника, а затем вырезать из него секцию с кодом (как это делать под виндами - не знаю). В итоге у тебя получится массив байтов, которые есть просто код. При этом дальше с этим кодом ты почти ничего не сможешь сделать, т.к. все обращения к глобальным переменным и функциям у тебя будут смотреть в пустоту. К тому же код Си++ из-под одного компилятора в общем случае не линкуется с кодом из-под другого компилятора

Riffi
пункт 2 заведомо делать нельзя, т.к. файл .obj - это не просто набор кода, это файл, описаный по некотроым правилам, который включает в себя помимо кода кучу дополнительной информации
Rififi
 Аватар для Rififi
2332 / 1047 / 43
Регистрация: 03.05.2009
Сообщений: 2,656
16.05.2009, 13:35     Компилирование С++ кода в бинарный #4
Evg,
пункт 2 заведомо делать нельзя
я в курсе. но поскольку ему нужен мусор, по пожалуйста

Добавлено через 1 минуту 31 секунду
ps. У тебя со зрением плохо, или не знаешь как тыкнуть в "обратиться по нику"?
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
16.05.2009, 14:01  [ТС]     Компилирование С++ кода в бинарный #5
Ну не то, чтобы мне нужен был мусор.
Цель в том, чтобы получить код работающий на x86 платформе (типа PC104 формата) на которой не установлено операционной системы. Соответственно требуется получить просто бинарный код. В общем я примерно понял, что как вариант нужно использовать компилятор, чтобы скомпилировать исходники в бинарики, а потом их объединять. Посмотрю опции линковщиков на предмет сборки объектных файлов не под конкретную ОС, а без нее.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
16.05.2009, 14:21     Компилирование С++ кода в бинарный #6
Цитата Сообщение от sopot Посмотреть сообщение
Посмотрю опции линковщиков на предмет сборки объектных файлов не под конкретную ОС, а без нее.
Дело тут не в опциях линковщика, а в том, что в объектном файле есть дополнительная информация о том, в каком месте кода используются какие глобальные переменные/функции

Если твой изначальный исходник типа

C
1
2
3
4
int func (int x, int y)
{
  return x + y;
}
То с ним такой мухлёж действительно можно сделать, ибо тут нет никиах обращений за пределы функции. Единственное, надо быть уверенным, что программные соглашения по передаче параметров на всех ОС совпадают. Обычно соглашения пишутся на архитектуру, но есть подозрения (особенно в части intel'а), что на разных ОС их могут немного менять. Т.е. в случае с данной функцией нужно быть уверенным, что при вызове значения x и y передаются на всех ОС на одних и тех же регистрах (или под одному и тому же смещению в стеке), аналогично с результатом

Код типа

C
1
2
3
4
double func (double x)
{
  return fabs (x);
}
такими свойствами уже не обладает. Потому как в дополнение к самому байтовому представлению кода нужно знать, что в каком-то месте этого кода должен присуствовать адрес функции fabs. В объектном файле такая информация есть, а в чистом коде ей взяться неоткуда
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
16.05.2009, 14:41  [ТС]     Компилирование С++ кода в бинарный #7
Вот для примера (IAR Embedded Workbench).
На выходе получается бинарик работающий без ОС. Поддерживает кучу платформ, в том числе различные микроконтроллеры и процессоры. К сожалению х86 не поддерживается. А мне нужно собрать не маленький проект на с++ под х86.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
16.05.2009, 14:46     Компилирование С++ кода в бинарный #8
Можешь на словах объяснить, что за хрень и что делает? А то всё это читать и вникать желания нет.

Правда это всё для embedded систем, т.е. для систем, где ОС как таковой и нету. Я ничего не читал, но подозреваю, что получается некий статический бинарник, в котором нет никаких обращений к ОС. Либо они есть, но через специальные механизмы (на них должна быть спецификация и рализация на каждую платформу). Т.е. если ты хочешь, чтобы это хозяйство работаело под intel, то тебе нужно иметь некую среду, внутри которой запустится этот бинарник. Это всё лишь мой предположение
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
16.05.2009, 15:22  [ТС]     Компилирование С++ кода в бинарный #9
Для embedded точно. Но такие системы строятся в том числе и на основе любого процессора (есть они на Intel, AMD, и т.д.) и под каждую такую систему как правило есть ОС: Windows, Linux и т.д. (на всех платформах с процессорами на ARM ядрах есть точно). Соответственно если проект под одну из осей, то вопросов нет - под Windows есть Visual Studio, под Linux есть gcc. Мой проект в силу специфики должен работать без использования стороннего кода и соответственно без ОС. Платформа представляет собой по сути обычный PC: та же архитектура процессора, память ddr, шина pci и т.д. Только она намного менее расширяема и более компактна.
IAR на выходе дает бинарный код который запускается на заданном процессоре и содержит обращения только к самому коду и включенным в него статическим библиотекам. Код запускается по вектору RESET процессора. В принципе иаровский линковщик и весь проект можно настроить так, чтобы код запускался и под Windows, но не в этом суть. Мой код будет начинать работу с того места где начинает работу загрузчик ОС (если рассматривать стандартный РС) и который никакую ОС не пользует по определению. Я конечно могу написать все на асме, но проект не маленький и в качестве языка однозначно выбран с++. Вот и встал вопрос: чем такое сделать.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
16.05.2009, 15:54     Компилирование С++ кода в бинарный #10
Видимо я не совсем понимаю суть. Программа не может работать вне "ОС". По ОС я понимаю не просто ОС в общем понимании, а некотороую среду, внутри которой работает программа к которой непрерывно обращается. Т.е. записать что-то в файл программа не может по определению - для этого нужно обращение к ОС. Либо какое-нибудь аппаратное прерывание или обращение по каким-то адресам, на которые отмапированы порты ввода-вывода или на которые назначены специфические операции. Насколько я понимаю, в данном случае мы это и имеем.

А можешь написать какую-нибудь конкретную короткую программу. Например, сложить числа 2 и 3 и выдать результат на экран (или что там эта штука умеет делать).

Т.е. в итоге тебе нужно на Си++ написать типа консольное приложение и слинковать его статически. При этом твоё приложение не должно содержать никаких обращений к библиотекам, не должно содержать высокоуровневых конструкций Си++ типа new (т.к. в конечном итоге оно работает через библиотечный malloc). Если работаешь под линухом, то можно сделать нормальный код, запустив ручками линкер, подстраховавшись при этом от того, что подключатся какие-либо библиотеки. Но вот точки взаимодействия с средой, в которой будет работать твоя программа, мне пока непонятны. А точки эти - точка входа (грубо говоря, каким образом мы попадаем в main, как предеаём тут argc, argv, envp) и обращения к "ОС"
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
18.05.2009, 08:53  [ТС]     Компилирование С++ кода в бинарный #11
А если задать вопрос вот так.

Есть код на с++, который должен работать как код загрузочного сектора жесткого диска на процессоре х86 (соответственно до запуска любой ОС).

Вопрос: какой компилятор использовать?
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
18.05.2009, 10:43     Компилирование С++ кода в бинарный #12
Любой. Только такими характеристиками код на Си++ не обладает. Это соркк чистый Си. Из тех соображений, что если вместо слова struct использовалось слово class, то это ещё не есть программа на Си++
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
18.05.2009, 11:13  [ТС]     Компилирование С++ кода в бинарный #13
А если любой - это компилятор от Visual Studio, то все что я там нашел это пять подсистем (/subsystem) и никакого указания как получить просто БИНАРНЫЙ код. Конечно можно взять получившийся exe-шник вырезать стартап код, служебные данные РЕ формата и оставить голый код полученный при компиляции написанного на с++, но хочется инструмента, которому можно просто указать, что де на выходе требуется только то, что написано программистом и ничего другого.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16943 / 5348 / 329
Регистрация: 30.03.2009
Сообщений: 14,383
Записей в блоге: 26
18.05.2009, 13:18     Компилирование С++ кода в бинарный #14
Таких инструментов напрямую нет

Я не знаю как в винде, но всякие образы от линуха именно так и делаются. Собирается куча объектников, дальше ручками запускается линкер. В gnu-линкер подаётся специальный скрипт, в котором описана карта памяти (по большому счёту этот скрипт влияет только на то, в какой последовательности и с каких адресов будут размещены разные секции кода). Далее специальными утилитами вырезаются исполняемые секции и получается некий образ, на который затем настраивается boot
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.05.2009, 13:38     Компилирование С++ кода в бинарный
Еще ссылки по теме:

C++ Успешное компилирование, но есть ошибки
Компилирование данных C++
Бинарный поиск через рекурсию: разобрать логику кода C++
Бинарный поиск C++
Компилирование в Visual Studio 2013 C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
sopot
0 / 0 / 0
Регистрация: 16.05.2009
Сообщений: 11
18.05.2009, 13:38  [ТС]     Компилирование С++ кода в бинарный #15
Спасибо.

Придется видимо что-то подобное и делать.
Yandex
Объявления
18.05.2009, 13:38     Компилирование С++ кода в бинарный
Ответ Создать тему
Опции темы

Текущее время: 11:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru