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

时间:2012-11-01 13:51:28

标签: linux ubuntu assembly 64-bit 32-bit

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

4 个答案:

答案 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