15

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

4 回答 4

23

首先将符号更改_printf为,然后用于链接目标文件,这将自动将其链接到,您需要这样做,因为 AFAIK 没有. 此外,您应该在汇编时使用 elf32 而不是 elf64,因为代码有 32 位指令:printf_startmaingcclibcmain

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 
于 2012-11-01T14:26:30.433 回答
8

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

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

为了

gcc -m32 vaja4.o -o vaja4

去工作。

于 2013-04-17T01:23:41.140 回答
4

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

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

清楚地告诉你符号 _printf 是未定义的,这意味着 printf 函数的库没有被链接。

你的链接步骤,即

ld vaja4.o -o vaja4

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

无论如何,请尝试以下命令序列来组装和链接您的程序:

nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4
于 2012-11-01T13:58:16.253 回答
1

在我看来,您忘记链接 C 库,这是提供printf函数(和其他)的部分:

ld vaja4.o -o vaja4 -lc
于 2012-11-01T13:57:59.810 回答