Test platform is 32 bit Linux.
Basically, I know gcc can be used to generate both Intel and At&T style assembly code, but it seems that you can not<
I find it's a better approach to disassemble the object files rather than use assembly code generated by gcc.
First, generate an object file from your source code:
gcc -fno-asynchronous-unwind-tables -O2 -s -c -o main.o main.c
-fno-asynchronous-unwind-tables
: do not generate unnecessary sections like .eh_frame
-O2
optimizes so the asm isn't horrible. Optionally use -Os
(size over speed) or -O3
(full optimization including auto-vectorization). Also you can tune for a CPU and and use extensions it supports with -march=native
or -march=haswell
or -march=znver1
(Zen)
-s
: make smaller executable (strip)
-c -o main.o
: compile but don't link, generate an object file called main.o
Use objconv to generate nasm
code:
objconv -fnasm main.o
The result will be stored in main.asm
.
The result will be very close to Nasm syntax. However you might need to make some minor tweaks to eliminiate warnings/errors. Simply try to compile it with Nasm
nasm -f elf32 main.asm
and fix the errors/warnings by hand. For example:
align=N
and execute
/noexecute
words from .SECTION
lines.: function
from global
declarationsdefault rel
lineLink the resulting main.o
which generated by Nasm in step 3 using gcc:
gcc main.o
You can also link it using ld but it's much harder.
Heres a way to do it without 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)
If you're lazy: https://github.com/diogovk/c2nasm
There I have a script that does Babken Vardanyan's suggestion automatically.