Компілятори Intel Для чого були потрібні нові компілятори

Компілятори Intel C++ та Fortran та бібліотека MKL

Поряд із стандартними для Linux компіляторами GNU, на кластерах обчислювального комплексу НДЦ встановлено компілятори Intel C++ і Fortran. На даний час (початок 2006 року) на всіх кластерах встановлено компілятори версії 9.1. Ця сторінка присвячена опису найбільш важливих опцій та налаштувань цих компіляторів, а також їх основних відмінностей від компіляторів GNU. Сторінка орієнтована, переважно, на користувачів кластерів НИВЦ МГУ, але може бути корисна й іншим російськомовним користувачам. Тут не порушуються питання, пов'язані з компіляцією для платформи IA-64.

Також на всіх кластерах встановлена ​​бібліотека Intel Kernel Math Library(MKL) Версія 8.0.2. Бібліотека знаходиться в каталозі /usr/mkl. Звертаємо увагу на те, що в каталозі lib доступні підкаталоги 32, 64 та em64t. На кластері Ant необхідно використовувати бібліотеки з підкаталогу em64t, а на інших кластерах - з підкаталогу 32. Вся необхідна документація та приклади можуть бути отримані з каталогу /usr/mkl/doc.

Навіщо знадобилися нові компілятори?

Необхідність нових компіляторів виникла, головним чином, а) для підтримки програмування мовою Фортран 90, а також б) для більш потужної оптимізації програм мовою Фортран, ніж забезпечує компілятор g77, що використовує трансляцію в мову Сі і потім компіляцію за допомогою gcc.

Цим вимогам задовольняють компілятори PGI (Portland Group), але компанія-розробник відмовилася постачати їх до Росії.

Як користуватися?

Компілятори Intel викликаються за допомогою команд icc(C або C ++), icpc(C++) та ifort(Фортран 77/90). Команди mpicc, mpiCC і mpif77 для компіляції та складання MPI-програм також налаштовані використання компіляторів Intel.

Зберігається також можливість користуватися компіляторами GNU за допомогою mpigcc, mpig++ і mpig77 (Фортран 90 не підтримується).

Вхідні файли

За промовчанням файли з розширенням .cppі .cxxвважаються вихідними текстами мовою С++, файли з розширенням .c- вихідними текстами мовою Сі, а компілятор icpc також компілює файли.c як вихідні тексти С++.

Файли з розширеннями .f, .ftnі .forрозпізнаються як вихідні тексти мовою Фотран, з фіксованою формою запису, а файли .fppі .Fдодатково пропускаються через препроцесор мови Фортран. Файли із розширенням .f90вважаються вихідними текстами Фортран 90/95 із вільною формою запису. Явним чином можна встановити фіксовану або вільну форму запису Фортран-програм за допомогою опцій -FIі -FRвідповідно.

Файли із розширенням .sрозпізнаються як код мовою асемблера для IA-32.

Характеристики компіляторів Intel

Тут ми наводимо характеристики компіляторів Інтел, як вони заявлені розробником у посібнику користувача з деякими коментарями.

  • Значна оптимізація
    мабуть, тут мають на увазі оптимізація коду ще високому рівні, тобто. насамперед, різні перетворення циклів, що з більшим чи меншим успіхом роблять майже всі компілятори
  • Оптимізація обчислень з плаваючою точкою
    мабуть, мається на увазі насамперед максимальне використання команд, реалізованих на апаратному рівні
  • Міжпроцедурні оптимізації
    тобто. глобальна оптимізація всієї програми, на відміну від звичайної оптимізації, яка стосується лише коду конкретних функцій
  • Оптимізація на базі профілів
    тобто. можливість прогнати програму в тестовому режимі, зібрати дані про час проходження тих чи інших фрагментів коду всередині функцій, що часто використовуються, а потім використовувати ці дані для оптимізації
  • Підтримка системи команд SSE у процесорах Pentium III
    Примітка: для обчислювальних завдань більший інтерес представляють команди SSE2, тобто. векторні команди над 64-розрядними речовими числами, але вони підтримуються тільки в процесорах Pentium 4, яких у нашому розпорядженні поки що немає
  • Автоматична векторизація
    тобто. знову ж таки, використання команд SSE та SSE2, що вставляються автоматично компілятором
  • Підтримка OpenMP для програмування на SMP-системах
    на кластері рекомендується переважно користуватися інтерфейсом MPI; широке використання OpenMP на кластері не передбачається і таких експериментів поки що не проводилося; але, мабуть, має сенс користуватися бібліотеками (BLAS та інших.), розпаралеленими для пам'яті.
  • Передвиборка даних
    тобто. мабуть, використання команд попереднього завантаження з пам'яті в кеш даних, які знадобляться через деякий час
  • "Диспетчеризація" коду для різних процесорів
    тобто. можливість генерації коду для різних процесорів в одному файлі, що дозволяє використовувати переваги нових процесорівдля досягнення на них найбільшої продуктивності, за збереження двійкової сумісності програм з більш ранніми процесорами; на нашому кластері це поки що не актуально, т.к. використовуються тільки процесори Pentium III, а також не передбачається передача та запуск на інших машинах програм, відкомпілюваних на кластері

Основні опції компіляторів

Найцікавішими, звичайно, є опції оптимізації коду. Більшість опцій є загальними для компіляторів С++ та Фортран. Більше докладний описопцій в англомовних посібниках користувача.

