一尘不染

在64位ubuntu上编译32位汇编器

linux

我有用32位汇编语言编写的程序…现在,我无法在64位OS上对其进行编译。在我们学校,它们是特定的,程序必须以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'

阅读 333

收藏
2020-06-07

共1个答案

一尘不染

首先将更_printf改为printf并将_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

并使用:

nasm -f elf32 vaja4.asm
gcc -m32 vaja4.o -o vaja4
$./test 
$Hello world!!

编辑:

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

apt-get install ia32-libs
2020-06-07