OVH Cloud OVH Cloud

[gentoo-user-fr] [ASM] Erreur de segmentation

6 réponses
Avatar
youshe
Bonjour,

Je me lance dans l'assembleur sous linux et j'ai un petit problème.
Je tape ce programme :

section .text
global _start

msg db 'Hello, world',0xa
len equ $ - msg

_start:

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80


Ensuite, je compile et link mais j'ai une erreur de segmentation à
l'éxécution.
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.
J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3

Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite,
une piste vers la solution ou même la dite solution à ce problème ?

Merci :D

Fred

--
gentoo-user-fr@gentoo.org mailing list

6 réponses

Avatar
Hubert Mercier
Mes cours d'asm sont très très très loin... (et c'était sous DOS et non
Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise donc.

Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes
souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter ce
qui suit dans la mémoire après vos commandes d'affichage... Et qui n'a
probablement aucun sens (ce qui suit, pas vos commande, hein ^^)..

Bon courage en tous cas. Est-il indiscret de vous demander pourquoi vous
vous intéressez à l'ASM ?



youshe a écrit :

Bonjour,

Je me lance dans l'assembleur sous linux et j'ai un petit problème.
Je tape ce programme :

section .text
global _start

msg db 'Hello, world',0xa
len equ $ - msg

_start:

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80


Ensuite, je compile et link mais j'ai une erreur de segmentation à
l'éxécution.
J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.
J'ai bien entendu une gentoo portée par un noyau : 2.6.12-gentoo-r3

Est ce que quelqu'un saurait me dire à quoi ça peut être du, et ensuite,
une piste vers la solution ou même la dite solution à ce problème ?

Merci :D

Fred






--
mailing list
Avatar
youshe
Bonsoir, je ne vois pas mon propre message, certainement du à des
problèmes d'emails (j'ai changé d'email pour cette liste donc...), donc
si mon mail apparait deux fois, je m'en excuse... :)

Mes cours d'asm sont très très très loin... (et c'était sous DOS et
non Linux, à l'époque). Ne me tenez pas rigueur de dire une bêtise
donc.



Je n'ai pas osé touché à l'asm sous DOS en fait... Je me suis dit,
pourquoi ne pas attaquer directement sous linux ?

Mais n'avez-vous pas oublié de stopper votre programme (int 19 si mes
souvenirs sont bons) ? Sinon l'assembleur va continuer à interpréter
ce qui suit dans la mémoire après vos commandes d'affichage... Et qui
n'a probablement aucun sens (ce qui suit, pas vos commande, hein
^^)..



En fait, pour ce qui est d'arrêter le programme, on utilise l'appel
système :

mov eax, 1
int 0x80

En fait, de ce coté là, linux semble être très différent que sous
DOS/WINDOWS, on utilise simplement l'int 80h permettant d'accéder aux
appels systèmes.

Bon courage en tous cas.



Merci, c'est gentil, je pense que j'en aurai besoin :)

Est-il indiscret de vous demander pourquoi vous vous intéressez à
l'ASM ?



En fait, je ne saurai répondre exactement, peut être parce que je suis
un peu (beaucoup ?) kamikase, mais surtout parce que j'aime vraiment
comprendre les choses du fond et je pense que l'asm, étant de très bas
niveau (on aura du mal à faire plus bas...), je pense que c'est une
approche assez intéressante poru ce genre de choses. Et puis, je me suis
toujorus dit que je devais apprendre l'assembleur un jour ou l'autre
simplement pour m'amuser et pouvoir en discuter en connaissance de cause
avec des amis qui eux sont accroc à ce langage (par exemple un membre du
projet skan (skan.developpez.com), projet visant à contruire un
noyau/OS entièrement en assembleur.
Dans l'optique de mes projets du moment, je peux vous dire par exemple
m'intéresser à la théorie des langages et plus généralement à
l'informatique théorique, aux OS aussi bien développement que théorie, à
la programmation système sous linux ainsi qu'au projet hurd. Ces petits
exemples peuvent peut être vous donner une vision plus détaillée de mes
petits rêves du moment...
En fait, je fais ça plus par amusement et curiosité que par soucis
d'efficassité :)

Merci pour votre aide...

Fred

P.S. la doc que j'ai utilisée pour ce programme est celle disposée sur
le site linuxassembly.org, plus exactement ici :
http://asm.sourceforge.net/intro/hello.html
Peut être qu'une version en français existe sur le net, je n'ai pas osé
chercher :)