Рівні оптимізації
ОпціяОпис
-O0Вимикає оптимізацію
-O1 або -O2Базова оптимізація швидкість роботи. Вимикається інлайн-вставка бібліотечних функцій. Для компілятора С++ ці опції дають однакову оптимізацію, компілятора Фортрана опція -O2 краще, т.к. включає ще розкручування циклів.
-O3Більш сильна оптимізація, включаючи перетворення циклів, передвиборку даних, використання OpenMP. На деяких програмах може не гарантуватись підвищена продуктивність у порівнянні з -O2. Має сенс використовувати разом із опціями векторизації -xKі -xW.
-unroll[n]Включає розкручування циклів до n разів.
Оптимізації під конкретний процесор
ОпціяОпис
-tpp6Оптимізація для процесорів Penitum Pro, Pentium II та Pentium III
-tpp7Оптимізація для процесорів Penitum 4 (ця опція включена за промовчанням для компілятора на IA-32)
-xMГенерація коду з використанням розширень MMX, специфічних для процесорів Pentium MMX, Pentium II та пізніших
-xKГенерація коду з використанням розширень SSE, специфічних для процесорів Pentium III
-xWГенерація коду з використанням розширень SSE2, специфічних для процесорів Pentium 4
Міжпроцедурна оптимізація
-ipВключається міжпроцедурна оптимізація всередині одного файлу. Якщо при цьому вказати опцію -ip_no_inlining, то відключаються інлайн-вставки функцій.
-ipoВключається міжпроцедурна оптимізація між різними файлами
Оптимізації з використанням профілів
-prof_genГенерується "профілювальний" код, який буде використаний для профілювання, тобто. збору даних про частоту проходження тих чи інших місць у програмі
-prof_useЗдійснюється оптимізація на основі даних, отриманих на етапі профілювання. Має сенс використовувати разом із опцією міжпроцедурної оптимізації -ipo.
Розпаралелювання для SMP-систем
-openmpВключається підтримка стандарту OpenMP 2.0
-parallelВключається автоматичне розпаралелювання циклів

Продуктивність

Згідно з результатами прогону тестів SPEC CPU2000, опублікованими на сервері ixbt.com, компілятори Intel версії 6.0 практично скрізь виявилися кращими, ніж компілятори gcc версій 2.95.3, 2.96 і 3.1, і PGI версії 4.0.2. Ці тести проводились у 2002 році на комп'ютері з процесором Pentium 4/1.7 ГГц та ОС RedHat Linux 7.3.

Згідно з результатами тестів, проведених компанією Polyhedron, компілятор Intel Fortran версії 7.0 майже скрізь виявився кращим порівняно з іншими компіляторами Fortran 77 для Linux (Absoft, GNU, Lahey, NAG, NAS, PGI). Лише у деяких тестах компілятор Intel незначно програє компіляторам Absoft, NAG та Lahey. Ці тести були проведені на комп'ютері із процесором Pentium 4/1.8 ГГц та ОС Mandrake Linux 8.1.

Компілятори Intel версії 9.1 також випереджають за продуктивністю компіалтори gcc, і показують продуктивність порівнянну з Absoft, PathScale і PGI.

Ми будемо вдячні тим користувачам та читачам, які надішлють нам дані щодо впливу вибору компілятора (GCC або Intel) та опцій оптимізації на швидкість роботи на їхніх реальних завданнях.

Бібліотеки

Компілятор мови Сі використовує runtime-бібліотеку, розроблену в рамках проекту GNU ( libc.a).

Разом із компілятором Intel C++ поставляються такі бібліотеки:

  • libcprts.a- runtime-бібліотека мови С++ розробки Dinkumware.
  • libcxa.a- Додаткова runtime-бібліотека для С++ розробки Intel.
  • libimf.a- бібліотека математичних функцій розробки Intel, до якої входять оптимізовані та високоточні реалізації тригонометричних, гіперболічних, експоненційних, спеціальних, комплексних та інших функцій (докладніше див. список функцій).
  • libirc.a- runtime-підтримка профілювання (PGO) та "диспетчеризації" коду залежно від процесора (див. вище).
  • libguide.a- Реалізація OpenMP.

У цьому переліку перераховані статичних бібліотек, але більшість їх є також динамічні, тобто. підключаються під час запуску, варіанти ( .so).

Разом із компілятором Фортрана поставляються такі бібліотеки: libCEPCF90.a, libIEPCF90.a, libintrins.a, libF90.aтакож використовується бібліотека математичних функцій libimf.a.

Складання виконуваного файлу

Підключення бібліотек можливе статичне (під час збирання) або динамічне (під час запуску програми). Динамічний підхід дозволяє зменшити розмір файлу, дозволяє розділяти в пам'яті одну і ту ж копію бібліотеки, але для цього необхідно встановити на кожному вузлі, де будуть запускатися програми, повний набір динамічних бібліотек, що використовуються.

Таким чином, якщо Ви встановили компілятор Intel на своїй машині з Linux і хочете запускати зібрані файли, що виконуються на інших машинах, то потрібно або використовувати статичну збірку (що простіше) або скопіювати на ці машини динамічні бібліотеки Intel (звичайно з директорії виду /opt/intel /compiler70/ia32/lib) в одну з директорій, перерахованих у файлі /etc/ld.so.conf, а також подбати про те, щоб на цих машинах було встановлено однаковий набір динамічних бібліотек GNU/Linux.

