在64位ubuntu编译32位汇编程序

我有用32位汇编语言编写的程序…现在我只是不能在64位操作系统上编译它。 在我们的学校他们是具体的,程序必须写在32位版本。 这是我的程序:

bits 32 extern _printf global _start section .data message db "Hello world!!", 10, 0 section .text _start: pushad push dword message call _printf add esp, 4 popad ret 

任何想法? 我已经尝试了很多方法来编译它。 编译后输出错误:

 nasm -f elf64 vaja4.asm ld vaja4.o -o vaja4 ./vaja4 

输出:

 vaja4.o: In function `_start': vaja4.asm:(.text+0x7): undefined reference to `_printf' 

首先将_printf更改为printf ,将_start更改为main ,然后使用gcc链接目标文件,该目标文件将自动将其链接到libc因为AFAIK无法链接到libc而不是main 。 你也应该使用elf32而不是elf64,因为代码有32位指令:

 bits 32 extern printf global main section .data message db "Hello world!!", 10, 0 section .text main: pushad push dword message call printf add esp, 4 popad ret 

并与建立:

 nasm -f elf32 vaja4.asm gcc -m32 vaja4.o -o vaja4 $./test $Hello world!! 

这里有一个很好的教程:

http://jdefr.swippet.com/2012/03/22/using-libc-with-assembly/

编辑:

由于您现在正在64位系统上编译32位代码,因此您需要安装32位版本的库

 apt-get install ia32-libs 

在Ubuntu 12.10上,您需要先安装开发包

 sudo apt-get update sudo apt-get install libc6-dev-i386 

对于

 gcc -m32 vaja4.o -o vaja4 

上班。

我怀疑你看到的错误是由于32/64位的问题。 你看到的错误ie

 vaja4.asm:(.text+0x7): undefined reference to `_printf' 

清楚地告诉你符号_printf是未定义的,这意味着用于printf函数的库不被链接。

你的连接步骤即

 ld vaja4.o -o vaja4 

不包括任何库。 您需要将程序与可以提供printf函数定义的库链接。 我相信ld应该选择它自己的图书馆,而不打扰你与这些消息,但因为它无法找到一个合适的C库这个功能,我想你没有所需的库,即32位或64库丢失。

无论如何,尝试下面的命令序列来组装和链接你的程序:

 nasm -f elf vaja4.asm ld -m elf_i386 vaja4.o vaja4 ./vaja4 

它看起来像我忘记链接到C库,这是提供printf函数(和其他人)的一部分:

 ld vaja4.o -o vaja4 -lc