Как сгенерировать ассемблируемый код для сборки из исходного кода c на Linux?
Тестовая платформа - 32-битный Linux.
В принципе, я знаю, что gcc можно использовать для генерации кода сборки в стиле Intel и At&T, но кажется, что вы не можете напрямую использовать nasm / tasm для компиляции сгенерированного кода сборки в стиле Intel.
Я выполняю ассемблерный код для анализа проектов как на Windows, так и на платформе Linux, поэтому я думаю, что если они могут быть скомпилированы независимым от платформы ассемблером, таким как nasm \ yasm, мне было бы намного проще...
Итак, мой вопрос заключается в том, как сгенерировать сборочный код для сборки из nasm из исходного кода c в Linux?
2 ответа
Я считаю, что лучше разбирать объектные файлы, чем использовать ассемблерный код, сгенерированный gcc.
Сначала сгенерируйте объектный файл из вашего исходного кода:
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
-fno-asynchronous-unwind-tables
: не генерировать ненужные разделы, такие как.eh_frame
-O2
оптимизирует, чтобы ассм не был ужасным. Опционально использовать-Os
(размер за скорость) или-O3
(полная оптимизация, включая авто-векторизацию). Также вы можете настроить процессор и использовать расширения, которые он поддерживает с-march=native
или же-march=haswell
или же-march=znver1
(Zen)-s
: сделать меньший исполняемый файл (strip)-c -o main.o
: компилировать, но не связывать, генерировать объектный файл с именемmain.o
Используйте objconv для генерации
nasm
код:objconv -fnasm main.o
Результат будет сохранен в
main.asm
,Результат будет очень близок к синтаксису Nasm. Однако вам может потребоваться внести некоторые незначительные изменения, чтобы устранить предупреждения / ошибки. Просто попробуйте скомпилировать это с Nasm
nasm -f elf32 main.asm
и исправить ошибки / предупреждения вручную. Например:
- удалить
align=N
а такжеexecute
/noexecute
слова из.SECTION
линий. - удалить текст
: function
отglobal
декларации - удалить
default rel
линия - удалить пустые разделы, если вы хотите, и т. д.
- удалить
Ссылка в результате
main.o
который сгенерирован Nasm на шаге 3 с использованием gcc:gcc main.o
Вы также можете связать его с помощью ld, но это намного сложнее.
Если вы ленивы: https://github.com/diogovk/c2nasm
Там у меня есть сценарий, который автоматически выполняет предложение Бабкена Варданяна.
Вот способ обойтись без objconv
ndisasm -u <(objdump -j .text -d main.o | cut -d: -f2 | cut -d$'\t' -f 2 | perl -ne 'next if /file/; s/\s+//g; print' | xxd -r -p)