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?
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:
- remove the
align=N
and execute
/noexecute
words from .SECTION
lines.
- remove the text
: function
from global
declarations
- remove the
default rel
line
- remove empty sections if you wish etc
Link 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.
If you're lazy:
https://github.com/diogovk/c2nasm
There I have a script that does Babken Vardanyan's suggestion automatically.