我有用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