DOMANDA Segmentation Fault (Ubuntu 1804)

JDany

Utente Attivo
461
24
CPU
Ryzen 9 3900x
Scheda Madre
ASUS H170-Pro
RAM
Corsair Vengeance LPX 2x8 GB
GPU
ZOTAC RTX 3070 TWIN EDGE OC
Monitor
Philips Gaming Monitor 24"
PSU
Corsair CX450M
Case
Sharkoon VS4-V
OS
Windows 11 Pro
Salve. Ho scritto questo programma in C

C:
#include <stdio.h>
#include <stdlib.h>

int main(void){
    
    __asm__("movl $1, %eax;"
           "int $0x80;");
    
    return 0;
}

Quando vado a compilare il programma, nessun errore, per il gcc tutto ok. Però quando eseguo, su Windows il programma parte ma ritorna un errore, mentre su Ubuntu non lo esegue nemmeno.
L'errore in fase di run è questo: "Segmentation fault (core dumped)"

Da cosa è generato e come si può risolvere?
 

BAT

Moderatore
Staff Forum
Utente Èlite
22,946
11,581
CPU
1-Neurone
Dissipatore
Ventaglio
RAM
Scarsa
Net
Segnali di fumo
OS
Windows 10000 BUG
Premetto che non conosco il significato dell'istruzione assembler che hai annegato nel codice C, tuttavia gli errori di segmentazione avvengono quando tenti l'accesso a zone di memoria a cui non ti è permesso (dal sistema operativo) accedere, per esempio zone di memoria riservate al kernel del sistema o aree di memoria protette per ragioni di sicurezza (o perché già assegnate ad un altro processo)
 

JDany

Utente Attivo
461
24
CPU
Ryzen 9 3900x
Scheda Madre
ASUS H170-Pro
RAM
Corsair Vengeance LPX 2x8 GB
GPU
ZOTAC RTX 3070 TWIN EDGE OC
Monitor
Philips Gaming Monitor 24"
PSU
Corsair CX450M
Case
Sharkoon VS4-V
OS
Windows 11 Pro
Premetto che non conosco il significato dell'istruzione assembler che hai annegato nel codice C, tuttavia gli errori di segmentazione avvengono quando tenti l'accesso a zone di memoria a cui non ti è permesso (dal sistema operativo) accedere, per esempio zone di memoria riservate al kernel del sistema o aree di memoria protette per ragioni di sicurezza (o perché già assegnate ad un altro processo)

L'istruzione in Assembly che ho scritto è "equivalente" alla funzione getchar(), cioè aspetta la pressione di un carattere, lo stampa a video e poi chiude il programma.

Quindi in pratica noi non possiamo più usare gli interrupt, dato che il s.o. ne vieta l'utilizzo?
 

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
L'istruzione in Assembly che ho scritto è "equivalente" alla funzione getchar(), cioè aspetta la pressione di un carattere, lo stampa a video e poi chiude il programma.

Quindi in pratica noi non possiamo più usare gli interrupt, dato che il s.o. ne vieta l'utilizzo?
Conclusione affrettata: se tu scrivessi un programma assembly ti limiteresti a quelle due istruzioni? Magari è la modalità con cui effettui la chiamata che non è adeguata.. prova ad approfondire

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
L'istruzione in Assembly che ho scritto è "equivalente" alla funzione getchar(), cioè aspetta la pressione di un carattere, lo stampa a video e poi chiude il programma.

Quindi in pratica noi non possiamo più usare gli interrupt, dato che il s.o. ne vieta l'utilizzo?
Quel codice assembly corrisponde al return 0 in C (in verità ad un return e basta, dovresti caricare $0 in %ebx se non erro). Per fare quella funzione che hai detto tu dovrebbe essere cosi (sicuro ci son errori eh)
Codice:
/*Varie parti sopra che sticà*/
movl $3, %eax
movl $2, %ebx
movl num, %ecx
movl $5, &edx     
int $0x80

movl $4, %eax
movl $1, %ebx
movl num, %ecx
movl $5, &edx     
int $0x80

movl $1, %eax
int $0x80
Comunque, togli l'int $0x80 e dovresti risolvere. @Andretti60 e @DispatchCode dovrebbero saperne a pacchi.
 
Ultima modifica:

rctimelines

Utente Èlite
5,143
2,023
CPU
Ryzen 7 2700X | i7-6700k@4.5 | i5-4460... altri
Dissipatore
wraith MAX | Scythe Katana2|Arctic Freezer 11LP
Scheda Madre
Asrock B450 Fatal1ty 4K | Asus Prime Z270P | Acer Veriton
HDD
Samsung 970evo m.2 | vari | Samsung 860 evo
RAM
16GB G.Skill TridentZ 3000 | 16GB CORSAIR 2133 | 8GB DDR3 1600
GPU
RadeonPro WX3100 4G | ZOTAC GTX 1070 8G | Quadro k620 2G
Monitor
DELL 2419P 2K + Benq 17" | LG Ultrawide 27''
Net
fibra 1000
OS
Windows10-pro64/OpenSUSE-QL15.1/Debian 10.3
Comunque, togli l'int $0x80 e dovresti risolvere.

??? Ma se la chiamata alla funzione è proprio quella! Perché la dovrebbe togliere?..

Inviato dal mio Nexus 5 utilizzando Tapatalk
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Premetto di non averlo mai utilizzato sotto a Linux.

Int 0x80 è proprio la chiamata di sistema. Mi sembra manchi un parametro, ovvero l'error code (ebx=0).
Questa chiamata di sistema è la exit però, quindi dovresti vedere il programma che si apre e si chiude.

Preciso che è molto probabile che sotto Linux le system call vengano esposte (attraverso le int), e poi internamente venga chiamata syscall.

Per curiosità sotto a Windows, avevo risposto qui: https://forum.tomshw.it/threads/in-che-modo-vengono-realizzate-le-system-call.598525/
 

rodhellas

Utente Èlite
1,522
427
CPU
Ryzen 5 3600
Dissipatore
GELID Phantom
Scheda Madre
MSI B450 Gaming Plus Max
HDD
500GB m.2 + 2TB HDD
RAM
16GB Corsair LPX 3000mhz
GPU
Gigabyte GTX 960 OC
Audio
Integrata
Monitor
SyncMaster 223BW
PSU
Antec HCG-520M
Case
Meshify C
Net
Gigabit Fastweb
OS
Windows 10 64bit
??? Ma se la chiamata alla funzione è proprio quella! Perché la dovrebbe togliere?..

Inviato dal mio Nexus 5 utilizzando Tapatalk
Pare che $0x80 sia per i sistemi a 32bit, e da segfault perchè il kernel non lo riesce a simulare. La soluzione è usare "syscall" o provare a compilare (in gcc) con -m32 e altre cose
 
Ultima modifica:

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,223
1,854
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Pare che $0x80 sia per i sistemi a 32bit, e da segfault perchè il kernel non lo riesce a simulare. La soluzione è usare "syscall" o provare a compilare (in gcc) con -m32 e altre cose

int 0x80 funziona bene sui 32bit e male con i 64bit a causa degli indirizzi, suppongo. Se è compilata a 32bit la parte alta dei registri (i 32bit importanti) viene posta a 0 anche utilizzando RAX e gli altri.
In teoria dovrebbe funzionare quindi 0x80, ma solo se è nel range dei 32bit. La soluzione corretta però è quella di utilizzare syscall.
 
  • Mi piace
Reazioni: rodhellas

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili