Compiladores Intel. ¿Por qué se necesitaban nuevos compiladores?

Compiladores Intel C++ y Fortran y biblioteca MKL

Junto con los compiladores GNU estándar para Linux, los compiladores Intel C++ y Fortran están instalados en los clústeres del complejo informático NIVC. Actualmente (principios de 2006), los compiladores versión 9.1 están instalados en todos los clústeres. Esta página está dedicada a describir las opciones y configuraciones más importantes de estos compiladores, así como sus principales diferencias con los compiladores GNU. La página está dirigida principalmente a los usuarios de los clústeres del Centro de Computación de Investigación de MSU, pero también puede ser útil para otros usuarios de habla rusa. Aquí no se abordan cuestiones relacionadas con la compilación para la plataforma IA-64.

Además, la biblioteca Intel está instalada en todos los clústeres. Biblioteca de matemáticas del núcleo(MKL) versión 8.0.2. La biblioteca está ubicada en el directorio /usr/mkl. Tenga en cuenta que los subdirectorios 32, 64 y em64t están disponibles en el directorio lib. En el clúster Ant, debe utilizar las bibliotecas del subdirectorio em64t, y en otros clústeres, del subdirectorio 32. Toda la documentación y los ejemplos necesarios se pueden obtener en el directorio /usr/mkl/doc.

¿Por qué se necesitaban nuevos compiladores?

La necesidad de nuevos compiladores surgió principalmente para a) soportar la programación en Fortran 90, y también b) para una optimización más potente de los programas de Fortran que la proporcionada por el compilador g77, que utiliza traducción a C y luego compilación usando gcc.

Los compiladores PGI (Portland Group) también cumplen estos requisitos, pero la empresa desarrolladora se negó a suministrarlos a Rusia.

¿Cómo utilizar?

Los compiladores Intel se invocan mediante comandos CPI(C o C++), icpc(C++) y fuerte(Fortran 77/90). Los comandos mpicc, mpiCC y mpif77 para compilar y ensamblar programas MPI también están configurados para utilizar compiladores Intel.

También es posible utilizar compiladores GNU usando los comandos mpigcc, mpig++ y mpig77 (Fortran 90 no es compatible).

Archivos de entrada

Por defecto, los archivos con la extensión .cpp Y .cxx Se consideran textos fuente en lenguaje C++ los archivos con la extensión .C- Código fuente C, y el compilador icpc también compila archivos .c como código fuente C++.

Archivos con extensiones .F, .ftn Y .para son reconocidos como textos fuente en el idioma Fotran, con una forma fija de notación, y los archivos .fpp Y .F Además, pasó por el preprocesador del lenguaje Fortran. Archivos con la extensión .f90 se consideran textos fuente Fortran 90/95 con notación de forma libre. Puede especificar explícitamente una forma de notación fija o libre para los programas Fortran usando las opciones -FI Y -FR respectivamente.

Archivos con la extensión .s reconocido como código de lenguaje ensamblador para el IA-32.

Características del compilador Intel

Aquí presentamos las características de los compiladores Intel tal como lo indica el desarrollador en el manual del usuario con algunos de nuestros comentarios.

  • Optimización significativa
    Aparentemente, esto significa optimizar el código a un alto nivel, es decir. En primer lugar, varias transformaciones de bucle, que casi todos los compiladores realizan con mayor o menor éxito.
  • Optimización de punto flotante
    Al parecer, esto significa, en primer lugar, el máximo uso de comandos implementados a nivel de hardware.
  • Optimizaciones interprocedimientos
    aquellos. Optimización global de todo el programa, a diferencia de la optimización ordinaria, que afecta solo al código de funciones específicas.
  • Optimización basada en perfiles
    aquellos. la capacidad de ejecutar un programa en modo de prueba, recopilar datos sobre el tiempo que lleva pasar ciertos fragmentos de código dentro de funciones utilizadas con frecuencia y luego usar estos datos para la optimización.
  • Soporte para el conjunto de instrucciones SSE en procesadores Pentium III
    nota: para tareas informáticas, los comandos SSE2 son más interesantes, es decir. Comandos vectoriales sobre números reales de 64 bits, pero sólo son compatibles con procesadores Pentium 4, que aún no tenemos a nuestra disposición.
  • Vectorización automática
    aquellos. nuevamente, usando los comandos SSE y SSE2, insertados automáticamente por el compilador
  • Soporte OpenMP para programación en sistemas SMP
    nota: en un clúster se recomienda utilizar principalmente la interfaz MPI; no se espera un uso generalizado de OpenMP en el clúster y tales experimentos aún no se han llevado a cabo; pero probablemente tenga sentido utilizar bibliotecas (BLAS, etc.) que estén paralelizadas para la memoria compartida.
  • Captura previa de datos
    aquellos. Aparentemente, el uso de comandos de precarga desde la memoria al caché de datos, que serán necesarios después de algún tiempo.
  • Código de "despacho" para diferentes procesadores
    aquellos. la capacidad de generar código para diferentes procesadores en un único archivo ejecutable, lo que le permite aprovechar los últimos procesadores lograr el máximo rendimiento en ellos, manteniendo la compatibilidad binaria de programas con procesadores anteriores; En nuestro cluster esto no es relevante todavía, porque sólo se utilizan procesadores Pentium III y se supone que los programas compilados en el clúster no deben transferirse ni ejecutarse en otras máquinas

Opciones básicas del compilador

Las más interesantes, por supuesto, son las opciones de optimización del código. La mayoría de las opciones son comunes a los compiladores de C++ y Fortran. Más Descripción detallada opciones en los manuales de usuario en inglés.

Niveles de optimización
OpciónDescripción
-O0Desactiva la optimización
-O1 o -O2Optimización básica para la velocidad. La inserción en línea de funciones de biblioteca está deshabilitada. Para el compilador C++, estas opciones proporcionan la misma optimización; para el compilador Fortran, la opción -O2 es preferible, porque También incluye promoción ciclo.
-O3Optimizaciones más potentes que incluyen transformaciones de bucle, captación previa de datos y uso de OpenMP. Es posible que algunos programas no garanticen un rendimiento mejorado en comparación con -O2. Tiene sentido usarlo junto con las opciones de vectorización. -xK Y -xW.
-desenrollar[n]Permite desenrollar el bucle hasta n veces.
Optimizaciones para un procesador específico.
OpciónDescripción
-tpp6Optimización para procesadores Penitum Pro, Pentium II y Pentium III
-tpp7Optimización para procesadores Penitum 4 (esta opción está habilitada de forma predeterminada para el compilador IA-32)
-xMGeneración de código utilizando extensiones MMX específicas para procesadores Pentium MMX, Pentium II y posteriores.
-xKGeneración de código utilizando extensiones SSE específicas para procesadores Pentium III
-xWGeneración de código utilizando extensiones SSE2 específicas para procesadores Pentium 4
Optimización interprocedimiento
-ipLa optimización entre procedimientos está habilitada dentro de un archivo. Si especifica la opción -ip_no_inlining, las inserciones de funciones en línea están deshabilitadas.
-ipóPermite la optimización interprocedimiento entre diferentes archivos.
Optimizaciones mediante perfiles.
-prof_genSe genera un código de "perfilado" que se utilizará para la elaboración de perfiles, es decir, recopilar datos sobre la frecuencia de paso por ciertos lugares en el programa
-profusoLa optimización se lleva a cabo en base a los datos obtenidos durante la etapa de elaboración de perfiles. Tiene sentido usarlo junto con la opción de optimización interprocedural. -ipó.
Paralelización para sistemas SMP
-openmpHabilita el soporte para el estándar OpenMP 2.0.
-paraleloLa paralelización automática del bucle está habilitada.

Actuación

Según los resultados de la ejecución de las pruebas SPEC CPU2000, publicados en el servidor ixbt.com, los compiladores Intel versión 6.0 fueron casi universalmente mejores en comparación con los compiladores gcc versiones 2.95.3, 2.96 y 3.1, y PGI versión 4.0.2. Estas pruebas se realizaron en 2002 en una computadora con un procesador Pentium 4/1,7 GHz y RedHat Linux 7.3.

Según las pruebas realizadas por Polyhedron, el compilador Intel Fortran versión 7.0 fue casi universalmente superior a otros compiladores Fortran 77 para Linux (Absoft, GNU, Lahey, NAG, NAS, PGI). Sólo en algunas pruebas el compilador Intel es ligeramente inferior a los compiladores Absoft, NAG y Lahey. Estas pruebas se realizaron en una computadora con un procesador Pentium 4/1,8 GHz y Mandrake Linux 8.1.

Los compiladores Intel versión 9.1 también superan a los compiladores gcc y muestran un rendimiento comparable al de Absoft, PathScale y PGI.

Estaremos agradecidos a aquellos usuarios y lectores que nos envíen datos sobre el impacto de la elección del compilador (GCC o Intel) y las opciones de optimización en la velocidad de trabajo en sus problemas de la vida real.

Bibliotecas

El compilador del lenguaje C utiliza una biblioteca de tiempo de ejecución desarrollada dentro del proyecto GNU ( libc.a).

Las siguientes bibliotecas se suministran con el compilador Intel C++:

  • libcprts.a- Biblioteca de lenguaje C++ en tiempo de ejecución desarrollada por Dinkumware.
  • libcxa.a- Biblioteca de tiempo de ejecución adicional para el desarrollo de C++ por parte de Intel.
  • libimf.a- una biblioteca de funciones matemáticas desarrollada por Intel, que incluye implementaciones optimizadas y de alta precisión de funciones trigonométricas, hiperbólicas, exponenciales, especiales, complejas y otras (para más detalles, consulte la lista de funciones).
  • libirc.a- soporte de tiempo de ejecución para creación de perfiles (PGO) y envío de código según el procesador (ver arriba).
  • libguide.a- Implementación de OpenMP.

Esta lista contiene bibliotecas estáticas, pero para la mayoría de ellas también hay bibliotecas dinámicas, es decir. opciones conectadas durante el inicio ( .entonces).

Las siguientes bibliotecas se suministran con el compilador Fortran: libCEPCF90.a, libIEPCF90.a, libintrins.a, libF90.a, también se utiliza la biblioteca de funciones matemáticas libimf.a.

Construyendo el archivo ejecutable

Las bibliotecas se pueden conectar estáticamente (durante la compilación) o dinámicamente (durante el inicio del programa). El enfoque dinámico le permite reducir el tamaño del archivo ejecutable y le permite compartir la misma copia de la biblioteca en la memoria, pero para ello necesita instalar un conjunto completo de bibliotecas dinámicas utilizadas en cada nodo donde se ejecutarán los programas. .

Por lo tanto, si instaló el compilador Intel en su máquina Linux y desea ejecutar los archivos ejecutables compilados en otras máquinas, entonces necesitará usar una compilación estática (que es más fácil) o copiar las bibliotecas dinámicas de Intel a estas máquinas (generalmente desde un directorio como /opt/intel /compiler70/ia32/lib) a uno de los directorios enumerados en el archivo /etc/ld.so.conf, y también asegúrese de que el mismo conjunto de bibliotecas dinámicas GNU/Linux esté instalado en estos máquinas.

