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 directly use nasm/tasm to compile the Intel style assembly code gcc generated.
I am conducting a project analysis asm code on both windows and Linux platform, so I am thinking if they can be both compiled by platform independent assembler like nasm\yasm, I could have a much easier time...
So my question is how to generate a nasm compilable assembly code from c source code on Linux?
If you're lazy: https://github.com/diogovk/c2nasm
There I have a script that does Babken Vardanyan's suggestion automatically.
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:
-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 calledmain.o
Use objconv to generate
nasm
code: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
and fix the errors/warnings by hand. For example:
align=N
andexecute
/noexecute
words from.SECTION
lines.: function
fromglobal
declarationsdefault rel
lineLink the resulting
main.o
which generated by Nasm in step 3 using gcc:You can also link it using ld but it's much harder.