我有用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'
答案 0 :(得分:20)
首先将_printf
更改为printf
,将_start
符号更改为main
,然后使用gcc
链接目标文件,该文件会自动将其链接到libc
,您需要这样做,因为AFAIK无法在没有main
的情况下链接到libc。你也应该在汇编时使用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
答案 1 :(得分:7)
在Ubuntu 12.10上,您需要先安装开发包
sudo apt-get update
sudo apt-get install libc6-dev-i386
的
gcc -m32 vaja4.o -o vaja4
工作。
答案 2 :(得分:4)
我怀疑你看到的错误是因为32/64位问题。你看到的错误,即
vaja4.asm:(.text+0x7): undefined reference to `_printf'
清楚地告诉你符号_printf是未定义的,这意味着printf函数的库没有被链接。
你的连接步骤即
ld vaja4.o -o vaja4
不包含任何库。您需要将程序链接到可以提供printf函数定义的库。我相信ld应该自己选择这个库而不用这些消息困扰你,但因为它无法为这个函数找到合适的C库,我想你没有所需的库,即缺少32位或64个库。 / p>
无论如何,请尝试以下命令序列来汇编和链接您的程序:
nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4
答案 3 :(得分:1)
在我看来,你忘了链接C库,这是提供printf
功能(以及其他功能)的部分:
ld vaja4.o -o vaja4 -lc