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

Kle*_*nko 12 linux ubuntu 64-bit assembly 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
Run Code Online (Sandbox Code Playgroud)

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

nasm -f elf64 vaja4.asm
ld vaja4.o -o vaja4
./vaja4
Run Code Online (Sandbox Code Playgroud)

输出:

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

iab*_*der 20

首先更改_printfprintf_start符号main,然后使用gcc链接目标文件,这将自动链接到libc,你需要这样做,因为AFAIK你不能没有链接到libcmain.你也应该在组装时使用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
Run Code Online (Sandbox Code Playgroud)

并建立:

nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test 
$Hello world!!
Run Code Online (Sandbox Code Playgroud)

这里有一个很好的教程:

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

编辑:

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

apt-get install ia32-libs 
Run Code Online (Sandbox Code Playgroud)


小智 7

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

sudo apt-get update
sudo apt-get install libc6-dev-i386
Run Code Online (Sandbox Code Playgroud)

对于

gcc -m32 vaja4.o -o vaja4
Run Code Online (Sandbox Code Playgroud)

上班.