NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: xdcx on December 02, 2012, 07:54:31 AM
-
edit: just neededed to
%include "/usr/local/include/asm_io.inc"
where is the nasm directory in ubuntu, like windows?
why cant i compile, link and run 32bit assembly?
i386 architecture of input file `asm1.o' is incompatible with i386:x86-64 output
-
Well... I'm not aware of any "Nasm include directory" or any "Nasm directory" (Windows may have one) except for the source directory if you built Nasm from source (.../nasm-x.y where x and y are version number). You can find Nasm itself (and ndisasm) by doing "which nasm" - probably /usr/bin or /usr/local/bin. There are no include files that "come with" Nasm.
"asm_io.inc" sounds like one of Dr. Paul Carter's files, although it could be anything. As I recall (it was a long time ago I downloaded it), his examples untarred into a single directory - that may have changed. Where did you put it? If you've lost track, "locate asm_io.inc" should find it. /usr/local/include might be a sensible place to put this stuff, but it isn't automatic (unless Ubuntu - apt-get or so - does something with... whatever you downloaded). ASSuming you've got Dr. Carter's stuff, besides "asm_io.inc" you'll need to link against "asm_io.o", which you may have to build from "asm_io.asm". You'll also need to find "driver.c". Be sure you got the examples package intended for Linux! http://www.drpaulcarter.com/pcasm I think...
As an alternative to putting the full path in your source...
%include "/home/fbk/oldsrc/pctut/asm_io.inc"
(elsewhere on your system, no doubt), you can tell Nasm where to look by including the "-I" switch on the command line...
nasm -f elf32 first.asm -I /home/fbk/oldsrc/pcasm/
(or wherever) Note that the trailing '/' is required! We have had several contributions eliminating this requirement, but they have all been rejected. RTFM: http://www.nasm.us/xdoc/2.10.05/html/nasmdoc2.html#section-2.1.16 under "really perverse" to see why. :)
You may, if you wish, set an environment variable NASMENV which will be appended to the command line. You can put one or more search directories ("-i" or "-I") here, if you wish. (RTFM if you need spaces in your pathnames) If you want to make /usr/local/include/ your "nasm include directory", this might be a good place to do it.
If I've misunderstood which "asm_io.inc" you're looking for, we can discuss it further, but I'm pretty sure you didn't get it "with Nasm".
Best,
Frank
-
im on 64bit linux, but im working with 32 bit only, and yes i am using pcasm book
nasm -f elf32 asm1.asm
gcc -m32 -c /usr/include/driver.c
xdc@ubuntu:~$ gcc -m32 -o asm1.asm driver.o asm1.o /home/xdc/pcasm/asm_io.o
/usr/bin/ld: cannot find crt1.o: No such file or directory
/usr/bin/ld: cannot find crti.o: No such file or directory
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find -lc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.7/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
/usr/bin/ld: cannot find crtn.o: No such file or directory
collect2: error: ld returned 1 exit status
without -m32
xdc@ubuntu:~$ gcc -o asm1.asm driver.o asm1.o /home/xdc/pcasm/asm_io.o
/usr/bin/ld: i386 architecture of input file `driver.o' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `asm1.o' is incompatible with i386:x86-64 output
/usr/bin/ld: i386 architecture of input file `/home/xdc/pcasm/asm_io.o' is incompatible with i386:x86-64 output
/usr/bin/ld: driver.o: file class ELFCLASS32 incompatible with ELFCLASS64
/usr/bin/ld: final link failed: File in wrong format
collect2: error: ld returned 1 exit status
-
I'm pretty sure your linker stage should be:
gcc -m32 -lc -o PROGNAMEHERE asm1.o driver.o asm1.o /home/xdc/pcasm/asm_io.o
The crt1.o contains the C library startup code which should be found with the -lc switch.
Double check your asm source to make sure you didn't just hose it with your last gcc command.
-
fixed
sudo apt-get install gcc-multilib
nasm -f elf32 asm1.asm
gcc -m32 -lc -o asm1 asm1.o /home/xdc/pcasm/driver.c /home/xdc/pcasm/asm_io.o
-
There ya go! I remembered that there was an issue with Ubuntu (an African word meaning "one ring to rule them all" /joke) not coming with the 32-bit libraries, and I remembered that there was a package that fixed it. "gcc-multilib", "gcc-multilib", "gcc-multilib"... I'll try to remember that. I'm sure you're not the last person who will run into it. Thanks!
Best,
Frank