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.

8 réponses

1 2 3
Avatar
JKB
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Bruno Ducrot écrivait dans fr.comp.os.unix :
On 2008-06-20, JKB wrote:
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Bruno Ducrot écrivait dans fr.comp.os.unix :
On 2008-06-19, JKB wrote:
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



J'ai l'impression que vous n'avez pas compilé avec le même compilateur
que le programme qui ne fonctionne pas. Est-ce que ca passe toujours
avec le GCC que vous aviez compilé ?



Si, c'est le même compilo. Il est dans le path de l'utilisateur
_avant_ le gcc du système (pour que gfortran ne gueule pas lorsqu'il
se trouve avec gcc-3.3).




OK. Le pire, c'est que vous aviez donné la sortie de gcc -v. Je ferai
gaffe la prochaine fois.

Par contre, avez-vous essayer de remplacer l'appel a sigaltstack par un
syscall() ? Quelque chose comme :

if (syscall(288, &s_processus.pile_system, NULL) != 0)

au lieu de

if (sysaltstack(&s_processus.pile_system, NULL) != 0)

Le 288 provient de
http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/sys/syscall.h?rev=1.101&content-type=text/plain

On a en effet :
...
#define SYS_osigaltstack 53
...
#define SYS_sigaltstack 288

A priori, il existe deux appels systemes sous OpenBSD, celui suffixé par
'o' est probablement présente pour des raisons de compatibilité.



Tiens, en remplaçant sigaltstack par l'appel système 288, ça
fonctionne. Mais ce n'est pas terrible sur le plan de la
portabilité.

Bug dans OpenBSD ?

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 20/06/08 15:34, dans ,
« JKB » a écrit :

Tiens, en remplaçant sigaltstack par l'appel système 288, ça
fonctionne. Mais ce n'est pas terrible sur le plan de la
portabilité.

Bug dans OpenBSD ?



Ça fait penser à un problème d'includes, pas à un bug. Mais comme tu n'as
pas donné un programme compilable qui plante, on ne sait pas :-)

Compare la version après pré-processeur du programme qui plante et de celui
qui ne plante pas. L'include ou la définition de sigaltstack doit être
différent.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
Bruno Ducrot
On 2008-06-20, JKB wrote:
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Bruno Ducrot écrivait dans fr.comp.os.unix :
On 2008-06-20, JKB wrote:
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Bruno Ducrot écrivait dans fr.comp.os.unix :
On 2008-06-19, JKB wrote:
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



J'ai l'impression que vous n'avez pas compilé avec le même compilateur
que le programme qui ne fonctionne pas. Est-ce que ca passe toujours
avec le GCC que vous aviez compilé ?



Si, c'est le même compilo. Il est dans le path de l'utilisateur
_avant_ le gcc du système (pour que gfortran ne gueule pas lorsqu'il
se trouve avec gcc-3.3).




OK. Le pire, c'est que vous aviez donné la sortie de gcc -v. Je ferai
gaffe la prochaine fois.

Par contre, avez-vous essayer de remplacer l'appel a sigaltstack par un
syscall() ? Quelque chose comme :

if (syscall(288, &s_processus.pile_system, NULL) != 0)

au lieu de

if (sysaltstack(&s_processus.pile_system, NULL) != 0)

Le 288 provient de
http://www.openbsd.org/cgi-bin/cvsweb/~checkout~/src/sys/sys/syscall.h?rev=1.101&content-type=text/plain

On a en effet :
...
#define SYS_osigaltstack 53
...
#define SYS_sigaltstack 288

A priori, il existe deux appels systemes sous OpenBSD, celui suffixé par
'o' est probablement présente pour des raisons de compatibilité.



Tiens, en remplaçant sigaltstack par l'appel système 288, ça
fonctionne. Mais ce n'est pas terrible sur le plan de la
portabilité.



C'est clair. Mais notez que c'était juste pour cerner plus finement le
problème, et non quelque chose à mettre définitivement dans le code.

Bug dans OpenBSD ?



Je pencherais à priori sur un include foireux, qui, dans certaines
circonstances, va effectuer un appel système autre que 288.

Peut-être que si l'on reproduit les includes correspondant à votre
programme dans l'exemple minimal initial, alors l'on pourrait
reproduire ce comportement.

Bon courage,

--
Bruno Ducrot

-- Which is worse: ignorance or apathy?
-- Don't know. Don't care.
Avatar
JKB
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Eric Levenez écrivait dans fr.comp.os.unix :
Le 20/06/08 15:34, dans ,
« JKB » a écrit :

Tiens, en remplaçant sigaltstack par l'appel système 288, ça
fonctionne. Mais ce n'est pas terrible sur le plan de la
portabilité.

Bug dans OpenBSD ?



Ça fait penser à un problème d'includes, pas à un bug. Mais comme tu n'as
pas donné un programme compilable qui plante, on ne sait pas :-)