De forma predeterminada, todas las bibliotecas de desarrollo de Intel (excepto libcxa.so) están vinculadas estáticamente y todas las bibliotecas del sistema Linux y las bibliotecas GNU están vinculadas dinámicamente. Usando la opción -estático puede forzar al recopilador (editor de enlaces) a conectar todas las bibliotecas estáticamente (lo que aumentará el volumen Archivo ejecutable), y usando la opción -i_dinamico Puede vincular dinámicamente todas las bibliotecas de desarrollo de Intel.

Al conectar bibliotecas adicionales usando la opción de vista -biblioteca es posible que necesites usar la opción -Ldirectorio para especificar la ruta donde se encuentran las bibliotecas.

Usando opciones -Bestático Y -Bdinámico Puede especificar explícitamente la conexión dinámica o estática de cada una de las bibliotecas especificadas en línea de comando.

Usando la opción -C El ensamblaje del archivo ejecutable está deshabilitado y solo se realiza la compilación (generación del módulo de objeto).

Compartir módulos en Fortran y C

Para compartir módulos escritos en Fortran y C, debe acordar la denominación de los procedimientos en los módulos de objetos, el paso de parámetros y el acceso a las variables globales, si las hubiera.

De forma predeterminada, el compilador Intel Fortran convierte los nombres de los procedimientos a minúsculas y agrega un guión bajo al final del nombre. El compilador de C nunca cambia los nombres de las funciones. Así, si queremos llamar a una función o procedimiento FNNAME implementado en C desde un módulo Fortran, entonces en el módulo C debería llamarse fnname_.

El compilador Fortran admite la opción -nus [nombre de archivo], que le permite deshabilitar la adición de guiones bajos a los nombres de los procedimientos internos. Si se especifica un nombre de archivo, esto se hace solo para los nombres de procedimientos enumerados en el archivo especificado.

De forma predeterminada, en Fortran los parámetros se pasan por referencia y en C siempre se pasan por valor. Por lo tanto, al llamar a un procedimiento Fortran desde un módulo C, debemos pasar punteros a las variables correspondientes que contienen los valores de los parámetros reales como parámetros. Al escribir una función en C que deberá llamarse desde un módulo de Fortran, debemos describir los parámetros formales como punteros a los tipos correspondientes.

En los módulos C, es posible utilizar bloques COMUNES definidos dentro de los módulos Fortran (para obtener más información, consulte la Guía del usuario del compilador Intel Fortran, capítulo Mezcla de C y Fortran).

Compartir compiladores Intel y GCC

Los módulos de objetos C producidos por el compilador Intel C++ son compatibles con los módulos producidos por el compilador GCC y la biblioteca GNU C. Así, estos módulos se pueden utilizar juntos en un único programa compilado mediante los comandos icc o gcc, pero se recomienda utilizar icc para incluir correctamente las bibliotecas Intel.

El compilador Intel admite una serie de extensiones de lenguaje C no estándar utilizadas por el proyecto GNU y respaldadas por el compilador GCC (pero no todas; consulte aquí para obtener más detalles).

El manual del usuario no dice nada sobre la compatibilidad de los módulos de objetos en los lenguajes C++ y Fortran; aparentemente, no es compatible.

Soporte de estándares

