7
votes

Portage de l'application Linux 32 bits à 64 bits?

Je suis sur le point de porter une application à très grande échelle à 64 bits, J'ai remarqué dans cela dans le Web quelques articles qui montrent de nombreux pièges de ce portage, Je me demandais s'il y a un outil qui peut aider à porter à 64 bits, ce qui signifie Trouver les endroits dans le code qui doit être changé ... peut-être que le GCC avec des avertissements a permis ... est-ce assez bon? Y a-t-il quelque chose de mieux?

Edit: Les gars Je recherche un outil si cela pourrait être complet au compilateur, Je sais que GCC peut l'asiste, mais je doute que cela trouverait tous les problèmes portables des Nations Unies qui
sera découvert dans le temps d'exécution ... peut-être un outil d'analyse de code statique qui souligne portant jusqu'à 64 bits?

merci


0 commentaires

5 Réponses :


1
votes

Tout d'abord, pourquoi y aurait-il "portant"?

Considérez que la plupart des distributions ont été joliment fournies 32 et 64 bits pour bien sur une décennie . Donc, à moins que vous programmiez de manière vraiment inutile (et que vous devez presque essayer), ça devrait aller.


7 commentaires

Qu'en est-il des erreurs d'exécution? Avez-vous absolument confiance en avertissements du compilateur pour ce problème? j'en doute.


Il est trop facile de tomber dans le piège non portable, même des choses simples comme Sprintf ("% U", taille de quelque chose); Je vous mordra, dans mon expérience, des applications à grande échelle ont souvent été développées au cours de la décennie, avec trop de gens qui jouent, et vous ne saurez jamais ce que vous exploserez lorsque vous compilez / dirigez-le sur autre chose qu'il n'a jamais couru


Ah, programmation de manière vraiment inutile, c'est facile ... Couleur des pointeurs à Int , ayant une propagation entière implicite lors de l'utilisation de VA_ARG FONCTIONS, CASSANTS Changez de sa signature. . ne t'inquiète pas.


Ce que vous dit les gars, soulignez réellement que la compilation de 64 bits n'est tout simplement pas suffisante ....


Pourquoi ne pas vraiment l'essayer?


Bien sûr, je vais également considérer les avertissements des compilateurs, ce que je cherche en cas de recherche s'il y a un outil pouvant pouvoir trouver de ne pas résoudre la recherche d'endroits suspects à fixer.


Salut Dirk, la compilation avec "GCC -M32" devrait entraîner un portage transparent de l'architecture 64 bits?



1
votes

Qu'en est-il de la compilation du projet dans 64 bits OS? Le compilateur GCC ressemble à un tel outil :)


3 commentaires

Savez-vous que toutes les applications ne peuvent-elles pas être portées à 64 bits avec juste re-compilation? Savez-vous qu'il y a des problèmes qui peuvent causer des problèmes dans le temps d'exécution et non dans la compilation ??


D'accord, mais la première étape à faire est encore de compiler ... La plupart des éléments incorrects ne sont pas compilés, comme l'attribution d'un point d'ouverture aux valeurs entières 32 bits, ou de différentes formes Int et Taille_T.


et lancer le niveau d'avertissement: -pedantic -wall -wextra est un bon début. Ça va Aide Vous trouverez des problèmes. Bien sûr, il n'y a aucun outil que je connaisse de cela corrigera vos hypothèses de certains types de données, alignement, assemblage et ce que ce soit. C'est juste pour compliquer.



4
votes

ici est un guide. Un autre

La taille de certains types de données est différente dans un système d'exploitation 32 bits et 64 bits. Vérifiez donc le lieu où le code suppose la taille des types de données. Par exemple, si vous publiez un pointeur sur un INT, cela ne fonctionnera pas dans 64 bits. Cela devrait résoudre la plupart des problèmes.

Si votre application utilise des bibliothèques tiers, assurez-vous que cela fonctionne également en 64 bits.


2 commentaires

Je connais bien ces guides, mais la question est de savoir s'il y a un outil qui peut sauver des heures de travail humaines et qu'il suffit de suffire? Au lieu de chercher des milliers de lieux suspects en code ....


Bonjour, j'ai un problème similaire de portage 32 Code à une architecture 64 bits. Si je compile avec "GCC -M32", le portant à 64 bits devrait-il être transparent?



4
votes

Un bon outil est appelé grep code> ;-) DO

grep -nH -e '\<int\>\|\<short\>\|\<long\>' *
  • Les indices de tableau doivent être Taille_T CODE> LI>
  • Pointeur CastS doit être uintptr_t code> li>
  • Les différences de pointeur doivent être PRTDIFF_T CODE> LI>
  • types avec une hypothèse de largeur n devrait être uintn_t code> li> ul>

    et ainsi de suite, je l'ai probablement oublié. puis em> GCC code> avec tous les avertissements sur vous le dire. Vous pouvez également utiliser clang code> en tant que compilateur qu'il donne encore plus de diagnostics. P> p>


