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 à çà :
Donc çà, çà fonctionne en 32bits sans soucis.
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
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
Partager