Intel C++ Compiler 7.0 para Linux admite el estándar de lenguaje ANSI/ISO C (ISO/IEC 9899/1990). Es posible establecer una compatibilidad estricta con el estándar ANSI C ( -ansi) o dialecto ANSI C extendido ( -Xa). Al usar la opción -c99

  • Manuales del compilador en formato HTML (disponibles "en línea" en nuestro servidor, pero requieren soporte para el lenguaje Java)
    • Guía del usuario del compilador Intel C++.
    • Guía del usuario del compilador Intel Fortran.
  • Manuales compiladores para idioma en Inglés en formato PDF (requiere Acrobat Reader, necesita descargar archivos PDF a su computadora)
    • Guía del usuario del compilador Intel C++: Guía del usuario del compilador Intel C++ (1,3 MB, 395 páginas).
    • Guía del usuario del compilador Intel Fortran: Guía del usuario del compilador Intel Fortran (1,1 MB, 285 páginas).
    • Referencia del programador en Fortran: Referencia del programador Intel Fortran (7 MB, 566 páginas).
    • Referencia a bibliotecas para el lenguaje Fortran: Manual de referencia de bibliotecas Intel Fortran (9,5 MB, 881 páginas).
  • Guía del depurador de aplicaciones Intel.
  • Comparación de compiladores según las pruebas SPEC CPU2000 (artículo en ixbt.com en ruso).
  • El sitio web Polyhedron presenta resultados comparativos entre varios compiladores.
  • En el número anterior de la revista, analizamos los productos de la familia Intel VTune Performance Analyzer: herramientas de análisis de rendimiento que son merecidamente populares entre los desarrolladores de aplicaciones y permiten la detección en el código. aplicaciones de equipo, que desperdician demasiados recursos de CPU, brindando a los desarrolladores la oportunidad de identificar y eliminar posibles lugares estrechos, asociado con secciones de código similares, acelerando así el proceso de desarrollo de la aplicación. Sin embargo, tenga en cuenta que el rendimiento de las aplicaciones depende en gran medida de qué tan eficientes sean los compiladores utilizados en su desarrollo y qué características hardware se utilizan al generar código de máquina.

    Las últimas versiones de los compiladores Intel Intel C++ e Intel Fortran para Windows y Linux le permiten obtener beneficios de rendimiento de aplicaciones para sistemas basados ​​en Procesadores Intel Itanium 2, Intel Xeon y Intel Pentium 4 hasta un 40% en comparación con los compiladores existentes de otros fabricantes debido al uso de características de estos procesadores como la tecnología Hyper-Threading.

    Las diferencias asociadas con la optimización del código por parte de esta familia de compiladores incluyen el uso de una pila para realizar operaciones de punto flotante, optimización entre procedimientos (IPO), optimización de acuerdo con el perfil de la aplicación (Optimización guiada por perfiles (PGO), precarga de datos en el caché ( Captación previa de datos), que evita la latencia asociada con el acceso a la memoria, soporte para las características características de los procesadores Intel (por ejemplo, extensiones para el procesamiento de datos en streaming Intel Streaming SIMD Extensions 2, característica del Intel Pentium 4), paralelización automática de la ejecución de código, aplicación creación, ejecutándose en varios diferentes tipos procesadores al optimizar para uno de ellos, herramientas para "predecir" el código posterior (predicción de rama), soporte ampliado para trabajar con subprocesos de ejecución.

    Tenga en cuenta que los compiladores Intel se utilizan en empresas tan conocidas como Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics e IBM. Según pruebas independientes realizadas por varias empresas, el rendimiento de los compiladores Intel es significativamente mayor que el de los compiladores de otros fabricantes (ver, por ejemplo, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf .pdf).

    A continuación veremos algunas características. Últimas Versiones Compiladores Intel para escritorio y servidor sistemas operativos.

    Compiladores para la plataforma Microsoft Windows

    Compilador Intel C++ 7.1 para Windows

    Intel C++ Compiler 7.1 es un compilador lanzado a principios de este año que proporciona código altamente optimizado para los procesadores Intel Itanium, Intel Itanium 2, Intel Pentium 4 e Intel Xeon, así como para el procesador Intel Pentium M que utiliza la tecnología Intel Centrino y está diseñado para su uso en dispositivos móviles.

    El compilador especificado es totalmente compatible con las herramientas de desarrollo Microsoft Visual C++ 6.0 y Microsoft Visual Studio .NET: se puede integrar en los entornos de desarrollo correspondientes.

    Este compilador es compatible con los estándares ANSI e ISO C/C++.

    Compilador Intel Fortran 7.1 para Windows

    Intel Fortran Compiler 7.1 para Windows, también lanzado a principios de este año, le permite crear código optimizado para los procesadores Intel Itanium, Intel Itanium 2, Intel Pentium 4 e Intel Xeon, Intel Pentium M.

    Este compilador es totalmente compatible con las herramientas de desarrollo Microsoft Visual C++ 6.0 y Microsoft Visual Studio .NET, es decir, se puede integrar en los entornos de desarrollo correspondientes. Además, este compilador le permite desarrollar aplicaciones de 64 bits para sistemas operativos que se ejecutan en procesadores Itanium/Itanium 2 usando Microsoft Visual Studio en un procesador Pentium de 32 bits usando el compilador Intel Fortran de 64 bits. Al depurar código, este compilador le permite utilizar un depurador para plataformas Microsoft.NETO.

    Si tiene instalado el producto Compaq, puede utilizar Visual Fortran 6.6 en lugar del Intel Fortran Compiler 7.1 original, ya que estos compiladores son compatibles a nivel código fuente.

    Intel Fortran Compiler 7.1 para Windows es totalmente compatible con el estándar ISO Fortran 95 y admite la creación y depuración de aplicaciones que contienen código en dos idiomas: C y Fortran.

    Compiladores para la plataforma Linux

    Compilador Intel C++ 7.1 para Linux

    Otro compilador que se lanzó a principios de año, Intel C++ Compiler 7.1 para Linux, le permite lograr un alto grado de optimización de código para los procesadores Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Este compilador es completamente compatible con el compilador GNU C en el código fuente y los módulos de objetos, lo que le permite migrar aplicaciones creadas usando GNU C sin costos adicionales. El compilador Intel C++ admite C++ ABI (una adición al kernel de Linux que le permite ejecutar bajo control de linux código compilado para otras plataformas, como los primeros sistemas operativos SCO, primeras versiones Sun Solaris, etc.), lo que significa compatibilidad total con el compilador gcc 3.2 a nivel de código binario. Finalmente, con Intel C++ Compiler 7.1 para Linux, incluso puede recompilar el kernel de Linux realizando algunos cambios menores en su código fuente.

    Compilador Intel Fortran 7.1 para Linux

    El compilador Intel Fortran 7.1 para Linux le permite crear código optimizado para los procesadores Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Este compilador es totalmente compatible con el compilador Compaq Visual Fortran 6.6 a nivel de código fuente, lo que le permite para recompilar aplicaciones creadas con Compaq Visual Fortran, aumentando así su rendimiento.

    Además, el compilador especificado es compatible con utilidades utilizadas por los desarrolladores como el editor emacs, el depurador gdb y la utilidad de creación de aplicaciones.

    Al igual que la versión para Windows de este compilador, Intel Fortran Compiler 7.1 para Linux es totalmente compatible con el estándar ISO Fortran 95 y admite la creación y depuración de aplicaciones que contienen código en dos lenguajes: C y Fortran.

    Cabe destacar especialmente que los especialistas del Centro de Desarrollo de Software Ruso de Intel en Nizhny Novgorod hicieron una contribución significativa a la creación de los compiladores Intel enumerados. Más información detallada Puede encontrar información sobre los compiladores Intel en el sitio web de Intel en www.intel.com/software/products/.

    La segunda parte de este artículo estará dedicada a los compiladores Intel que crean aplicaciones para dispositivos móviles.

    Ejemplos de trucos reales: Compilador Intel C++ 7.0 - Archivo WASM.RU

    ...el compilador Intel C++ 7.0 se descargó tarde en la noche, alrededor de las cinco de la mañana. Tenía muchas ganas de dormir, pero también me invadía la curiosidad: si se había reforzado la protección o no. Decidiendo que hasta que descubriera la protección no me quedaría dormido, abrí nueva consola, y restablecer las variables del sistema TEMP y TMP al directorio C:\TEMP, escrito apresuradamente de manera indecente nombre largo instalador W_CC_P_7.0.073.exe en la línea de comando (la necesidad de configurar las variables TEMP y TMP se explica por el hecho de que en Windows 2000 apuntan de forma predeterminada a un directorio muy anidado, y el instalador Intel C++, y no solo - no admite caminos de un tamaño tan grande).

    Inmediatamente quedó claro que la política de protección se había revisado radicalmente y ahora la presencia de una licencia se comprobó ya en la etapa de instalación del programa (en la versión 5.x la instalación se realizó sin problemas). Bien, le damos el comando dir y miramos el contenido de lo que ahora tenemos que luchar:

      Contenido de la carpeta C:\TMP\IntelC++Compiler70

      17.03.2003 05:10

      HTML

      17.03.2003 05:11

      x86

      17.03.2003 05:11

      itanio

      17.03.2003 05:11

      notas

      05/06/2002 10:35 45 056 Ejecución automática.exe

      10/07/2001 12:56 27 autorun.inf

      29.10.2002 11:25 2 831 ccompindex.htm

      24/10/2002 08:12 126 976 ChkLic.dll

      18/10/2002 22:37 552 960 chklic.exe

      17/10/2002 16:29 28 663 CLicense.rtf

      17.10.2002 16:35 386 crédito.txt

      16.10.2002 17:02 34 136 Crellnotes.htm

      19/03/2002 14:28 4 635 PLSuite.htm

      21/02/2002 12:39 2 478 registro.htm

      10.02.2002 14:51 40 960 Configuración.exe

      02.10.2002 10:40 151 Configuración.ini

      10/07/2001 12:56 184 configuración.mwg

      19 archivos 2.519.238 bytes

      6 carpetas 886.571.008 bytes libres

    ¡Sí! El programa de instalación setup.exe ocupa sólo cuarenta kilobytes. ¡Muy bien! Es poco probable que pueda ocultar una protección seria en tal volumen, e incluso si es así, no vale la pena analizar este pequeño archivo en su totalidad, hasta el último byte de la lista del desensamblador. Sin embargo, no es un hecho que código de seguridad ubicado exactamente en setup.exe, puede estar ubicado en otro lugar, por ejemplo... ChkLic.dll/ChkLic.exe, que en conjunto ocupan un poco menos de setecientos kilobytes. Espera, ¿qué es ChkLic? ¿Es esta la abreviatura de Verificar licencia o qué? Mmm, los chicos de Intel obviamente tienen serios problemas con el sentido del humor. ¡Honestamente, sería mejor si llamaran a este archivo "Hack Me"! Bien, a juzgar por el volumen, ChkLic es el mismo FLEX lm, y ya lo hemos encontrado (ver "Compilador Intel C++ 5.0") y tenemos una idea aproximada de cómo romperlo.

    Damos el comando “dumpbin /EXPORTS ChkLic.dll” para examinar las funciones exportadas y… agarramos fuerte a Klava para no caernos de la silla:

      Volcado del archivo ChkLic.dll

    1. La sección contiene las siguientes exportaciones para ChkLic.dll

      0 características

      3DB438B4 marca de fecha y hora lunes 21 de octubre 21:26:12 2002

    2. 1 número de funciones

      1 número de nombres

      sugerencia ordinal nombre RVA

      1 0 000010A0 _CheckValidLicense

    ¡Maldita sea! La protección exporta una sola función con el maravilloso nombre CheckValidLicense. “Maravilloso”: porque el propósito de la función queda claro a partir de su nombre y es posible evitar un análisis minucioso del código desensamblador. Bueno, han perdido todo interés... sería mejor si lo exportaran ordinalmente o algo así, o al menos lo bautizaran con algún tipo de nombre intimidante como DES Decrypt.

    ...¡soñador! Bien, volvamos a nuestras ovejas. Pensemos de manera lógica: si todo el código de seguridad se concentra directamente en ChkLic.dll (y, a juzgar por la naturaleza "articulada" de la protección, este es el caso), entonces toda la "protección" se reduce a llamar a CheckValidLicense desde el programa de instalación. exe y comprobar el resultado que devuelve. Por lo tanto, para “hackear” basta con perder ChkLic.dll, obligando a la función ChekValidLicense a regresar siempre... y, por cierto, ¿qué debería devolver? Más precisamente: ¿cuál es exactamente el valor de retorno que corresponde a una verificación de licencia exitosa? No, no se apresure a desmontar setup.exe para determinarlo, porque opciones posibles Ya no tanto: FALSO o VERDADERO. ¿Estás apostando a VERDADERO? Bueno, en cierto sentido esto es lógico, pero por otro lado: ¿por qué decidimos que la función CheckValidLicense devuelva exactamente la bandera del éxito de la operación y no el código de error? Después de todo, esto debe motivar de alguna manera las razones para negarse a instalar el compilador: ¿no se encontró el archivo con la licencia, el archivo está dañado, la licencia ha caducado, etc.? Bien, intentemos devolver cero y, si eso no funciona, devolveremos uno.

    Vale, abróchate el cinturón, ¡vamos! Lanzamos HIEW, abrimos el archivo ChkLic.dll (si no se abre, recuerda las tuzas tres veces, cópialo temporalmente a la raíz o cualquier otro directorio que no contenga caracteres especiales en su nombre que no le gusten a hiew) . Luego, volviendo nuevamente a la tabla de exportación obtenida mediante dumpbin, determinamos la dirección de la función CheckValidLicense (en este caso 010A0h) y mediante “10A0” vamos a su inicio, ahora la cortamos “live”, sobreescribiendo sobre la código antiguo “XOR EAX, EAX/RETN 4". ¿Por qué exactamente "REN 4" y no solo "RET"? Sí, porque la función admite la convención stdcall, que puede descubrir mirando su epílogo en HIEW"e ( simplemente desplácese hacia abajo en la pantalla del desensamblador hasta encontrar RET).

    Comprobemos... ¡¡¡Funciona!!! A pesar de la falta de licencia, el instalador comienza la instalación sin hacer preguntas. Por tanto, la defensa cayó. Oh, no podemos creer que todo sea tan simple y, para no quedarnos sentados estúpidamente mirando el monitor esperando que se complete el proceso de instalación del programa, usamos nuestro desensamblador IDA favorito en setup.exe. Lo primero que llama la atención es la ausencia de CheckValidLicense en la lista de funciones importadas. ¿Quizás de alguna manera inicia el archivo ChkLic.exe? Intentamos encontrar el enlace correspondiente entre las líneas reconocidas automáticamente: “~View aNames”, “ChkLic”... sí, la línea “Chklic.exe” no aparece en absoluto, pero se detecta “Chklic.dll”. Sí, ya veo, eso significa que la biblioteca ChkLic se carga mediante un enlace explícito a través de LoadLibrary. Y siguiendo la referencia cruzada lo confirma:

      Texto: 0040175D empujar desplazamiento aChklic_dll; lpLibNombreArchivo

      Texto: 00401762 llamada ds: LoadLibraryA

      Texto:00401762; cargar ChkLic.dll ^^^^^^^^^^^^^^^^^

      Texto:00401762;

      Texto:00401768 mov esi, eax

      Texto: 0040176 Un desplazamiento de inserción a_checkvalidlic; lpProcNombre

      Texto: 0040176F empujar esi; hMódulo

      Texto:00401770 llamada ds:GetProcAddress

      Texto: 00401770; obtener la dirección de la función CheckValidLicense

      Texto: 00401770;

      Texto:00401776 cmp esi, ebx

      Texto:00401778 jz loc_40192E

      Texto:00401778; Si no existe dicha biblioteca, salga del programa de instalación.

      Texto:00401778;

      Texto:0040177E cmp eax, ebx

      Texto:00401780 jz loc_40192E

      Texto: 00401780; Si no existe tal función en la biblioteca, salga de la instalación.

      Texto: 00401780;

      Texto: 00401786 empujar ebx

      Texto: 00401787 llamar a eax

      Texto:00401787; llamar a la función ChekValidLicense

      Texto:00401787;

      Texto:00401789 prueba eax, eax

      Texto:0040178B jnz loc_4019A3

    Texto:0040178; si la función devolvió un valor distinto de cero, entonces salga del programa de instalación

    ¡Increíblemente, esta defensa terriblemente primitiva está construida exactamente así! Además, ¡el archivo ChkLic.exe de medio metro no es necesario en absoluto! ¿Y por qué valió la pena sacarlo de Internet? Por cierto, si decide guardar la distribución del compilador (atención: ¡no dije "distribuir"!), entonces, para ahorrar espacio en el disco, puede borrar ChkLic.*: ya sea eliminando setup.exe o quitándolo para siempre de accediendo a ellos, o simplemente creando su propio ChkLic.dll, exportando la función stdcall CheckValidLicence de la forma: int CheckValidLicence(int some_flag) ( return 0;)

    Bueno, mientras discutíamos todo esto, el instalador terminó de instalar el compilador y completó su trabajo con éxito. ¿Es interesante saber si el compilador se iniciará o si toda la diversión recién comienza? Bajamos febrilmente por la jerarquía ramificada de subcarpetas, encontramos icl.exe, que, como era de esperar, se encuentra en el directorio bin, hacemos clic y... El compilador, naturalmente, no se inicia, citando el hecho de que "icl: error: "No se pudo retirar la licencia FLEX lm", sin la cual no puede continuar con su trabajo.

    Resulta que Intel utilizó protección multinivel y el primer nivel resultó ser una burda protección contra los tontos. ¡Bien! Aceptamos este desafío y, basándonos en nuestra experiencia previa, buscamos automáticamente el archivo LMGR*.DLL en el directorio del compilador. ¡Inútil! Esta vez no existe tal archivo aquí, pero resulta que icl.exe ha ganado mucho peso, superando la marca de los seiscientos kilobytes... ¡Detente! ¿No vincularon los desarrolladores del compilador esta misma película FLEX con enlaces estáticos? Veamos: en Intel C++ 5.0, la suma de los tamaños de lmgr327.dll e icl.exe era de 598 KB, y ahora solo icl.exe ocupa 684 KB. Teniendo en cuenta el ajuste por “obesidad” senil natural, las cifras concuerdan muy bien. Entonces, después de todo, ¡FLEX lm! ¡Oh, oh! Pero ahora, sin nombres de funciones simbólicos, será mucho más difícil romper la protección... Sin embargo, ¡no entremos en pánico antes de tiempo! ¡Pensemos, simplemente con calma! Es poco probable que el equipo de desarrollo haya reescrito por completo todo el código que interactúa con esta protección de "sobre". Lo más probable es que su “mejora” haya terminado simplemente con un cambio en el tipo de diseño. Y si es así, ¡las posibilidades de piratear el programa siguen siendo grandes!

    Recordando que la última vez que el código de seguridad estuvo en la función principal, determinando su dirección, simplemente establecimos un punto de interrupción y, esperando que aparezca el depurador, rastreamos estúpidamente el código, mirando alternativamente el depurador y luego la salida del programa. ventana: tiene el mensaje ¿Hay un mensaje grosero? Al mismo tiempo, marcamos todas las transiciones condicionales que encontramos en una hoja de papel separada (o la guardamos en nuestra propia memoria, si lo desea), sin olvidar indicar si cada transición condicional se realizó o no... ¡Para! ¡Tú y yo estábamos charlando sobre algo, pero ya apareció un mensaje abusivo! ¡Bueno está bien! Veamos qué transición condicional le correspondía. Nuestros registros muestran que el último salto encontrado fue el salto condicional JNZ, ubicado en la dirección 0401075h y "reaccionando" al resultado devuelto por sub_404C0E:

  • Texto:0040107F loc_40107F: ; CÓDIGO XREF: _main+75^j

    Texto:0040107F mov eax, desplazamiento aFfrps; "FFrps"

    Texto:00401084 mov edx, 21h

    Texto: 00401089 llamada sub_404C0E

    Texto:0040108E prueba eax, eax

    Texto:00401090 jnz corto loc_40109A

    Obviamente, sub_404C0E es el procedimiento de protección que verifica la presencia de la licencia. ¿Cómo engañarla? Bueno, hay muchas opciones... En primer lugar, puede analizar detenida y escrupulosamente el contenido de sub_404C0E para descubrir qué verifica exactamente y cómo lo verifica exactamente. En segundo lugar, simplemente puede reemplazar JNZ short loc_40107F con JZ short loc_40107F o incluso NOP, NOP. En tercer lugar, el comando de verificación del resultado devuelto TEST EAX, EAX se puede convertir en un comando cero: XOR EAX, EAX. En cuarto lugar, puede hacer que sub_404C0E desaparezca para que siempre devuelva cero. No sé ustedes, pero a mí me gustó más el método número tres. Cambiamos dos bytes y lanzamos el compilador. Si no hay otras comprobaciones de su "licencia" en la protección, entonces el programa funcionará y, en consecuencia, viceversa. (Como recordamos, en la quinta versión había dos controles de este tipo). ¡Sorprendentemente, el compilador ya no se queja y funciona! De hecho, como era de esperar, sus desarrolladores no reforzaron la protección en absoluto, sino que, por el contrario, ¡incluso la debilitaron! Chris Kaspersky

  • ¡No eres un esclavo!
    Curso educativo cerrado para niños de la élite: "La verdadera disposición del mundo".
    http://noslave.org

    Material de Wikipedia: la enciclopedia libre

    Compilador Intel C++
    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).
    Tipo
    Autor

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Desarrollador
    Desarrolladores

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Escrito en

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Interfaz

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Sistema operativo
    Idiomas de la interfaz

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Primera edición

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    plataforma hardware
    Ultima versión
    Candidato de lanzamiento

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Versión beta

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    versión alfa

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Versión de prueba

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Formatos de archivo legibles

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Formatos de archivos generados

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Estado

    Error de Lua en el Módulo: Wikidata en la línea 170: intento de indexar el campo "wikibase" (un valor nulo).

    Licencia

    Principales características:

    • Vectorización para SSE, SSE2, SSE3, SSE4

    El compilador admite el estándar OpenMP 3.0 para escribir programas paralelos. También contiene una modificación de OpenMP llamada Cluster OpenMP, con la que puede ejecutar aplicaciones escritas de acuerdo con OpenMP en clústeres utilizando MPI.

    El compilador Intel C++ utiliza la interfaz (la parte del compilador que analiza el programa compilado) de Edison Design Group. Los compiladores SGI MIPSpro, Comeau C++ y Portland Group utilizan la misma interfaz.

    Este compilador se usa ampliamente para compilar pruebas comparativas de CPU SPEC.

    Hay 4 series de productos de Intel que contienen el compilador:

    • Edición profesional del compilador Intel C++
    • Kit de herramientas Intel Cluster (Edición del compilador)

    Las desventajas de la versión Linux del compilador incluyen la incompatibilidad parcial con las extensiones GNU del lenguaje C (compatibles con el compilador GCC), lo que puede causar problemas al compilar algunos programas.

    Opciones experimentales

    Se publicaron las siguientes versiones experimentales del compilador:

    • Edición prototipo del compilador Intel STM del 17 de septiembre de 2007. Soporte de memoria transaccional de software (STM). Lanzado para Linux y Windows, sólo para IA-32 (procesadores x86);
    • Colecciones simultáneas de Intel para C/C++ 0.3 desde septiembre de 2008. Contiene mecanismos que facilitan la escritura de programas C++ paralelos.

    Banderas básicas

    ventanas Linux, MacOSX Descripción
    /Sobredosis -O0 Deshabilitar optimizaciones
    /O1 -O1 Optimizar para minimizar el tamaño del archivo ejecutable
    /O2 -O2 Optimice la velocidad. Algunas optimizaciones incluidas.
    /O3 -O3 Habilite todas las optimizaciones de O2. Realice también optimizaciones intensivas del ciclo.
    /oip -Oip Habilite la optimización interprocedimiento archivo por archivo
    /Oipo -Oipo Habilite la optimización interprocedimiento global
    /QxO -xO Permitir el uso de extensiones SSE3, SSE2 y SSE para procesadores fabricados por cualquier empresa
    /rápido -rápido "Modo rápido". Equivalente a las opciones "/O3 /Qipo /QxHost /no-prec-div" en Windows y "-O3 -ipo -static -xHOST -no-prec-div" en Linux. Tenga en cuenta que el indicador "-xHOST" significa optimización para el procesador en el que se ejecuta el compilador.
    /Qprof-gen -prof_gen Cree una versión instrumentada del programa que ensamblará un perfil de desempeño.
    /Qprof-uso -profuso Utilice la información de perfil de los lanzamientos de programas recopilados con el indicador prof_gen.

    Escriba una reseña sobre el artículo "Compilador Intel C++"

    Notas

    ver también

    Enlaces

    Un extracto que caracteriza el compilador Intel C++

    Y además, volvió a ver al Mago Blanco por última vez... Su marido y amigo más fiel, a quien nunca podría olvidar. En su corazón ella lo perdonó. Pero, para su gran pesar, ella no pudo traerle el perdón de Magdalena... Así que, como ves, Isidora, la gran fábula cristiana sobre el “perdón” es sólo una mentira infantil para los creyentes ingenuos, para permitirles hacer cualquier Mal, sabiendo que no importa lo que hagan, eventualmente serán perdonados. Pero sólo puedes perdonar aquello que es verdaderamente digno de perdón. Una persona debe comprender que tiene que responder por cualquier Mal cometido... Y no ante algún Dios misterioso, sino ante sí mismo, obligándose a sufrir cruelmente. Magdalena no perdonó a Vladyka, aunque lo respetaba profundamente y lo amaba sinceramente. Del mismo modo que no nos perdonó a todos por la terrible muerte de Radomir. Después de todo, ELLA lo entendió mejor que nadie: podríamos haberlo ayudado, podríamos haberlo salvado de una muerte cruel... Pero no quisimos. Considerando que la culpa del Mago Blanco era demasiado cruel, lo dejó vivir con esta culpa, sin olvidarla ni por un minuto... No quería concederle un perdón fácil. Nunca la volvimos a ver. Al igual que nunca vieron a sus bebés. A través de uno de los caballeros de su templo, nuestro hechicero, Magdalena le transmitió a Vladyka la respuesta a su petición de regresar con nosotros: “El sol no sale dos veces en el mismo día... La alegría de tu mundo (Radomir) nunca volveré a ti, así como yo no volveré a ti y yo... encontré mi FE y mi VERDAD, ellas están VIVAS, pero la tuya está MUERTA... Llora a tus hijos, ellos te amaron. Nunca te perdonaré su muerte mientras yo esté vivo. Y que tu culpa permanezca contigo. Quizás algún día ella te traiga Luz y Perdón... Pero no de mí”. La cabeza del Mago Juan no fue traída a Meteora por la misma razón: ninguno de los Caballeros del Templo quería regresar con nosotros... Los perdimos, como hemos perdido a muchos otros más de una vez, que no quisieron regresar. comprender y aceptar a nuestras víctimas... A quienes les agradaste, se fueron, condenándonos.
    ¡Mi cabeza daba vueltas!... Como una persona sedienta, saciando mi eterna hambre de conocimiento, absorbí con avidez el flujo de información asombrosa que generosamente me daba el Norte... ¡Y quería mucho más!... Quería saberlo todo para el fin. ¡Fue un soplo de agua fresca en un desierto abrasado por el dolor y los problemas! Y no podía tener suficiente de ello...
    – ¡Tengo miles de preguntas! Pero ya no queda tiempo... ¿Qué debo hacer, Norte?..
    - ¡Pregunta, Isidora!.. Pregunta, intentaré responderte…
    – Dime, Sever, ¿por qué me parece que esta historia parece combinar dos historias de vida, entrelazadas con hechos similares, y se presentan como la vida de una sola persona? ¿O no tengo razón?
    – Tienes toda la razón, Isidora. Como les dije antes, los "poderes de este mundo", que crearon la historia falsa de la humanidad, "pusieron" sobre la verdadera vida de Cristo la vida extraña del profeta judío Josué, que vivió hace mil quinientos años ( de la época de la historia del Norte). Y no sólo él mismo, sino también su familia, sus allegados y amigos, sus amigos y seguidores. Después de todo, era la esposa del profeta Josué, la judía María, que tenía una hermana Marta y un hermano Lázaro, la hermana de su madre María Yakobe, y otros que nunca estuvieron cerca de Radomir y Magdalena. Así como no había otros “apóstoles” junto a ellos: Pablo, Mateo, Pedro, Lucas y los demás...
    Fue la familia del profeta Josué quien se mudó hace mil quinientos años a Provenza (que en aquellos días se llamaba Galia Transalpina), a la ciudad griega de Massalia (actual Marsella), ya que Massalia en ese momento era la "Puerta de entrada" entre Europa y Asia, y era la forma más fácil para todos los "perseguidos" de evitar persecuciones y problemas.



    
    Arriba