За замовчуванням всі бібліотеки розробки Intel (крім libcxa.so) підключаються статично, а всі системні бібліотеки Linux та бібліотеки GNU підключаються динамічно. За допомогою опції -staticможна змусити збирач (редактор зв'язків) підключити всі бібліотеки статично (що збільшить обсяг виконуваного файлу), а за допомогою опції -i_dynamicможна динамічно підключати всі бібліотеки розробки Intel.

При підключенні додаткових бібліотек за допомогою опції виду -lБібліотекаможе знадобитися використовувати опцію -Lдиректорія, щоб задати шлях, де розміщуються бібліотеки.

За допомогою опцій -Bstaticі -Bdynamicявно можна задавати динамічне або статичне підключення кожної з бібліотек, заданих у командному рядку.

За допомогою опції -cскладання виконуваного файлу відключається і виконується лише компіляція (генерація об'єктного модуля).

Спільне використання модулів на Фортрані та Сі

Щоб спільно використовувати модулі, написані мовами Фортран і Сі, потрібно узгодити назву процедур в об'єктних модулях, передачу параметрів, а також доступ до глобальних змінних, якщо такі є.

За промовчанням компілятор Intel Fortran переводить імена процедур у нижній регістр і додає в кінець імені знак підкреслення. Компілятор Сі ніколи не змінює імена функцій. Таким чином, якщо ми хочемо з модуля на Фортрані викликати функцію або процедуру FNNAME, реалізовану на Сі, то в модулі на Сі вона має іменуватися fnname_.

Компілятор Фортрана підтримує опцію -nus [ім'я файлу], яка дозволяє відключати додавання символів підкреслення до внутрішніх імен процедур. Якщо задано ім'я файлу, це робиться тільки для імен процедур, перерахованих у заданому файлі.

За умовчанням, на Фортрані параметри передаються за посиланням, а Сі — завжди за значенням. Таким чином, при виклику Фортран-процедури з модуля на Сі ми повинні як параметри передавати покажчики на відповідні змінні, що містять значення фактичних параметрів. При написанні на Сі функції, яку треба буде викликати з модуля на Фортрані, ми повинні описувати формальні параметри як покажчики відповідних типів.

У модулях на Сі можливе використання COMMON-блоків, визначених усередині модулів на Фортрані (докладніше про це див. Intel Fortran Compiler User's Guide, розділ Mixing C and Fortran).

Спільне використання компіляторів Intel та GCC

Об'єктні модулі мовою Сі, отримані компілятором Intel C++, сумісні з модулями, отриманими компілятором GCC та бібліотекою GNU для мови Сі. Таким чином, ці модулі можуть спільно використовуватися в одній програмі, яка збирається за допомогою команд icc або gcc, але для коректного підключення бібліотек Intel рекомендується використовувати icc.

Компілятор Intel підтримує низку нестандартних розширень мови Сі, які використовуються в рамках проекту GNU і підтримуються компілятором GCC (але не всі з них, див. тут).

Про сумісність об'єктних модулів мовами С++ та Фортран у посібнику користувача нічого не сказано, мабуть, вона не підтримується.

Підтримка стандартів

Компілятор Intel C++ Compiler 7.0 for Linux підтримує стандарт мови Сі ANSI/ISO (ISO/IEC 9899/1990). Можливе встановлення суворої сумісності зі стадартом ANSI C ( -ansi) або розширеного діалекту ANSI C ( -Xa). При використанні опції -C99

  • Посібники з компіляторів у форматі HTML (доступні в "онлайн" на нашому сервері, але потрібна підтримка мови Java)
    • Intel C++ Compiler User's Guide.
    • Intel Fortran Compiler User's Guide.
  • Посібники з компіляторів на англійськоюу форматі PDF (потрібна програма Acrobat Reader, потрібно завантажити PDF-файли на свій комп'ютер)
    • Посібник користувача по компілятору Intel C++: Intel C++ Compiler User's Guide (1.3 Мбайт, 395 сторінок).
    • Посібник користувача компілятора Intel Fortran: Intel Fortran Compiler User's Guide (1.1 Мбайт, 285 сторінок).
    • Довідник програміста на мові Fortran: Intel Fortran Programmer's Reference (7 Мбайт, 566 сторінок).
    • Довідник з бібліотек для мови Фортран: Intel Fortran Libraries Reference Manual (9.5 Мбайт, 881 сторінка).
  • Посібник з відладчика Intel Application Debugger.
  • Порівняння компіляторів на тестах SPEC CPU2000 (стаття на сайті ixbt.com російською мовою).
  • На сайті компанії Polyhedron представлені результати порівняння різних компіляторів.
  • Попередній номер журналу ми обговорювали продукти сімейства Intel VTune Performance Analyzer - засобів аналізу продуктивності, які користуються заслуженою популярністю у розробників додатків і дозволяють виявляти в коді додатків команди, на які витрачається занадто багато ресурсів процесора, що дає розробникам можливість виявити та усунути потенційні вузькі місця, пов'язані з подібними ділянками коду, прискоривши цим процес розробки додатків. Зазначимо, однак, що продуктивність додатків багато в чому залежить від того, наскільки ефективні компілятори, що застосовуються при їх розробці, і які особливості апаратного забезпеченнявони використовують при генерації машинного коду.

    Останні версії компіляторів Intel Intel C++ та Intel Fortran для Windows та Linux дозволяють отримати виграш у продуктивності додатків для систем на базі процесорів Intel Itanium 2, Intel Xeon та Intel Pentium 4 до 40% порівняно з існуючими компіляторами від інших виробників за рахунок використання таких особливостей зазначених процесорів, як Hyper-Threading.

    До відмінностей, пов'язаних з оптимізацією коду даним сімейством компіляторів, слід віднести застосування стека для виконання операцій з плаваючою точкою, міжпроцедурну оптимізацію (Interprocedural Optimization, IPO), оптимізацію відповідно до профілю програми (Profile Guided Optimization, PGO), попереднє завантаження даних в ке (Data prefetching), яка дозволяє уникнути затримки, пов'язаної з доступом до пам'яті, підтримку характерних особливостей процесорів Intel (наприклад, розширень для потокової обробки даних Intel Streaming SIMD Extensions 2, характерних для Intel Pentium 4), автоматичне розпаралелювання виконання коду, створення додатків, виконуються на кількох різних типахпроцесорів при оптимізації одного з них, засоби «пророкування» наступного коду (branch prediction), розширену підтримку роботи з потоками виконання.

    Зазначимо, що компілятори Intel застосовуються у таких відомих компаніях, як Alias/Wavefront, Oracle, Fujitsu Siemens, ABAQUS, Silicon Graphics, IBM. За даними незалежного тестування, проведеного рядом компаній, продуктивність компіляторів Intel значно перевищує продуктивність компіляторів інших виробників (див., наприклад, http://intel.com/software/products/compilers/techtopics/compiler_gnu_perf.pdf).

    Нижче ми розглянемо деякі особливості останніх версійкомпіляторів Intel для настільних та серверних операційних систем.

    Компілятори для платформи Microsoft Windows

    Intel C++ Compiler 7.1 для Windows

    Intel C++ Compiler 7.1 – це компілятор, випущений на початку цього року, який дозволяє досягти високого ступеня оптимізації коду для процесорів Intel Itanium, Intel Itanium 2, Intel Pentium 4 та Intel Xeon, а також для процесора Intel Pentium M, що використовує технологію Intel Centrino та призначеного для застосування у мобільних пристроях.

    Зазначений компілятор повністю сумісний із засобами розробки Microsoft Visual C++ 6.0 та Microsoft Visual Studio .NET: він може бути вбудований у відповідні середовища розробки.

    Цей компілятор підтримує стандарти ANSI та ISO C/C++.

    Intel Fortran Compiler 7.1 для Windows

    Компілятор Intel Fortran Compiler 7.1 для Windows, який також випущений на початку поточного року, дозволяє створювати оптимізований код для процесорів Intel Itanium, Intel Itanium 2, Intel Pentium 4 та Intel Xeon, Intel Pentium M.

    Цей компілятор повністю сумісний із засобами розробки Microsoft Visual C++ 6.0 та Microsoft Visual Studio .NET, тобто може бути вбудований у відповідні середовища розробки. Крім того, цей компілятор дозволяє вести розробку 64-розрядних програм для операційних систем, що виконуються на процесорах Itanium/Itanium 2, за допомогою Microsoft Visual Studio на 32-розрядному процесорі Pentium із застосуванням 64-розрядного компілятора Intel Fortran Compiler. При налагодженні коду цей компілятор дозволяє застосовувати налагоджувач для платформи Microsoft.NET.

    За наявності встановленого продукту Compaq Visual Fortran 6.6 можна застосовувати замість вихідного компілятора Intel Fortran Compiler 7.1, оскільки ці компілятори сумісні на рівні вихідного коду.

    Компілятор Intel Fortran Compiler 7.1 для Windows повністю сумісний зі стандартом ISO Fortran 95 і підтримує створення та налагодження програм, що містять код двома мовами С і Fortran.

    Компілятори для платформи Linux

    Intel C++ Compiler 7.1 для Linux

    Ще один компілятор, що побачив світ на початку року, Intel C++ Compiler 7.1 для Linux, дозволяє досягти високого ступеня оптимізації коду для процесорів Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Цей компілятор повністю сумісний з компілятором GNU C на рівні вихідного коду та об'єктних модулів, що без додаткових витрат дозволяє здійснювати міграцію на нього додатків, створених за допомогою GNU C. Компілятор Intel C++ Compiler підтримує C++ ABI (додаток до ядра Linux, що дозволяє виконувати під керуванням Linuxскомпільований код для інших платформ, таких як ранні операційні системи SCO, ранні версії Sun Solaris та ін.), а це означає повну сумісність з компілятором gcc 3.2 лише на рівні двійкового коду. Нарешті, за допомогою компілятора Intel C++ Compiler 7.1 для Linux можна перекомпілювати ядро ​​Linux, зробивши кілька незначних змін у його вихідному коді.

    Intel Fortran Compiler 7.1 для Linux

    Компілятор Intel Fortran Compiler 7.1 для Linux дозволяє створювати оптимізований код для процесорів Intel Itanium, Intel Itanium 2, Intel Pentium 4, Intel Pentium M. Даний компілятор повністю сумісний з компілятором Compaq Visual Fortran 6.6 на рівні вихідного коду, що дозволяє здійснювати за його допомогою перекомпіляцію , створених за допомогою Compaq Visual Fortran, таким чином підвищуючи їх продуктивність.

    Крім того, вказаний компілятор сумісний з такими утилітами, що застосовуються розробниками, як редактор emacs, відладчик gdb, утиліта для складання додатків make.

    Як і Windows-версія цього компілятора, Intel Fortran Compiler 7.1 для Linux повністю сумісний зі стандартом ISO Fortran 95 і підтримує створення та налагодження додатків, що містять код двома мовами С і Fortran.

    Слід особливо наголосити, що істотний внесок у створення перерахованих компіляторів Intel зробили фахівці Російського центру Intel з розробки програмного забезпечення в Нижньому Новгороді. Більше детальну інформаціюпро компілятори Intel можна знайти на веб-сайті корпорації Intel за адресою: www.intel.com/software/products/.

    Друга частина цієї статті буде присвячена компіляторам Intel, які створюють програми для мобільних пристроїв.

    Приклади реальних зламів: Intel C++ 7.0 Compiler - Архів WASM.RU

    …компілятор Intel C++ 7.0 докачався глибокої ночі, години десь о п'ятій ранку. Спати хотілося неймовірно, але й цікавість: чи було посилено захист чи ні, теж роздирало. Вирішивши, що доти не розберуся із захистом я все одно не засну, я, відкривши нову консоль, і перевстановивши системні змінні TEMP та TMP на каталог C:\TEMP, нашвидкуруч набив непристойно довге ім'яінсталятора W_CC_P_7.0.073.exe в командному рядку (необхідність у встановленні змінних TEMP і TMP пояснюється тим, що в Windows 2000 вони за умовчанням вказують на дуже глибоко вкладений каталог, а інсталятор Intel C++ - та й не тільки він - не підтримує шляхів такого величезного розміру).

    Відразу ж з'ясувалося, що політику захисту було кардинально переглянуто і тепер наявність ліцензії перевірялася вже на стадії встановлення програми (у версії 5.x установка здійснювалася без проблем). ОК, даємо команду dir і дивимося на вміст того, з чим нам зараз належить воювати:

      Вміст папки C:\TMP\IntelC++Compiler70

      17.03.2003 05:10

      html

      17.03.2003 05:11

      x86

      17.03.2003 05:11

      Itanium

      17.03.2003 05:11

      notes

      05.06.2002 10:35 45 056 AutoRun.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 credist.txt

      16.10.2002 17:02 34 136 Crelnotes.htm

      19.03.2002 14:28 4 635 PLSuite.htm

      21.02.2002 12:39 2 478 register.htm

      02.10.2002 14:51 40 960 Setup.exe

      02.10.2002 10:40 151 Setup.ini

      10.07.2001 12:56 184 setup.mwg

      19 файлів 2 519 238 байт

      6 папок 886 571 008 байт вільно

    Ага! Програма установки setup.exe займає всього сорок із хвостиком кілобайт. Дуже добре! У такий обсяг серйозний захист навряд чи сховаєш, а якщо навіть так - цей крихітний файл нічого не варто проаналізувати повністю - до останнього байта дизассемблерного лістингу. Втім, не факт, що Захисний кодрозташований саме в setup.exe, він може знаходиться і в іншому місці, ось наприклад ... ChkLic.dll / ChkLic.exe, що займають в сукупності трохи менше ніж сімсот кілобайт. Стривай, який такий ChkLic? Це скорочення від Check License чи що?! Гм, у хлопців з Intel очевидно серйозні проблеми із почуттям гумору. Краще б вони назвали цей файл "Hack Me" слово честі! Гаразд, судячи з обсягу, ChkLic це той самий FLEX lm і є, а з ним ми вже стикалися (див. "Intel C++ 5.0 Compiler") і приблизно уявляємо як його ламати.

    Даємо команду "dumpbin /EXPORTS ChkLic.dll" для дослідження функцій, що експортуються, і... міцно тримаємося за Клаву, щоб не впасти зі стільця:

      Dump of file ChkLic.dll

    1. Section contains the following exports for ChkLic.dll

      0 characteristics

      3DB438B4 time date stamp Mon Oct 21 21:26:12 2002

    2. 1 number of functions

      1 number of names

      ordinal hint RVA name

      1 0 000010A0 _CheckValidLicense

    Чорт забирай! Захист експортує лише одну-єдину функцію із чудовим ім'ям CheckValidLicense. "Чудовим" - тому, що призначення функції стає зрозумілим її назви і з'являється можливість уникнути копіткого аналізу дизассемблерного коду. Ну ось, відбили весь інтерес ... краще б вони її по ординалу експортували чи, або, принаймні, охрестили її якимось відлякуючим ім'ям типу DES Decrypt.

    …розмріялися! Гаразд, повернемося до наших баранів. Давайте міркувати логічно: якщо весь захисний код зосереджений безпосередньо в ChkLic.dll (а, судячи з "навісного" характеру захисту, це дійсно так), то весь "захист" зводиться до виклику CheckValidLicense з Setup.exe та перевірки поверненого нею результату. Тому для "злому" достатньо лише пропасти ChkLic.dll, змушуючи функцію ChekValidLicense завжди повертати… так, до речі, що вона має повертати? Точніше: яке саме значення, що повертається, відповідає успішній перевірці ліцензії? Ні, не поспішайте дизасемблювати setup.exe для визначення, адже можливих варіантівне так і багато: або FALSE, або TRUE. Ви робите ставку на TRUE? Що ж, в якомусь сенсі це логічно, але з іншого боку: а чому ми, власне, вирішили, що функція CheckValidLicense повертає прапор успішності операції, а не код помилки? Адже має вона якось мотивувати причини відмови встановлювати компілятор: файл з ліцензією не знайдено, файл пошкоджений, ліцензія прострочена і так далі? Добре, спробуємо повернути нуль, а якщо це не прокотить, повернемо одиницю.

    ОК, пристібатися, поїхали! Запускаємо HIEW, відкриваємо файл ChkLic.dll. до таблиці експорту, отриманої за допомогою dumpbin, визначаємо адресу функції CheckValidLicense (в даному випадку 010A0h) і через "10A0" переходимо в її початок. Тепер, - ріжемо по "живому", перезаписуючи поверх старого коду "XOR EAX, EAX/RETN 4". Чому саме "REN 4", а не просто "RET"? Та тому, що функція підтримує угоду stdcall, про що можна дізнатися глянувши в HIEW"e на її епілог (просто прогортайте екран дизассемблера вниз до тих пір, поки не зустрінете RET).

    Перевіряємо… Це працює! Незважаючи на відсутність ліцензії, інсталятор, не ставлячи зайвих питань, розпочинає встановлення! Отже, захист упав. Ой, не віриться нам, що все так просто і, щоб не сидіти, тупо дивлячись на монітор в очікуванні завершення процесу інсталяції програми, ми нацьковуємо на setup.exe свій улюблений дизассемблер IDA. Перше, що впадає у вічі, відсутність CheckValidLicense у списку імпортованих функцій. Можливо, вона файл ChkLic.exe якось запускає? Пробуємо знайти відповідне посилання серед автоматично розпізнаних рядків: "~View аNames", "ChkLic"… ага, рядка "Chklic.exe" тут взагалі немає, зате виявляється "Chklic.dll". Ага, зрозуміло, значить, бібліотека ChkLic завантажується явним компонуванням через LoadLibrary. І перехід по перехресному засланню підтверджує це:

      Text:0040175D push offset aChklic_dll; lpLibFileName

      Text:00401762 call ds:LoadLibraryA

      Text:00401762; завантажуємо ChkLic.dll ^^^^^^^^^^^^^^^^^^

      Text:00401762;

      Text:00401768 mov esi, eax

      Text:0040176A push offset a_checkvalidlic; lpProcName

      Text:0040176F push esi; hModule

      Text:00401770 call ds:GetProcAddress

      Text:00401770; отримуємо адресу функції CheckValidLicense

      Text:00401770;

      Text:00401776 cmp esi, ebx

      Text:00401778 jz loc_40192E

      Text:00401778; якщо такої бібліотеки немає, то виходимо із програми встановлення

      Text:00401778;

      Text:0040177E cmp eax, ebx

      Text:00401780 jz loc_40192E

      Text:00401780; якщо такої функції у бібліотеці немає, то виходимо з установки

      Text:00401780;

      Text:00401786 push ebx

      Text:00401787 call eax

      Text:00401787; викликаємо функцію ChekValidLicense

      Text:00401787;

      Text:00401789 test eax, eax

      Text:0040178B jnz loc_4019A3

    Text:0040178; якщо функція повернула не нуль, то виходимо із програми встановлення

    Неймовірно, але цей жах примітивний захист побудований саме так! Причому, півметровий файл ChkLic.exe взагалі не потрібний! І заради чого варто тягнути його з Інтернету? До речі, якщо ви надумаєте зберігати дистриб'ютив компілятора (увага: я не говорив "поширювати"!), то для економії дискового місця ChkLic.* можна стерти: або пропавши setup.exe, назавжди відучивши його до них звертатися, або ж просто створивши свою власну ChkLic.dll, що експортує stdcall функцію CheckValidLicence вигляду: int CheckValidLicence(int some_flag) ( return 0;)

    Так, поки ми все це обговорювали, інсталятор закінчив установку компілятора і успішно завершив свою роботу. Чи цікаво запуститься чи компілятор чи все найцікавіше тільки починається? Гарячково спускаємося вниз по розгалуженій ієрархії вкладених папок, знаходимо icl.exe, який як і слід очікувати, знаходиться в каталозі bin, натискаємо і… без якої він не може продовжити свою роботу.

    Виходить, що Intel застосувала багаторівневий захист і перший рівень виявився грубим захистом від дурнів. Що ж! Ми приймаємо цей виклик і, спираючись на попередній досвід, машинально шукаємо файл LMGR*.DLL в каталозі компілятора. Марно! Цього разу такого файлу тут не виявляється, натомість з'ясовується, що icl.exe сильно додав у вазі, переваливши за позначку шестисот кілобайт… Стоп! А чи не пригнічували розробники компілятора цей самий FLEX lm статичною компоновкою? Дивимося: у Intel C++ 5.0 сума розмірів lmgr327.dll та icl.exe становила 598 Кб, а зараз одні лише icl.exe займає 684 Кб. З урахуванням виправлення на природне старече "ожиріння", цифри дуже добре сходяться. Отже, все-таки FLEX lm! Ой ой! А тепер, - без символічних імен функцій, ламати захист буде набагато важче… Втім, не будемо раніше панікувати! Давайте думати тільки спокійно! Навряд чи команда розробників повністю переписала весь код, що взаємодіє з цим "конвертним" захистом. Швидше за все, її "удосконалення" лише зміною типу компонування і закінчилося. А якщо так, то шанси зламати програму, як і раніше, великі!

    Пам'ятаючи про те, що минулого разу захисний код знаходиться у функції main, ми, визначивши її адресу, просто встановлюємо точку зупинки і, дочекавшись випливання відладчика, тупо трасуємо код, поперемінно поглядаючи то на відладчик, то на вікно виведення програми: чи не з'явилася там лайливе повідомлення? При цьому всі умовні переходи, що зустрілися нам, ми відзначаємо на окремому аркуші паперу (або відкладаємо у своїй власній пам'яті, якщо ви так хочете), не забувши вказати чи виконувався кожен умовний перехід чи ні… Стоп! Щось заговорилися ми з вами, а лайливе повідомлення вже вискочило! ОК добре! Подивимося, який умовний перехід відповідав. Наші записи показують, що останнім переходом, що зустрівся, був умовний перехід JNZ, розташований за адресою 0401075h і "реагує" на результат, повернутою процедурою sub_404C0E:

  • Text:0040107F loc_40107F: ; CODE XREF: _main+75^j

    Text:0040107F mov eax, offset aFfrps; "FFrps"

    Text:00401084 mov edx, 21h

    Text:00401089 call sub_404C0E

    Text:0040108E test eax, eax

    Text:00401090 jnz short loc_40109A

    Очевидно, що sub_404C0E є та сама захисна процедура, яка здійснює перевірку ліцензії на її наявність. Як її обхитрувати? Ну, тут багато варіантів ... По-перше, можна, вдумливо і скрупульозно проаналізувати вміст sub_404C0E на з'ясування: що саме і як саме вона перевіряє. По-друге, можна просто замінити JNZ short loc_40107F на JZ short loc_40107F або навіть NOP, NOP. По-третє, команду перевірки результату повернення TEST EAX, EAX можна перетворити на команду установки нуля: XOR EAX, EAX. По-четверте, можна пропасти саму sub_404C0E, щоб вона завжди повертала нуль. Не знаю, як ви, але мені найбільше сподобався спосіб номер три. Змінюємо два байти і запускаємо компілятор. Якщо жодних інших перевірок його "ліцензійності" у захисті немає, то програма почне працювати і, відповідно, навпаки. (Як ми пам'ятаємо, у п'ятій версії таких перевірок було дві). Вражаюче, але компілятор більше не лається і працює! Справді, як і слід було очікувати, його розробники анітрохи не посилили захист, а навпаки, навіть послабили його! Кріс Касперський

  • Ти – не раб!
    Закритий освітній курс для дітей еліти: "Справжнє облаштування світу".
    http://noslave.org

    Матеріал з Вікіпедії – вільної енциклопедії

    Intel C++ Compiler
    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).
    Тип
    Автор

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Розробник
    Розробники

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Написана на

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Інтерфейс

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Операційна система
    Мови інтерфейсу

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Перший випуск

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Апаратна платформа
    остання версія
    Кандидат у релізи

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Бета-версія

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Альфа-версія

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Тестова версія

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Формати файлів, що читаються

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Формати файлів, що створюються

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Стан

    Помилка Lua в Модуль: Wikidata на рядку 170: attempt to index field "wikibase" (a nil value).

    Ліцензія

    Основні можливості:

    • Векторизація для SSE, SSE2, SSE3, SSE4

    Компілятор підтримує стандарт OpenMP 3.0 для написання паралельних програм. Також містить модифікацію OpenMP під назвою Cluster OpenMP, за допомогою якої можна запускати програми написані відповідно до OpenMP на кластерах, що використовують MPI.

    Intel C++ Compiler використовує фронтенд (частина компілятора, що займається синтаксичним аналізом програми, що компілюється) від Edison Design Group. Цей фронтенд використовується компіляторами SGI MIPSpro, Comeau C++, Portland Group.

    Цей компілятор широко використовується для компіляції бенчмарків SPEC CPU.

    Існує 4 серії продуктів від Intel, що містять компілятор:

    • Intel C++ Compiler Professional Edition
    • Intel Cluster Toolkit (Compiler Edition)

    До недоліків Linux версії компілятора можна віднести часткову несумісність з GNU-розширення мови Сі (підтримувані компілятором GCC), що може викликати проблеми при компіляції деяких програм.

    Експериментальні варіанти

    Публікувалися такі експериментальні варіанти компілятора:

    • Intel STM Compiler Prototype Edition від 17 вересня 2007 року. Підтримка Software Transactional Memory (STM). Випущений для Linux та Windows, тільки для IA-32 (x86-процесорів);
    • Intel Concurrent Collections for C/C++ 0.3 від вересня 2008 року. Містить механізми, що полегшують написання паралельних програм C++.

    Основні прапори

    Windows Linux, MacOSX Опис
    /Od -O0 Вимкнути оптимізації
    /O1 -O1 Оптимізувати для мінімізації розміру виконуваного файлу
    /O2 -O2 Оптимізувати підвищення швидкості. Включено деякі оптимізації
    /O3 -O3 Включити всі оптимізації з O2. Також виконати інтенсивні оптимізації циклів
    /Oip -Oip Включити пофайлову міжпроцедурну оптимізацію
    /Oipo -Oipo Включити глобальну міжпроцедурну оптимізацію
    /QxO -xO Дозволити використання SSE3, SSE2 та SSE розширень для процесорів виробництва будь-яких компаній
    /fast -fast "Швидкий режим". Еквівалентний опціям "/O3 /Qipo /QxHost /no-prec-div" на Windows та "-O3 -ipo -static -xHOST -no-prec-div" на Linux. Зауважте, прапор "-xHOST" означає оптимізацію для того процесора, на якому запущено компілятор.
    /Qprof-gen -prof_gen Створити інструментовану версію програми, яка збере профіль виконання
    /Qprof-use -prof_use Скористайтеся профільною інформацією від запусків програми, зібраної з прапором prof_gen.

    Напишіть відгук про статтю "Intel C++ compiler"

    Примітки

    Див. також

    Посилання

    Уривок, що характеризує Intel C++ compiler

    А ще вона повернулася для того, щоб востаннє побачити Білого Волхва... Свого чоловіка й найвірнішого друга, якого так і не змогла ніколи забути. У своєму серці вона вибачила його. Але, на його великий жаль, не змогла принести йому прощення Магдалини. Так що, як бачиш, Ізидора, велика християнська байка про «всепрощення» це просто дитяча брехня для наївних віруючих, щоб дозволити їм творити будь-яке Зло, знаючи, що чого б вони не зробили, зрештою їх вибачать. Але прощати можна лише те, що по-справжньому гідне прощення. Людина повинна розуміти, що за будь-яке здійснене Зло їй доводиться відповідати... І не перед якимось таємничим Богом, а перед собою, змушуючи себе жорстоко страждати. Магдалина не простила Владико, хоч глибоко поважала та щиро любила його. Так само, як вона не зуміла пробачити і всіх нас за страшну смерть Радомира. Адже саме ВОНА краще за всіх розуміла – ми могли допомогти йому, могли врятувати його від жорстокої смерті... Але не захотіли. Вважаючи провину Білого Волхва надто жорстокою, вона залишила його жити з цією провиною, ні на хвилину не забуваючи її... Вона не захотіла дарувати йому легкого вибачення. Ми так ніколи й не побачили її. Як ніколи не побачили та їхніх малюків. Через одного з лицарів свого Храму – нашого волхва – Магдалина передала відповідь Владиці на його прохання повернутися до нас: «Сонце не сходить одного дня двічі... Радість вашого світу (Радомир) вже ніколи не повернеться до вас, як не повернуся до вас і я... Я знайшла свою ВІРУ і свою ПРАВДУ, вони ЖИВІ, ваша ж - МЕРТВА... Оплакуйте своїх синів - вони вас любили. Я ж ніколи не пробачу вам їхньої смерті, поки жива. І нехай ваша вина залишається з вами. Можливо, колись вона принесе вам Світло та Прощення... Але не від мене». Голову ж Волхва Іоанна не привезли в Метеору з тієї ж причини - ніхто з лицарів Храму не захотів повертатися до нас... Ми втратили їх, як втрачали не раз багатьох інших, хто не хотів зрозуміти і прийняти наших жертв... Хто так а, як ти, пішли, засуджуючи нас.
    У мене паморочилося в голові!.. Як спраглий, вгамовуючи свій вічний голод знання, я жадібно вбирала потік дивовижної інформації, що щедро дарувала Північ... І мені хотілося набагато більше!.. Хотілося знати все до кінця. Це було ковтком свіжої води у випаленому болем та бідами пустелі! І я ніяк не могла вдосталь напитися.
    – У мене тисячі запитань! Але не залишилося часу... Що ж мені робити, Північ?
    – Запитуй, Ізидоро!.. Запитуй, я постараюся відповісти тобі...
    – Скажи, Північ, чому мені здається, що в цій історії як би поєдналися дві історії життя, обплетені схожими подіями, і подаються вони, як життя однієї особи? Чи я не маю рації?
    - Ти абсолютно права, Ізідоро. Як я вже казав тобі раніше, «сильні цього світу», хто створював фальшиву історію людства, «наділи» на справжнє життя Христа чуже життя юдейського пророка Джошуа (Joshua), який жив півтори тисячі років тому (з часу розповіді Півночі). І не тільки його самого, а й його родини, його рідних та близьких, його друзів та послідовників. Адже саме у дружини пророка Джошуа, юдейки Марії, була сестра Марта та брат Лазар, сестра його матері Марія Якобе, та інші, яких ніколи не було поряд із Радомиром та Магдалиною. Так само, як не було поруч із ними й чужих «апостолів» – Павла, Матвія, Петра, Луки та інших...
    Саме сім'я пророка Джошуа перебралася півтори тисячі років тому в Прованс (який на той час називався Гаул (Transalpine Gaul), в грецьке місто Массалію (теперішній Марсель), оскільки Масалія на той час була «ворітами» між Європою та Азією, і це було найлегшим шляхом для всіх «гнаних», щоб уникнути переслідувань та бід.



    
    Top