--
mailing list
Avatar
Frederik Deweerdt
Le 21/07/05 21:18 +0200, youshe écrivit:
Bonjour,


Salut,


section .text


Ca devrait être section .data, puisque ce sont tes données

global _start

msg db 'Hello, world',0xa


^^^^^
|--------------------------------|
|
0xa c'est fin de ligne, il te faut plutot 0, fin de chaîne


len equ $ - msg



section .text --> ici, c'est le début du programme

_start:

mov edx, len
mov ecx, msg
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
int 0x80


J'ai aussi remarqué que lorsque j'affichais certaines manpage j'avais ce
même type d'erreur.


Je dirais que c'est un problème différent, ta RAM se porte bien?

A+
Fred

--
o---------------------------------------------o
| http://open-news.net : l'info alternative |
| Tech - Sciences - Politique - International |
o---------------------------------------------o

--
mailing list
Avatar
Pierre MAHOT
> > section .text
Ca devrait être section .data, puisque ce sont tes données



Le segmentation fault se produit quand le programme accede à une zone
mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que
cette modif devrait résoudre ton problème.

D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?

Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui
peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est
l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque
tu travaille sur des structures de données complexes.

--
Pierre

--
mailing list
Avatar
Frederik Deweerdt
Le 22/07/05 11:39 +0200, Pierre MAHOT écrivit:

D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?



C'est le int 0x80 avec eax = 4 : ça appelle sys_write de la manière suivante:
write(1, msg, len); // 1 == stdout

A+
Fred

--
o---------------------------------------------o
| http://open-news.net : l'info alternative |
| Tech - Sciences - Politique - International |
o---------------------------------------------o

--
mailing list
Avatar
youshe
> > > section .text
> Ca devrait être section .data, puisque ce sont tes données

Le segmentation fault se produit quand le programme accede à une zone
mémoire qu'il n'a pas le droit d'accéder. Je pense effectivement que
cette modif devrait résoudre ton problème.



Effectivement, cette modification résoud bien le problème.

D'autre part par simple curiosité: laquelle de tes instructions est
sensée afficher le message?



Donc d'après le tutoriel (et je le comprend aussi comme ça, l'affichage
du message se fait avec l'appel se fait grace à :

mov edx, len ; longueur du message
mov ecx, msg ; message à afficher
mov ebx, 1 ; file descriptor (stdout)*
mov eax, 4 ;n° d'appel système, ici 4 pour afficher msg
int 0x80

* pourquoi passer 1 à ebx, là, je ne sais pas trop encore, mais je pense
que c'est pour choisir l'endoit où envoyer le message, sortie standard,
ou un autre périférique...

Pour les manpages, tu remarquera qu'il n'y a pas forcément que man qui
peut planter avec ce type d'erreur. Le "seg-fault" le plus courant est
l'acces à un pointeur null en C, ce qui peut être tres vicieux lorsque
tu travaille sur des structures de données complexes.



A mon avis, ça vient peut être du fait qu'un programme utile à man a été
mal compilé... J'ai normalent un emerge -e world qui devrait arriver
d'ici peu, ça devrait pouvoir corriger le problème je pense...

Et pour répondre à la question de Frederik, je ne pense pas que ça
vienne de la RAM étant donné que je n'ai eu que ce problème, avec
gentoo exclusivement. J'ai eu aussi un windows d'installé ainsi que du
FreeBSD, sans problèmes semblant provenir de la mémoire vive...

En tous cas, merci pour vos réponses..;

Fred aussi

--
mailing list