Conversión de una aplicación de 32 bits en una aplicación de 64 bits en C

StackOverflow https://stackoverflow.com/questions/411798

  •  03-07-2019
  •  | 
  •  

Pregunta

Actualmente estoy trabajando para convertir una aplicación de 32 bits en una aplicación de 64 bits en C.Esta aplicación actualmente funciona en arquitectura x86 (Windows, osx, Unix, Linux).Entonces, antes de comenzar a codificar, quería saber qué debo considerar al convertir la aplicación.

¿Fue útil?

Solución

  1. Descubra quién lo escribió.¿Son idiotas?Son ellos ¿de hace unos años?¿Puedes hacerles preguntas?¿Están familiarizados con la existencia de múltiples plataformas y sistemas?Conocimiento la mentalidad del autor(es) del programa le ayudará a comprender los problemas cuando los encuentre.
  2. Obtenga una máquina/entorno de compilación de 64 bits en funcionamiento.
  3. Reemplace long con int.Sé perfectamente consciente de que LONG no es long.
  4. Reemplazar (int)&x moldes y escribir con intptr_t y (unsigned int)&x con uintptr_t
  5. Audite todo lo que dependa de estructuras de fundición para char* hacer aritmética de punteros con él.
  6. Búsqueda de expresiones regulares para \<4\> en caso de que haya asumido 4 = sizeof(void*)
  7. Ser paciente.Cuando encuentre un problema, busque en otra parte si existe el mismo problema y envuelva la solución en una macro.
  8. Intenta no usar #ifdef RUN64 o algo similar.Te arrepentirás si las plataformas de 128 bits alguna vez se ponen de moda.
  9. Encapsule todos sus cambios en términos de algunas macros centralizadas que ocultarán las diferencias de portabilidad en otras partes de su programa.
  10. Utilice un probador de cobertura para asegurarse de haber cubierto todo (si corresponde)

EDITAR agregado uintptr_t nota como lo sugiere el comentario.

Otros consejos

Un problema potencial que aún no se ha mencionado es que si su aplicación lee o escribe datos binarios desde el disco (por ejemplo, lee una matriz de estructuras usando fread), tendrás que comprobarlo con mucho cuidado y quizás acabes teniendo dos lectores:uno para archivos heredados y otro para archivos de 64 bits.O, si tiene cuidado de utilizar tipos como uint32_t y así sucesivamente desde el <stdint.h> archivo de encabezado, puede redefinir sus estructuras para que sean compatibles bit a bit.En todo caso, E/S binaria es algo a tener en cuenta.

Esto realmente depende de la aplicación y de cómo se ha codificado. Algunos códigos se pueden volver a compilar con un compilador de 64 bits y simplemente funcionará, pero generalmente esto solo sucede si el código se ha diseñado teniendo en cuenta la portabilidad.

Si el código tiene muchas suposiciones sobre el tamaño de los tipos y punteros nativos, si tiene muchos trucos de empaquetado de bits o habla de un proceso externo utilizando un protocolo especificado por bytes pero utilizando algunas suposiciones sobre el tamaño de los tipos nativos pueden requerir algo o mucho trabajo para obtener una compilación limpia.

Casi todas las advertencias de lanzamiento y compilación son una bandera roja que debe verificarse. Si el código no era & Quot; advertencia de limpieza & Quot; para empezar, eso también es una señal de que puede requerirse mucho trabajo.

Si utilizó los tipos correctos para sus valores, por ejemplo. size_t, ptrdiff_t, uintptr_t, los tipos int de tamaño fijo de stdint.h donde corresponda, y no codificaron los tamaños de los valores, su código debería funcionar de inmediato.

El principal problema que enfrenta al cambiar a 64 bits es que el tamaño de los punteros es diferente (64 bits en lugar de 32 - duh) El tamaño de los enteros y el tamaño de los largos también pueden diferir, dependiendo de la plataforma.

¿Por qué es esto un problema? Bueno, no lo es, a menos que su código asuma que sizeof (int) == sizeof (void *). Esto podría provocar errores punteros desagradables.

Bueno, fundamentalmente, el número de cambios es bastante pequeño, pero seguirá siendo una tarea importante si la aplicación no está escrita cuidadosamente para ser algo portátil, para empezar.

La principal diferencia es que los punteros tienen 64 bits de ancho, pero la mayoría de los otros tipos de datos no cambian. Un int todavía es de 32 bits, y un largo probablemente también sea de 32 bits. Entonces, si su código se convierte entre ints y punteros, eso se romperá. Del mismo modo, cualquier estructura o similar que depende de un desplazamiento específico de un miembro puede romperse porque otros miembros ahora pueden ser más grandes y, por lo tanto, cambiar el desplazamiento.

Por supuesto, su código nunca debe confiar en estos trucos en primer lugar, por lo que en un mundo ideal, esto no sería un problema en absoluto, y simplemente podría recompilar y todo funcionaría. Pero probablemente no vivas en un mundo ideal ...;)

Las dos principales diferencias entre la programación de 32 bits y 64 bits en C son sizeof (void *) y sizeof (long). El principal problema que tendrá es que la mayoría de los sistemas Unix usan el estándar I32LP64 que define un largo de 64 bits y Win64 usa el estándar IL32LLP64 que define un largo de 32 bits. Si necesita admitir la compilación multiplataforma, puede usar un conjunto de definiciones de tipo basadas en arquitectura para enteros de 32 y 64 bits para garantizar que todo el código se comportará de manera coherente. Esto se proporciona como parte de stdint.h como parte del estándar C99. Si no está utilizando un compilador C99, es posible que necesite rodar su propio equivalente

Como se señaló en otra parte, las principales preocupaciones para la conversión serán el código que asume sizeof (int) == sizeof (long) == sizeof (void *), código para admitir datos que se han escrito en el disco y código para IPC multiplataforma .

Para una buena revisión de la historia detrás de esto, eche un vistazo a este artículo de ACM Queue.

Ya hay muchas buenas respuestas.

Considere usar Gimpel Lint . Puede señalar exactamente los tipos de construcciones que son problemáticas. Si su experiencia es como la mía, también le mostrará muchos errores en el sistema no relacionados con el puerto de 32/64 bits.

Todo sobre 64 bits para desarrolladores:

Artículos sobre Desarrollo de 64 bits

Colección de enlaces Recursos de 64 bits

Herramienta Viva64

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top