3 votes

Le drapeau GCC -mx32 est-il implémenté (correctement) ?

J'essaie de créer un programme qui communique avec un système embarqué 32 bits, qui fonctionne sur une machine x86_64 basée sur Linux (hôte). Sur le programme hôte, j'ai une structure contenant quelques pointeurs qui reflète une structure identique sur le système embarqué.

Le problème est que sur l'hôte, les pointeurs sont nativement de 64 bits, de sorte que l'offset des membres de la structure n'est pas le même que dans le système embarqué. Ainsi, lors de la copie de la structure (comme memcpy), le contenu se retrouve au mauvais endroit dans la copie de l'hôte.

struct {
    float a;
    float b;
    float *p;
    float *q;
} mailbox;
// sizeof(mailbox) is 4*4=16 on the embedded, but 2*4+2*8=24 on the host

Heureusement, j'ai trouvé aquí que gcc dispose d'une option -mx32 pour générer des pointeurs 32 bits sur les machines x86_64. Mais en essayant de l'utiliser, j'obtiens une erreur disant :

$ gcc -mx32 test.c -o test.e
cc1: error: unrecognized command line option "-mx32"

Ceci est valable pour les versions de gcc 4.4.3 y 4.7.0 20120120 (expérimental) .

Pourquoi cette option ne fonctionne-t-elle pas ? Existe-t-il un moyen de contourner ce problème ?

EDIT : Selon le Manuel v4.4.7 il n'y avait pas d'option -mx32 disponible, et ceci est vrai jusqu'à v4.6.3 . D'AUTRE PART, v4.7.0 montre cette option, il se peut donc que la version Jan-20 que j'utilise ne soit pas la version finale !

6voto

Andy Ross Points 7024

Ne faites pas cela. Tout d'abord, x32 est une architecture distincte. Il ne s'agit pas d'un simple changement de compilateur. Vous avez besoin d'une version x32 de chaque bibliothèque que vous liez pour que cela fonctionne. Les distros Linux ne produisent pas encore de versions x32, ce qui signifie que vous devrez soit faire des liens statiques, soit créer votre propre environnement de bibliothèques.

Plus généralement, c'est s'exposer à des problèmes. Si votre structure contient des pointeurs, ils doivent être des pointeurs. Si elle contient des "adresses 32 bits", elles doivent être de type entier 32 bits.

0voto

rogerdpack Points 12806

Il se peut que vous ayez besoin d'une version plus récente de binutils

Bien que je pense que gcc 4.8 est recommandé

Mais en général, vous avez besoin d'une multilib compilée dans le noyau : https://unix.stackexchange.com/questions/121424/linux-and-x32-abi-how-to-use

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X