Я хочу скомпилировать некоторый код 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
Теперь, если я использую веб-сайт проводника компилятора, Я почти получаю то, что хочу :
![](https://i.stack.imgur.com/AbUIf.png)
Имеются следующие проблемы:
- Вспомогательная функция
get_address()
генерируется несмотря на то, что она встроена в perform_write()
. Как я могу получить GCC
, чтобы опустить избыточный get_address()
из вывода? Можно ли как-то пометить perform_write()
как точку входа для этого? Я попытался использовать атрибут __attribute__((always_inline))
, но он ничего не сделал (вероятно, поскольку GCC
уже вставляет код по умолчанию, но не удаляет неиспользуемую функцию) - Неважно: замена знаков
%
была бы полезной дажехотя это не имеет значения для дальнейшей компиляции в машинный код. Флажок Intel
отключен, а %
обычно имеет синтаксис AT&T
.
Я хочу сделать это предпочтительно с помощью флагов компилятора или, при необходимости, изменив исходный код. Я хочу избежать пост-обработки вывода с помощью языка программирования, чтобы получить желаемый результат, поскольку это, безусловно, работает, но может быть менее надежным.