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

标签 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'

最佳答案

先把_printf改成printf,把_start符号改成main,然后用gcc 链接目标文件,它会自动将其链接到 libc你需要这样做,因为据我所知,如果没有 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!!

编辑:

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

apt-get install ia32-libs 

关于linux - 在 64 位 ubuntu 上编译 32 位汇编器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13178501/

相关文章:

python - Minecraft 服务器执行脚本

python - 有没有办法验证从源代码构建的 Python 解释器是否正确?

ubuntu - apache Storm yaml blockmappingstart 消息

assembly - IBM 的 lis 和 ori 指令如何工作?

linux - 汇编 - 将值转换为 ascii

c/c++中的Android系统应用程序?

ubuntu - 连接到服务器 10.117.xxx.xxx :6443 was refused - did you specify the right host or port?

ubuntu - X11转发,怎么变奇怪的颜色?

assembly - 为什么ARM说 "A link register supports fast leaf function calls"

performance - 为什么我们要在汇编中使用 CPU 寄存器,而不是直接使用内存呢?