Compiler un assembleur 32 bits sur ubuntu 64 bits [dupliquer]

Cette question a déjà une réponse ici:

j'ai un programme écrit en langage d'assemblage 32 bits... Je ne peux pas le compiler sur OS 64 bits. Sur notre école, ils sont spécifiques et le programme doit être écrit en version 32 bits. Voici mon programme:

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

une idée? J'ai essayé de nombreuses façons de compiler. La sortie d'erreur lors de la compilation:

nasm -f elf64 vaja4.asm
ld vaja4.o -o vaja4
./vaja4

sortie:

vaja4.o: In function `_start':
vaja4.asm:(.text+0x7): undefined reference to `_printf'
12
demandé sur Mateusz Piotrowski 0000-00-00 00:00:00

3 réponses

Premier changement _printfprintf et main, puis utilisez gcc pour lier le fichier objet, qui le liera automatiquement à libc,vous devez faire cela car AFAIK vous ne pouvez pas lier à libc sans un main. En outre, vous devez utiliser elf32 pas elf64 lors de l'assemblage parce que le code a 32 instructions bits :

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

Et construire avec:

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

il y a un joli tutoriel ici:

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

Edit:

puisque vous compilez maintenant du code 32 bits sur un système 64 bits, vous devrez installer la version 32 bits des bibliothèques

apt-get install ia32-libs 
19
répondu iabdalkader 2012-11-01 14:46:06

sur Ubuntu 12.10, vous devez installer les paquets de développement d'abord

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

gcc -m32 vaja4.o -o vaja4

au travail.

7
répondu bit_pusher 2013-04-17 01:46:37

je doute que l'erreur que vous voyez est à cause de 32/64 bits problème. L'erreur que vous voyez que je.e

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

vous indique clairement que le symbole _printf n'est pas défini, ce qui signifie que la bibliothèque pour la fonction printf n'est pas liée.

votre étape de liaison-je.e

ld vaja4.o -o vaja4

ne comprend pas les bibliothèques. Vous devez lier votre programme avec une bibliothèque qui peut fournir la définition de la fonction printf. Je crois ld devrait choisir la bibliothèque elle-même, sans vous ennuyer avec ces messages mais parce qu'il n'est pas en mesure de trouver une bibliothèque C appropriée pour cette fonction, je suppose que vous n'avez pas les bibliothèques nécessaires I. e soit 32 bits ou 64 Bibliothèque est manquant.

quoi qu'il en soit, plz essayez la séquence suivante de commandes pour assembler et lier votre programme:

nasm -f elf vaja4.asm
ld -m elf_i386 vaja4.o vaja4
./vaja4
4
répondu binW 2012-11-01 14:12:49