Précédent   Forum des professionnels en informatique > Autres langages > Assembleur
Assembleur Forum d'entraide Assembleur. Avant de poster -> F.A.Q Assembleur Tutoriels Assembleur
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/08/2011, 13h27   #1
Membre actif
 
Homme
Étudiant
Inscription : décembre 2009
Messages : 172
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2009
Messages : 172
Points : 177
Points : 177
Par défaut Problème de compilation sous Linux

Salut à tous!

Je débute à peine la prog assembleur sous Linux et j'ai déjà un très gros problème concernant la compilation (ou plutôt l'exécution) de mes fichiers sources sous linux.

Je suis actuellement un bouquin (Professionnal assembly Language, Wrox) pour m'initier. Et pourtant lorsque je me retrouve à compiler un fichier source, Disons :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
       .section    .data
 
output:
        .ascii   "The Processor vendor ID is 'xxxxxxxxxxxx'\n"
 
        .section     .text
.globl _start
_start:
        movl $0, %eax
        cpuid
        [...]
        int $0x80
Je compile avec
et je link avec
Tout fonctionne bien

Par contre lorsque je compile ce code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
    .file    "pointeur_non_init.c"
    .section    .rodata
.LC0:
    .string    "&p = %p\np  = %p\n"
.LC1:
    .string    "----------\n"
.LC2:
    .string    "&p = %p\n"
    .text
.globl main
    .type    main, @function
main:
    pushl    %ebp
    movl    %esp, %ebp
    andl    $-16, %esp
    subl    $32, %esp
    movl    28(%esp), %ecx
    movl    $.LC0, %edx
    movl    stdout, %eax
    movl    %ecx, 12(%esp)
    leal    28(%esp), %ecx
    movl    %ecx, 8(%esp)
    movl    %edx, 4(%esp)
    movl    %eax, (%esp)
    call    fprintf
    movl    $4, 8(%esp)
    movl    $0, 4(%esp)
    leal    28(%esp), %eax
    movl    %eax, (%esp)
    call    memset
    movl    stdout, %eax
    movl    %eax, %edx
    movl    $.LC1, %eax
    movl    %edx, 12(%esp)
    movl    $11, 8(%esp)
    movl    $1, 4(%esp)
    movl    %eax, (%esp)
    call    fwrite
    movl    $.LC2, %edx
    movl    stdout, %eax
    leal    28(%esp), %ecx
    movl    %ecx, 8(%esp)
    movl    %edx, 4(%esp)
    movl    %eax, (%esp)
    call    fprintf
    movl    28(%esp), %ecx
    movl    $.LC2, %edx
    movl    stdout, %eax
    movl    %ecx, 8(%esp)
    movl    %edx, 4(%esp)
    movl    %eax, (%esp)
    call    fprintf
    movl    $0, %eax
    leave
    ret
    .size    main, .-main
    .ident    "GCC: (Ubuntu/Linaro 4.5.2-8ubuntu4) 4.5.2"
    .section    .note.GNU-stack,"",@progbits
pourtant obtenu grace à l'option -S de gcc et que je link avec la même commande, tout se passe bien là aussi par contre lorsque j'exécute je me retrouve avec cette erreur :
Code :
1
2
 
Bash : ./pointeur : No such file or directory
Est ce que j'oublie quelque chose??

Code :
1
2
3
4
5
#uname -a
Linux [...] 2.6.38-8-generic #42-Ubuntu SMP [...] i686 i686 i386 GNU/Linux
 
#bash --version
GNU bash, version 4.2.8(1)-release (i686-pc-linux-gnu)
Merci
baccali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/09/2011, 10h46   #2
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 402
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 402
Points : 1 991
Points : 1 991
Bonjour,

Peux-tu nous montrer la commande de compilation de ton programme ne fonctionnant pas, ainsi que les retours de commande et le retour de la commande "ls" ?
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 02h11   #3
Membre actif
 
Homme
Étudiant
Inscription : décembre 2009
Messages : 172
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2009
Messages : 172
Points : 177
Points : 177
Merci supersnail de ta réponse et désolé du retard, je commençais à perdre espoir.

la commande de compilation est la basique, à savoir :

