Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 05/02/2010, à 11:07

Makak_du_27

Comment utiliser ld avec puts?

Bonjour,

Je vous expose mon problème: J'ai un fichier hello1.s (contenu ci-après). Le bogue se passe à l'étape d'éditions des liens avec cette ligne:

$ld -o hello1 /lib/libc.so.6 hello1.o -lc

On lie /lib/libc.so.6 pour puts. Au final, j'ai bien un fichier exécutable hello1 mais lorsque j'essaie de l'exécuter, le bash me retourne:

bash: ./hello1: Aucun fichier ou répertoire de ce type

Pourriez-vous me dire ce qu'il se passe?
Merci,
Cordialement,
Makak_du_27 smile

.text
message :
.ascii "hello world ! \0"
.align 4
.global _start
_start :
pushl %ebp
movl %esp,%ebp
pushl $message
call puts
addl $4,%esp
movl %ebp,%esp
popl %ebp
ret

PS: Cela fonctionnait il y a à peu près trois ans...

Dernière modification par Makak_du_27 (Le 05/02/2010, à 11:08)

Hors ligne

#2 Le 05/02/2010, à 11:25

credenhill

Re : Comment utiliser ld avec puts?

hello
que répond
file hello1

Hors ligne

#3 Le 05/02/2010, à 11:39

Makak_du_27

Re : Comment utiliser ld avec puts?

file hello1 retourne:

hello1: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped

Hors ligne

#4 Le 05/02/2010, à 11:55

Nasman

Re : Comment utiliser ld avec puts?

Je pense qu'il te faut déclarer puts comme extern. Je ne suis pas sur qu'il faille lier la libc.so.6 au fichier (puisqu'elle est dynamique).

J'avais fait quelques programmes en assembleur sous l'OS quon ne citera pas et il fallait juste créer l'exécutable (à l'édition des liens) à partir du fichier objet.

J'ai du faire la même chose sous Linux mais il faut que je vérifie la chose.


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#5 Le 05/02/2010, à 12:08

Nasman

Re : Comment utiliser ld avec puts?

Je viens de retrouver un programme quasiment identique réalisé avec nasm

BITS 32
EXTERN puts
SECTION .data
        chaine      db "Hello world !", 0
SECTION .text
        GLOBAL main
        main:
        push dword chaine
        call puts
        add esp, 4
        ret

Compilation

nasm -felf32 helloputs.asm -o helloputs.o

Edition des liens

gcc helloputs.o helloputs

Exécution

./helloputs

PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#6 Le 05/02/2010, à 12:29

Makak_du_27

Re : Comment utiliser ld avec puts?

Voila, j'ai donc rajouté EXTEND puts en haut du code comme ceci:

EXTERN puts
.text
message :
.ascii "hello world ! \0"
.align 4
.global _start
_start :
pushl %ebp
movl %esp,%ebp
pushl $message
call puts
addl $4,%esp
movl %ebp,%esp
popl %ebp
ret

Mais j'ai une erreur à la compilation:

$ as hello1.s -o hello1.o

renvoi:

hello1.s:2: Error: no such instruction: `extern puts'

Hors ligne

#7 Le 05/02/2010, à 12:42

Nasman

Re : Comment utiliser ld avec puts?

extern puts est la syntaxe de nasm. Je ne connais pas celle de as.
Peux être peux tu faire la même chose en C et demander une sortie en asm avec gcc. Tu auras alors un programme en assembleur as - avec peut être la directive qui va bien.

- et peut être man as


PC fixe sous Bionic 64 bits et portable avec Focal 64 bits

Hors ligne

#8 Le 06/02/2010, à 00:19

n3o51

Re : Comment utiliser ld avec puts?

nasm -f elf hello1.asm ; ld -s hello1_asm.o -o hello1_asm

Welcome to the real world
________________________________

Hors ligne