Portabilité Solaris/Linux/NetBSD/OpenBSD

Le
JKB
Bonjour à tous,

Je viens de tomber sur un OS avec OpenBSD et je ne comprends pas
bien ce qui se passe.

Considérons le code suivant :

if ((s_etat_processus.pile_signal.ss_sp =
malloc(s_etat_processus.pile_signal.ss_size =
SIGSTKSZ)) == NULL)
{
// Gestion de l'erreur sans aucun intérêt ici
exit(EXIT_FAILURE);
}

s_etat_processus.pile_signal.ss_flags = 0;

if (sigaltstack(&s_etat_processus.pile_signal, NULL) != 0)
{
perror("");
exit(EXIT_FAILURE);
}



J'ai testé sous :
- Solaris 9 sparc : OK
- Solaris 10 sparc, i386 : OK
- Linux 2.6 (debian) i386, amd64, sparc64 : OK
- NetBSD 4.0 sparc : OK
- OpenBSD 4.3 i386 : KO !

Sous OpenBSD 4.3, perror() m'affiche un superbe "Invalid argument".
Je viens de lire, relire, rerelire, rererelire la page de man de
sigaltstack (sous OpenBSD), je ne vois pas ce qui n'est pas bon et
en quoi j'ai écrit une conn^Wbêtise.

Une idée ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #7027631
JKB wrote in message
Considérons le code suivant :



Tu fais ça dans le code principal du programme, on dans un signal handler ?

if ((s_etat_processus.pile_signal.ss_sp


Beurk les noms de variable en français...
JKB
Le #7027621
Le 17-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Nicolas George écrivait dans fr.comp.os.unix :
JKB wrote in message
Considérons le code suivant :



Tu fais ça dans le code principal du programme, on dans un signal handler ?



Directement dans le corps du programme, au début, car je cherche à
récupérer les segfaults, les bus errors et les dépassements de pile.

if ((s_etat_processus.pile_signal.ss_sp >


Beurk les noms de variable en français...



Je ne vois pas ce que cette remarque fait ici.

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Eric Levenez
Le #7028861
Le 17/06/08 15:56, dans « JKB »
J'ai testé sous :
- Solaris 9 sparc : OK
- Solaris 10 sparc, i386 : OK
- Linux 2.6 (debian) i386, amd64, sparc64 : OK
- NetBSD 4.0 sparc : OK
- OpenBSD 4.3 i386 : KO !



Tu peux ajouter :

- Mac OS X 10.5.3 : i386, x86_64 : OK

--
Éric Lévénez -- Unix is not only an OS, it's a way of life.
JKB
Le #7028851
Le 17-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Eric Levenez écrivait dans fr.comp.os.unix :
Le 17/06/08 15:56, dans « JKB »
J'ai testé sous :
- Solaris 9 sparc : OK
- Solaris 10 sparc, i386 : OK
- Linux 2.6 (debian) i386, amd64, sparc64 : OK
- NetBSD 4.0 sparc : OK
- OpenBSD 4.3 i386 : KO !



Tu peux ajouter :

- Mac OS X 10.5.3 : i386, x86_64 : OK



Je n'ai pas (mon mac est un PPC qui tourne avec le pingouin ;-) ).
Bon, ce n'est toujours pas une explication rationnelle...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Gabriel Linder
Le #7035051
On Tue, 17 Jun 2008 16:28:03 +0000, JKB wrote:

Je n'ai pas (mon mac est un PPC qui tourne avec le pingouin ;-) ).
Bon, ce n'est toujours pas une explication rationnelle...

JKB



Je viens de tester ton code sur un OpenBSD 4.3/amd64, et il tourne comme
un charme. Je n'ai pas d'OpenBSD 4.3/i386 sous la main actuellement, je
pourrais tester ce soir sur un OpenBSD/i386 -current, si tu veux.

Par contre, tu le compiles avec une version de GCC ou des options
spéciales ?
JKB
Le #7035231
Le 18-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Gabriel Linder écrivait dans fr.comp.os.unix :
On Tue, 17 Jun 2008 16:28:03 +0000, JKB wrote:

Je n'ai pas (mon mac est un PPC qui tourne avec le pingouin ;-) ).
Bon, ce n'est toujours pas une explication rationnelle...

JKB



Je viens de tester ton code sur un OpenBSD 4.3/amd64, et il tourne comme
un charme. Je n'ai pas d'OpenBSD 4.3/i386 sous la main actuellement, je
pourrais tester ce soir sur un OpenBSD/i386 -current, si tu veux.



Je compile avec un gcc 4.3.1 compilé par mes soins (j'ai besoin plus
loin d'un gfortran).

Par contre, tu le compiles avec une version de GCC ou des options
spéciales ?



gauss:[~] > gcc -v
Utilisation des specs internes.
Target: i386-unknown-openbsd4.3
Configuré avec: ../gcc-4.3.1/configure -v
--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/opt
--enable-shared --enable-threads=posix --disable-multilib
--with-mpfr=/usr/local --with-gmp=/usr/local
Mode de thread: posix
gcc version 4.3.1 (GCC)

Options de compilation :

gcc -DHAVE_CONFIG_H -Dd_version_rpl="4.0.0.prerelease.7"
-Dd_exec_path="/opt" -DFORCE_GNUPLOT_PATH -UDEBUG -UMOTIF_SUPPORT
-UPOSTSCRIPT_SUPPORT -DGNUPLOT_SUPPORT -DVIM_SUPPORT -UMYSQL_SUPPORT
-UPOSTGRESQL_SUPPORT -UEXPERIMENTAL_CODE -Dd_date_rpl=""Wednesday
06/18/08, 13:59:05 CEST"" -Dd_date_en_rpl=""Wednesday 06/18/08,
13:59:05 CEST"" -g -Dd_locale="UTF-8" -I.
-I../../rpl-4.0.0.prerelease.7/src -I..
-I../../rpl-4.0.0.prerelease.7/src -I..
-I../../rpl-4.0.0.prerelease.7/tools/readline-5.2
-I../tools/readline-5.2 -DREADLINE_LIBRARY
-I../tools/ncurses-5.6/include
-I../../rpl-4.0.0.prerelease.7/tools/ncurses-5.6/include
-I../tools/gsl-1.11 -I/usr/X11R6/include -DLIBRPL -g -O2
-malign-double -mieee-fp -Wall -funsigned-char
-Wno-pointer-sign -MT librpl_a-rpl.conv.o -MD -MP -MF
.deps/librpl_a-rpl.conv.Tpo -c -o librpl_a-rpl.conv.o `test -f
'rpl.conv.c' || echo '../../rpl-4.0.0.prerelease.7/src/'`rpl.conv.c

Je n'ai pas l'impression qu'il y ait une option ésotérique là
dedans...

Je n'ai pas essayé avec une autre version de gcc sous OpenBSD, mais avec la
même version de gcc sous Solaris, ça roule...

Cordialement,

JKB
--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Gabriel Linder
Le #7042281
On Wed, 18 Jun 2008 12:03:18 +0000, JKB wrote:

Je compile avec un gcc 4.3.1 compilé par mes soins (j'ai besoin


plus
loin d'un gfortran).



Je ne me suis pas amusé à installer un GCC 4.3.1, mais avec celui présent
dans le système de base le code s'exécute sans souci.
JKB
Le #7043031
Le 19-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Gabriel Linder écrivait dans fr.comp.os.unix :
On Wed, 18 Jun 2008 12:03:18 +0000, JKB wrote:

Je compile avec un gcc 4.3.1 compilé par mes soins (j'ai besoin


plus
loin d'un gfortran).



Je ne me suis pas amusé à installer un GCC 4.3.1, mais avec celui présent
dans le système de base le code s'exécute sans souci.



Bon, je vais donc devoir regarder la sortie assembleur :-( ...

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
JKB
Le #7046061
Le 18-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Gabriel Linder écrivait dans fr.comp.os.unix :
On Tue, 17 Jun 2008 16:28:03 +0000, JKB wrote:

Je n'ai pas (mon mac est un PPC qui tourne avec le pingouin ;-) ).
Bon, ce n'est toujours pas une explication rationnelle...

JKB



Je viens de tester ton code sur un OpenBSD 4.3/amd64, et il tourne comme
un charme. Je n'ai pas d'OpenBSD 4.3/i386 sous la main actuellement, je
pourrais tester ce soir sur un OpenBSD/i386 -current, si tu veux.

Par contre, tu le compiles avec une version de GCC ou des options
spéciales ?



Xpost et Fu2...

Je comprends de moins en moins le problème...
Considérons le bout de code suivant :

nclude #include #include #include
int
subroutine(int a)
{
stack_t pile_signal;

if ((pile_signal.ss_sp = malloc(pile_signal.ss_size SIGSTKSZ)) == NULL)
{
printf("Malloc failed !n");
return(EXIT_FAILURE);
}

pile_signal.ss_flags = 0;

if (sigaltstack(&pile_signal, NULL) != 0)
{
perror("sigaltstack");
return(EXIT_FAILURE);
}

printf("Done !n");
return(EXIT_SUCCESS);
}

int
main(int argc, char *argv[])
{
return subroutine(1);
}

Ce truc compile et fonctionne parfaitement. Preuve :

gauss:[~/test] > uname -a
OpenBSD gauss.systella.fr 4.3 GENERIC#698 i386
gauss:[~/test] > gcc -g -O2 -malign-double -mieee-fp -Wall
-funsigned-char -Wno-pointer-sign test.c
gauss:[~/test] > ./a.out
Done !
gauss:[~/test] >

Les options de compilation sont les options que j'utilise dans le
programme qui plante.

gauss:[~/rpl/build/src] > ./rpl -is
+++RPL/2 (R) version 4.0.0.prerelease.7 (Tuesday 06/17/08, 15:45:44 CEST)
+++Copyright (C) 1989 à 2007, 2008 BERTRAND Joël
+++Système : Initialisation de la pile spécifique de signal impossible
gauss:[~/rpl/build/src] > gcc -v
Configuré avec: ../gcc-4.3.1/configure -v --enable-languages=c,c++,fortran,
objc,obj-c++ --prefix=/opt --enable-shared --enable-threads=posix
--disable-multilib --with-mpfr=/usr/local --with-gmp=/usr/local
Mode de thread: posix
gcc version 4.3.1 (GCC)
gauss:[~/test] >

Le code qui ne fonctionne pas est celui-ci :

int
main(int argc, char *argv[])
{
return((rplinit(argc, argv, NULL) == EXIT_SUCCESS)
? EXIT_SUCCESS : EXIT_FAILURE);
}

int
rplinit(int argc, char *argv[], unsigned char ***resultats)
{
# include
# "copyright.conv.h"
# include "licence.conv.h"

file *f_source;

int erreur_historique;
int status;

integer4 erreur_fichier;
integer4 unite_fichier;

logical1 core;
logical1 debug;
logical1 erreur;
logical1 mode_interactif;
logical1 option_a;
logical1 option_A;
logical1 option_c;
logical1 option_d;
logical1 option_h;
logical1 option_i;
logical1 option_l;
logical1 option_p;
logical1 option_s;
logical1 option_S;
logical1 option_t;
logical1 option_v;

struct_objet *s_objet;

struct_processus s_etat_processus;

struct sigaction action;

struct timespec attente;

unsigned char *arguments;
unsigned char drapeau_encart;
unsigned char *type_debug;
unsigned char *home;
unsigned char *langue;
unsigned char *message;
unsigned char *nom_fichier_temporaire;
unsigned char option;
unsigned char presence_definition;
unsigned char *ptr;
unsigned char *tampon;
unsigned char traitement_fichier_temporaire;

unsigned long i;

void *l_element_courant;
void *l_element_precedent;
void *l_element_suivant;

if ((langue = getenv("LANG")) != NULL)
{
s_etat_processus.langue (strncmp(langue, "fr", 2) == 0) ? 'F' : 'E';
}
else
{
s_etat_processus.langue = 'E';
}

attente.tv_sec = 0;
attente.tv_nsec = GRANULARITE_us * 1000;

printf("+++RPL/2 (R) version %s (%s)n", d_version_rpl,
(s_etat_processus.langue == 'F') ?
d_date_rpl : d_date_en_rpl);

if (s_etat_processus.langue == 'F')
{
printf("+++Copyright (C) 1989 2007, 2008 BERTRAND Joëln");
}
else
{
printf("+++Copyright (C) 1989 to 2007, 2008 BERTRAND Joëln");
}

if (getenv("HOME") != NULL)
{
home = getenv("HOME");
}
else if ((getenv("USER") != NULL) && (getpwnam(getenv("USER")) != NULL))
{
home = getpwnam(getenv("USER"))->pw_dir;
}
else if ((getenv("LOGNAME") != NULL) && (getpwnam(getenv("LOGNAME"))
!= NULL))
{
home = getpwnam(getenv("LOGNAME"))->pw_dir;
}
else if ((getuid() != -1) && (getpwuid(getuid()) != NULL))
{
home = getpwuid(getuid())->pw_dir;
}
else
{
home = "";
}

// Initialisation d'une pile de signal pour ruper les
// dordement de pile

// s_processus.pile_system est une variable stack_t

if ((s_etat_processus.pile_signal.ss_sp malloc(s_etat_processus.pile_signal.ss_size SIGSTKSZ)) == NULL)
{
erreur = d_es_allocation_memoire;

if (s_etat_processus.langue == 'F')
{
printf("+++Syste : Mémoire insuffisanten");
}
else
{
printf("+++System : Not enough memoryn");
}

return(EXIT_FAILURE);
}

s_etat_processus.pile_signal.ss_flags = 0;

if (sigaltstack(&s_etat_processus.pile_signal, NULL) != 0)
{
erreur = d_es_signal;

if (s_etat_processus.langue == 'F')
{
printf("+++Système : "
"Initialisation de la pile spécifique de signal"
" impossiblen");
}
else
{
printf("+++System : Initialization of signal "
"stack failedn");
}

return(EXIT_FAILURE);
}

/* ............... */

return(EXIT_SUCCESS);
}

J'ai dû écrire une absurdité, mais je ne vois toujours pas laquelle.
Surtout, je ne vois pas la différence entre mon exemple minimal qui
fonctionne et mon code qui ne fonctionne pas sous OpenBSD i386 (tous
les autres Unix que j'ai sous la main Solaris, Linux, NetBSD sous
sparc32, sparc64, ppc32, i386 et amd64 ont été testés avec succès).

Une idée ?

Cordialement,

JKB

--
Le cerveau, c'est un véritable scandale écologique. Il représente 2% de notre
masse corporelle, mais disperse à lui seul 25% de l'énergie que nous
consommons tous les jours.
Miod Vallat
Le #7047211
> J'ai dû écrire une absurdité, mais je ne vois toujours pas laquelle.



Ça a l'air correct pourtant. Que donne un kdump du ktrace, histoire de
connaître les valeurs exactes passées à l'appel système ?
Publicité
Poster une réponse
Anonyme