Code :
1
2
3
4
5
6
# as -o pointeur_non_init.o pointeur_non_init.c
# echo $?
0
# ld  -o pointeur_non_init pointeur_non_init.o /lib/i386-linux-gnu/libc-2.13.so
# echo $?
# 0
et le résultat de la commande ls indique bien la présence du fichier en question.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# ls -l
total 100
-rwxr-xr-x 1 root root   659 2011-08-29 13:14 cpuid
-rwxr-xr-x 1 root root  1035 2011-08-28 04:05 cpuid.bak
-rw-r--r-- 1 root root   648 2011-08-29 13:14 cpuid.o
-rw-r--r-- 1 root root  1200 2011-08-28 04:05 cpuid.o.bak
-rw-r--r-- 1 root root   375 2011-08-29 13:14 cpuid.s
-rwxr-xr-x 1 root root   905 2011-08-27 22:42 empty
-rw-r--r-- 1 root root    32 2011-08-26 02:10 empty.c
-rw-r--r-- 1 root root  1076 2011-08-27 22:42 empty.o
-rw-r--r-- 1 root root   244 2011-08-28 02:15 empty.s
-rw-r--r-- 1 root root 11834 2011-08-27 23:30 gcc_cpuid.str
-rwxr-xr-x 1 root root  7095 2011-08-26 02:11 gcc_empty
-rwxr-xr-x 1 root root  7484 2011-08-26 15:19 gcc_hello
-rw-r--r-- 1 root root  1037 2011-08-26 15:20 hello.c
-rw-r--r-- 1 root root  1908 2011-08-27 22:39 hello.o
-rw-r--r-- 1 root root  2641 2011-08-27 22:39 hello.s
-rwxr-xr-x 1 root root  2538 2011-09-02 01:32 pointeur_non_init
-rw-r--r-- 1 root root  1208 2011-09-02 01:31 pointeur_non_init.o
-rw-r--r-- 1 root root  1364 2011-09-02 01:31 pointeur_non_init.s
-rw-r--r-- 1 root root  9814 2011-08-29 10:42 syscalls.txt
# #oui je sais je suis root :)
le touch n'indique aucune erreur.
Code :
1
2
3
4
5
 
#touch pointeur_*
#echo $?
0
#
En gros toutes les commandes qui ne cherchent pas à l'exécuter se passe normalement.


j'ai même fait un autre programme en C qui fait un exec sur ce fichier en pensant que c'étais mon bash qui déconnais mais j'obtiens :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
# cat exec_pointeur.c
include <unistd.h>
#include <stdlib.h>
 
 
int main(int argc, char * argv[], char * envp[]){
 
   char * arguments[] = { "pointeur_non_init" };
   int resultat;
   if ((resultat = execve("./pointeur_non_init", arguments, envp))== -1){
      perror("execve");
      exit(EXIT_FAILURE);
   }
   /* execve ne retourne pas */
}
 
