2012-11-01 95 views
9

我有用32位汇编语言编写的程序......现在我只是无法在64位操作系统上编译它。在我们学校他们是特定的,程序必须用32位版本编写。这里是我的程序:在64位ubuntu上编译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

不应该是printf不是_printf? – iabdalkader

+0

同样的错误:vaja4.o:在函数'start'中: vaja4.asm :(.text + 0x7):未定义的对'printf'的引用 – Klemenko

回答

15

首先改变_printfprintf_start符号main,然后用gcc连接到目标文件,这将自动链接到libc,你需要这样做,因为AFAIK你不能链接到libc没有main。你也应该使用装配时,因为代码中有32个指令ELF32不ELF64:

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位代码,你将需要安装库

apt-get install ia32-libs 
+1

是的,这是正确的方法。如果你想使用libc,你应该使用'main'作为入口点并使用gcc链接,以便适当的libc块被拉入并且初始化/关闭被处理。此外,只需从'main'返回工作,如果创建一个没有libc的二进制文件,则必须使用退出系统调用。 – Jester

+0

好吧,我试过你的方式。在gcc -m32 vaja4.o -o vaja4之后,它给了我错误输出: http://pastebin.com/jX3N2GSJ – Klemenko

+0

你需要安装32位库apt-get install ia32-libs – iabdalkader

1

它看起来像你对我忘了的C库链接,这是提供printf功能(和其他人)的一部分:

ld vaja4.o -o vaja4 -lc 
4

我怀疑你看到的错误是因为32/64位的问题。你看即

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

错误明显是告诉你的符号_printf是不确定的,这意味着对于printf函数库没有被链接。

你的链接步骤即

ld vaja4.o -o vaja4 

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

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

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

甚至是'ld -m elf_i386 -I/lib/ld-linux.so .2 -lc vaja4.o -o vaja4'可能不需要'-I'开关 - 在输出文件名中绝对需要'-lc'和'-o'。 '_start'标签被跳转到,没有被调用。所以你不能从中退出。更容易使用'main'和gcc ... –

+0

或'ld -m elf_i386 -s -o vaja4 vaja4.o'作为连接阶段。 –

7

的32位版本在Ubuntu 12。10,您需要安装第一

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

开发包

gcc -m32 vaja4.o -o vaja4 

工作。

+0

像魅力一样工作。 –