6 commentaires

C'est peut-être bon, mais je ne suis pas sûr qu'il couvre tous les pièges .... Je cherche un outil qui couvre tous les pièges afin de réduire les erreurs de temps d'exécution ...


@_AVISHAY_: Bien sûr, il y en a d'autres, mais je pense vraiment que ce sont les principaux, des promotions entières implicites généralement sont le reste. Assurez-vous également que si le code est mal écrit, cela vous donnera des tonnes de résultats, mais chacun pointant vers un point de problème potentiel. Vous ne seriez pas en sécurité si vous ne les résolviez pas dans n'importe quel cas. Et certainement sûr que cela sera difficile à deviner parfois, car il suffit d'utiliser juste int par exemple, il suffit de simplement manquer de balises sémantiques tout outil automatique aurait besoin ... Personnellement, je ne crois pas à l'existence d'outils qui transformer le mauvais code en bon.


Je ne cherche pas à la recherche d'un outil de la transférer du code non conportable au code portable, c'est assez difficile pour un outil automatique, mais il semble qu'il semble plus facile d'obtenir un outil de recherche d'endroits inhérents au code que Compiler Wanning ne trouvera pas .. ..


@_AVISHAY_: Je ne suis pas d'accord. Demander à Port de 32 bits à 64 bits, est à peu près respectueux de la même manière que de demander de transférer un code sans emploi à Portable. Le grep que j'ai donné vous donne beaucoup de difficultés pour cela. Pour les autres, par exemple des moulages explicites ou des promotions entière, elles font partie de la langue et aucun outil ne sera en mesure de savoir s'il est intentionnel ou non.


Bonjour, j'ai un problème similaire de portage 32 Code à une architecture 64 bits. Si je compile avec "GCC -M32", le portant à 64 bits devrait-il être transparent?


@RANSH, s'il vous plaît ne postez pas de commentaires sur une question de 5 ans. Si vous avez une vraie question pour alors demandez-la de la manière habituelle.



0
votes

Voici un lien vers une page Web Oracle qui parle de problèmes couramment rencontrés portant une application 32 bits à 64 bits:

http://www.oracle.com/techNetwork /Server-storage/solaris/ilp32tolp64issues-137107.html

Une section parle comment utiliser la peluche pour détecter certaines erreurs courantes. Voici une copie de cette section:

Utilisez l'utilitaire de peluche pour détecter les problèmes avec des types de 64 bits longs et de pointeur Utilisez la peluche pour vérifier le code écrit pour l'environnement de compilation 32 bits et 64 bits. Spécifiez l'option -errchk = longptr64 pour générer des avertissements LP64. Utilisez également le drapeau -errchk = longptr64 qui vérifie la portabilité à un environnement pour lequel la taille des entiers et des pointeurs longs est de 64 bits et la taille des entiers simples est de 32 bits. Le -errchk = longptr64 Les affectations d'expressions d'expressions de pointeur et d'expressions entier longes à des entiers simples, même lorsque des moulages explicites sont utilisés.

Utilisez l'option -errchk = longptr64, signex pour rechercher le code dans lequel les règles normales de conservation de la valeur ISO C autorisent l'extension du signe d'une valeur intégrale signée dans une expression de l'intégration non signée. taper. Utilisez l'option -m64 de la peluche lorsque vous souhaitez vérifier le code que vous souhaitez exécuter dans l'environnement SPARC ou X86 64 bits Solaris 64 bits.

Lorsque la peluche génère des avertissements, il imprime le numéro de ligne du code incriminé, un message qui décrit le problème et si un pointeur est impliqué ou non. Le message d'avertissement indique également les tailles des types de données concernés. Lorsque vous connaissez un pointeur est impliqué et que vous connaissez la taille des types de données, vous pouvez trouver des problèmes spécifiques à 64 bits et éviter les problèmes préexistants entre des types 32 bits et plus petits.

Vous pouvez supprimer l'avertissement d'une ligne de code donnée en plaçant un commentaire du formulaire "Remarque (corrompu ())" sur la ligne précédente. Ceci est utile lorsque vous voulez que la peluche ignore certaines lignes de code tels que des moulages et des missions. Exercez des soins extrêmes lorsque vous utilisez le commentaire "Note (peluchée ())" car il peut masquer de vrais problèmes. Lorsque vous utilisez NOTE, incluez également #include. Reportez-vous à la page Homme de Lint pour plus d'informations.


0 commentaires