#!gcc
gcc -o exec_pointeur exec_pointeur.c
#echo $?
0
# ./exec_pointeur
execve: No such file or directory
#
Allez je suis même un peu mazo :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
#strace -f ./exec_pointeur
execve("./exec_pointeur", ["./exec_pointeur"], [/* 40 vars */]) = 0
brk(0)                                  = 0x8dab000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78a4000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=48874, ...}) = 0
mmap2(NULL, 48874, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7898000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220o\1\0004\0\0\0"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0755, st_size=1434180, ...}) = 0
mmap2(NULL, 1444360, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x141000
mprotect(0x29b000, 4096, PROT_NONE)     = 0
mmap2(0x29c000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15a) = 0x29c000
mmap2(0x29f000, 10760, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x29f000
close(3)                                = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7897000
set_thread_area({entry_number:-1 -> 6, base_addr:0xb78978d0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
mprotect(0x29c000, 8192, PROT_READ)     = 0
mprotect(0x8049000, 4096, PROT_READ)    = 0
mprotect(0x571000, 4096, PROT_READ)     = 0
munmap(0xb7898000, 48874)               = 0
execve("./pointeur_non_init", ["pointeur_non_init", "|\315\25", "U\211\345WVS\350Z"], [/* 40 vars */]) = -1 ENOENT (No such file or directory)
dup(2)                                  = 3
fcntl64(3, F_GETFL)                     = 0x2 (flags O_RDWR)
brk(0)                                  = 0x8dab000
brk(0x8dcc000)                          = 0x8dcc000
fstat64(3, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 1), ...}) = 0
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb78a3000
_llseek(3, 0, 0xbfdac9c0, SEEK_CUR)     = -1 ESPIPE (Illegal seek)
write(3, "execve: No such file or director"..., 34execve: No such file or directory
) = 34
close(3)                                = 0
munmap(0xb78a3000, 4096)                = 0
exit_group(1)                           = ?
je pense que çà doit venir d'un problème dans les en-têtes du programme mais quoi... ??? Je ne sais pas trop comment linux lance les exécutables. Le pire, si çà peut t'aider, c'est que j'avais commencé et mis en standby ce tuto il y'a plus d'un an déjà sur une machine amd (je pense que je tournais sur un noyau 2.4 mais pas sûr) et je ne me souviens pas avoir rencontré ce genre de problème ???


EDIT :

Bon je viens même de faire un strace de la compilation gcc et répéter exactement les appel systèmes à execve concernant as et ld et c'est pareil.
y'a de quoi s'arracher les tifs quand même
baccali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 10h24   #4
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 402
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 402
Points : 1 991
Points : 1 991
Bonjour,

A mon humble avis, ça doit être un bug avec la libc...

Ça donne quoi si tu fais

Code :
ls /lib/i386-linux-gnu/libc-.13.so
?

Chez moi j'ai une libc-2.13.so mais pas de libc-.13.so ... T'as dû rater des étapes :p
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/09/2011, 14h39   #5
Membre actif
 
Homme
Étudiant
Inscription : décembre 2009
Messages : 172
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2009
Messages : 172
Points : 177
Points : 177
Aïe!! je sais pas trop où çà a buggé mais la commande affichée n'est pas correcte et pas celle que je voulais afficher. Désolé de te faire perdre ton temps comme çà!

voici la ligne de commande correcte (que je vais de ce click modifier dans mon message plus haut) :
Code :
1
2
 
# ld  -o pointeur_non_init pointeur_non_init.o /lib/i386-linux-gnu/libc-2.13.so
et dans le doute j'ai essayé sur 3 machines différentes au boulot, avec 3 libc différentes (2.13 , 2.4 et 2.1.3) et 2 versions de as (2.21.0.20110327, 2.16.91.0.5 et 2.9.5), et ld différentes (sur des distrib Suze cette fois) et j'obtiens à chaque fois le même résultat (même en recommençant les manip à partir du "gcc -S ..."

Sérieux j'en peux plus! C'est vrai que je pourrais passer par la commande gcc à chaque fois pour avoir des résultats mais çà perd beaucoup de son charme et je déteste ne pas savoir ce qui se passe dans MON PC. Peux-tu me dire si ces commandes et ce code marche pour toi stp? Je pense que tu as du le voir mais le programme n'est pas bien méchant! A la base je voulais profiter de l'assembleur pour mieux comprendre le C vu que j'ai du mal avec les pointeurs. Voici le code source en C :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void){
   int * p;
 
   fprintf(stdout, "&p = %p\np  = %p\n", &p, p);
   memset(&p, 0, sizeof(int));
   fprintf(stdout, "----------\n");
   fprintf(stdout, "&p = %p\n", &p);
   fprintf(stdout, "&p = %p\n", p);
 
 
   return (EXIT_SUCCESS);
}
J'attends de tes nouvelles et merci encore.
baccali est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/09/2011, 10h21   #6
Membre Expert
 
Avatar de supersnail
 
Homme
Inscription : novembre 2006
Messages : 1 402
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations forums :
Inscription : novembre 2006
Messages : 1 402
Points : 1 991
Points : 1 991
Bonjour,

En fait, j'obtiens la même erreur que toi avec ton code, cependant, mon ld se montre plus bavard:

Code :
1
2
$ ld  -o pointeur_non_init pointeur_non_init.o /lib/i386-linux-gnu/libc-2.13.so
ld: warning: cannot find entry symbol _start; defaulting to 000000000804823c
Il manque effectivement le symbole _start, qui sera en fait le réel point d'entrée de l'exécutable (en fait _start effectue quelques opérations "made in GCC" avant d'invoquer "main". Il faudrait rajouter _start: avant ton main.

Cependant, même en faisant cela, le problème persiste... Je pense qu'il y a effectivement un problème avec le ELF header du coup...
__________________
Toute question technique envoyée en MP ira directement à la poubelle

Un code ne marchera jamais,il n'a jamais reçu la capacité de se déplacer.
Inutile donc de dire "ça marche pas", donnez plûtot des informations précises afin de mieux pouvoir vous aider.


Grand gourou de la -attitude - Sauvons Internet!
supersnail est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 04/09/2011, 11h58   #7
Membre actif
 
Homme
Étudiant
Inscription : décembre 2009
Messages : 172
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2009
Messages : 172
Points : 177
Points : 177
Bonjour,

eh bien je suis à moitié rassuré par ta réponse et je te remercie de ton aide. Dommage qu'on ne sache pas ce que rajoute gcc mais bon...

Ce qui est encore plus bizarre c'est que je n'ai pas vu ni entendu parler d'en-têtes ELF dont Le noyau se servirait pour trouver son fichier exécutable. ce serait assez tordu et source de pas mal de faille De plus si c'était un problème d'entête le 'execve' renverrait OK avant de renvoyer une erreur! Je n'arrive vraiment pas à déterminer d'où vient cette erreur! Faudrait débugger le noyau lui même et là c'est loin au dessus de mes compétences

En tout cas je continue mon tuto sur l'assembleur et j'essayerai quand j'aurai le temps de me pencher sur le code de gcc et si j'ai plus de nouvelles je te ferai savoir.

Merci encore de ton aide ++
baccali est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h40.


 
 
 
 
Partenaires

Hébergement Web