Компиляция кода для вставки исходного кода сборки с использованием GCC - PullRequest
1 голос
/ 19 октября 2019

Я хочу скомпилировать некоторый код C или C++ непосредственно в PowerPC сборку без каких-либо сгенерированных вспомогательных функций, стандартных библиотек, ELF заголовков и так далее. Это похоже на то, что делает compiler explorer, но у меня все еще есть некоторые проблемы с ним.

Допустим, я хочу скомпилировать следующий код непосредственно в необработанную сборку, генерируя толькоодиночная функция и все внутри:

auto get_address() {
    const auto value = *(int *) 0x1234; // Read the value from address 0x1234
    return reinterpret_cast<int *>(value); // Return it as address
}

void perform_write() {
    const auto address = get_address(); // Get the address using the helper function
    *address = 1; // Assign a value to the address
}

Точка входа должна быть perform_write(), очевидно. Мой ожидаемый вывод выглядит примерно так:

li r9,4660
li r10,1
lwz r9,0(r9)
stw r10,0(r9)
blr

Теперь, если я использую веб-сайт проводника компилятора, Я почти получаю то, что хочу :

Имеются следующие проблемы:

  1. Вспомогательная функция get_address() генерируется несмотря на то, что она встроена в perform_write(). Как я могу получить GCC, чтобы опустить избыточный get_address() из вывода? Можно ли как-то пометить perform_write() как точку входа для этого? Я попытался использовать атрибут __attribute__((always_inline)), но он ничего не сделал (вероятно, поскольку GCC уже вставляет код по умолчанию, но не удаляет неиспользуемую функцию)
  2. Неважно: замена знаков % была бы полезной дажехотя это не имеет значения для дальнейшей компиляции в машинный код. Флажок Intel отключен, а % обычно имеет синтаксис AT&T.

Я хочу сделать это предпочтительно с помощью флагов компилятора или, при необходимости, изменив исходный код. Я хочу избежать пост-обработки вывода с помощью языка программирования, чтобы получить желаемый результат, поскольку это, безусловно, работает, но может быть менее надежным.

...