Je veux bien donner une version compilable, mais c'est du lourd ;-)
Je vais mettre la version du soft en ligne dès que j'ai réglé un
problème de compilation (je suis contraint à reprendre le Makefile
généré par autoconf à la main à cause de l'utilitaire file qui ne se
comporte pas de la même façon sous OpenBSD que sous les autres
unix).

Compare la version après pré-processeur du programme qui plante et de celui
qui ne plante pas. L'include ou la définition de sigaltstack doit être
différent.




Programme qui plante :
...
typedef struct sigaltstack {
void *ss_sp;
size_t ss_size;
int ss_flags;
} stack_t;
...
int sigaltstack(const struct sigaltstack *, struct sigaltstack *);
...
if (sigaltstack(&s_etat_processus.pile_signal, 0L) != 0)
...

Programme qui fonctionne : il n'y a plus de sigaltstack, mais un
syscal...

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 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Bruno Ducrot écrivait dans fr.comp.os.unix :
Je pencherais à priori sur un include foireux, qui, dans certaines
circonstances, va effectuer un appel système autre que 288.

Peut-être que si l'on reproduit les includes correspondant à votre
programme dans l'exemple minimal initial, alors l'on pourrait
reproduire ce comportement.



Bon, mes include système :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

#ifndef RPLARGS
# include <sys/resource.h>
# include <sys/select.h>
# include <sys/socket.h>
# include <sys/stat.h>
# include <sys/time.h>
# include <sys/timeb.h>
# include <sys/types.h>
# include <sys/un.h>
# include <sys/wait.h>

# include <arpa/inet.h>
# include <netinet/in.h>
# include <netdb.h>
# include <iconv.h>

# include <dlfcn.h>
# include <fcntl.h>
# include <pthread.h>
# include <pwd.h>
# include <setjmp.h>
# include <signal.h>
# include <termios.h>
# include <time.h>
# include <unistd.h>

# include "history.h"
# include "readline.h"
# include "termcap.h"

# include "gsl/gsl_cdf.h"
# include "gsl/gsl_errno.h"
# include "gsl/gsl_fft_complex.h"
# include "gsl/gsl_randist.h"
# include "gsl/gsl_rng.h"
# include "gsl/gsl_sf.h"
#endif

Donc un exemple minimal :

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

# include <sys/resource.h>
# include <sys/select.h>
# include <sys/socket.h>
# include <sys/stat.h>
# include <sys/time.h>
# include <sys/timeb.h>
# include <sys/types.h>
# include <sys/un.h>
# include <sys/wait.h>

# include <arpa/inet.h>
# include <netinet/in.h>
# include <netdb.h>
# include <iconv.h>

# include <dlfcn.h>
# include <fcntl.h>
# include <pthread.h>
# include <pwd.h>
# include <setjmp.h>
# include <signal.h>
# include <termios.h>
# include <time.h>
# include <unistd.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);
}

qui fonctionne !

gauss:[~/test] > gcc test1.c -I/opt/lib
gauss:[~/test] > ./a.out
Done !

Je ne comprends plus...

JKB
Avatar
Eric Levenez
Le 20/06/08 17:56, dans ,
« JKB » a écrit :

Je ne comprends plus...



Regarde la version pré-processeur, tu verras ce qui cloche.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.
Avatar
JKB
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Eric Levenez écrivait dans fr.comp.os.unix :
Le 20/06/08 17:56, dans ,
« JKB » a écrit :

Je ne comprends plus...



Regarde la version pré-processeur, tu verras ce qui cloche.



C'est bien ce que j'ai fait et je ne vois pas ce qui cloche...

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 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
JKB écrivait dans fr.comp.os.unix :
Le 20-06-2008, à propos de
Re: Portabilité Solaris/Linux/NetBSD/OpenBSD,
Eric Levenez écrivait dans fr.comp.os.unix :
Le 20/06/08 17:56, dans ,
« JKB » a écrit :

Je ne comprends plus...



Regarde la version pré-processeur, tu verras ce qui cloche.



C'est bien ce que j'ai fait et je ne vois pas ce qui cloche...



Bon, je viens de comparer les sorties du préprocesseur données par
gcc-3.3.5 (origine OpenBSD) et gcc-4.3.1 (directement de GNU,
compilé par mes soins). Les sorties sont les mêmes.

Je penche donc de plus en plus sur un effet de bord de l'appel
système lui-même. Je ne vois pas pourquoi l'exemple minimal
fonctionne alors que le programme complet plante. Je vais signaler
le problème directement chez OpenBSD...

Pour ceux qui veulent jeter un coup d'oeil, le programme complet est
téléchargeable là :
http://www.rpl2.net/download/rpl-4.0.0.prerelease.7.tar.bz2
et se compile sous OpenBSD par :
./configure --disable-encoding-autodetection --enable-final-encoding=UTF-8
make && make install

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.
1 2 3