IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 32-bits / 64-bits Assembleur Discussion :

[YASM] Signaux Linux 32 vs 64bits ?


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 6
    Points
    6
    Par défaut [YASM] Signaux Linux 32 vs 64bits ?
    Bonjour à vous tous,

    je suis confronté à un problème étrange aussi bien que mystérieux et quelque peu opaque à mon intellect.
    But : capter les signaux sous Linux pour interagir avec le programme. En l'occurence, je capte le SIGUSR1.

    Grosso modo le code ressemble à çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    InitSignal:
           Section .data
           sa_handler      dd 0,0,0,0,0,0,0,0      ; pointer to function signal handler
           Section .text
     
            SC_LINUX    equ 0x80
            SC_SIGACTION    equ 67
            SIG_USR1        equ 10
            SIG_IGN         equ 1   ; Ignore Signal
     
            %if ARCH = 32
                    mov     dword [ sa_handler ], SignalUSR1_Handler
            %endif
            %if ARCH = 64
                    mov     dword [ sa_handler ], SignalUSR1_Handler
            %endif
     
            mov     edx, 0
            lea     ecx, [ sa_handler ]
            mov     ebx, SIG_USR1
            mov     eax, SC_SIGACTION
            int     SC_LINUX
     
            ret
     
     
    ; To Handle the SIGUSR1 signal
    SignalUSR1_Handler:
            mov     dword [ signal1 ], TRUE
            ret
    Donc çà, çà fonctionne en 32bits sans soucis.
    En revanche, sur mon laptop 64bits, çà me fait un Seg Fault dans les choux lorsque le signal est lancé au processus.
    Avec GDB, j'ai pu me rendre compte que le système appele l'adresse 0x401ff2 au lieu de l'adresse de ma procédure SignalUSR1_Handler 0x40132A

    Si je met à la place de l'adresse de SignalUSR1_Handler, le SIG_IGNORE, là par contre çà se comporte normalement et le signal est ignoré. ( mov dword [ sa_handler ], SIG_IGN ).

    J'ai remarqué aussi que la taille de la structure passée en paramètre change suivant l'architecture du système. J'ai donc réservé plus ou moins de place pour sa_handler, sans succès.

    Si quelqu'un a une idée ou une success story, parce que là je bloque et je vois pas comment débugger plus en avant ?

    Merci beaucoup à ceux qui auront le courage de mettre le nez là-dedans.

    Références : http://docs.cs.up.ac.za/programming/.../syscalls.html
    http://kerneltrap.org/node/14164

  2. #2
    Futur Membre du Club
    Inscrit en
    Juillet 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 13
    Points : 6
    Points
    6
    Par défaut syscall
    En 64bits, les appels systèmes sous Linux se font avec l'instruction syscall
    De plus, le passage des paramètres est différent par rapport à int 0x80.

    La solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    		SC_RTSIGACTION	equ 13
    		SC_RTSIGRETURN	equ 15
     
    		mov	qword [ sa_handler ], SignalUSR1_Handler
    		mov	qword [ sa_handler + 16 ], SignalReturn
    		mov	r10, 8
    		mov	rdx, 0
    		mov	rcx, 0
    		mov	rbx, 0
    		lea	rsi, [ sa_handler ] 
    		mov	rdi, SIG_USR1
    		mov	rax, SC_RTSIGACTION
    		syscall
    Pour plus de détail voir le sujet sur KernelTrap :-)
    Merci pour ceux qui ont pris le temps de lire l'énoncé du problème.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mysql en 64bits sous Linux, vous en pensez quoi ?
    Par clavier12AZQSWX dans le forum MySQL
    Réponses: 2
    Dernier message: 28/05/2009, 14h36
  2. [OpenSuse11.0] linux 32 ou 64bits
    Par wodel dans le forum Administration système
    Réponses: 3
    Dernier message: 21/12/2008, 19h24
  3. Envoi de signaux comme sous linux ( kill(t_pid,integer) )
    Par Bleys dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 24/06/2008, 08h53
  4. Réponses: 3
    Dernier message: 29/12/2005, 15h43
  5. [INFO]Signaux Linux et Java
    Par el3gans dans le forum Général Java
    Réponses: 5
    Dernier message: 26/11/2004, 00h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo