Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Portabilité Solaris/Linux/NetBSD/OpenBSD

28 réponses
Avatar
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.

10 réponses

1 2 3
Avatar
Nicolas George
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...
Avatar
JKB
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.
Avatar
Eric Levenez
Le 17/06/08 15:56, dans ,
« JKB » a écrit :

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 -- <http://www.levenez.com/&gt;
Unix is not only an OS, it's a way of life.
Avatar
JKB
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 » a écrit :

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.
Avatar
Gabriel Linder
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 ?
Avatar
JKB
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.
Avatar
Gabriel Linder
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.
Avatar
JKB
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.
Avatar
JKB
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 <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <signal.h>

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.
Avatar
Miod Vallat
> 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 ?
1 2 3