Використання компілятора gnu c

основи GCC

Компілятор GCC є частиною проекту Free Software Foundation's GNU. GCC розроблений за допомогою середовища розробки Open Source одом, як і всі інструменти GNU, і підтримує різні платформи, включаючи AIX. GCC розшифровується як GNU Compiler Collection (набір компіляторів GNU) і підтримує багато мов програмування, таких як C, C ++, Objective C, Fortran, і Java. У цій статті ми будемо розглядати GCC версій 3.3.4 і всі версії 3.4 для AIX версій 5.1, 5.2 і 5.3.

Порівняння компілятора GCC з компілятором XL C / C ++

Але є кілька ситуацій, коли використання компілятора GCC може виявитися кращим. Коли додатки написані з використанням стандартних API і скомпільовані за допомогою компіляторів GNU gcc або g ++. перенести їх на різні платформи набагато простіше. GCC має зовнішні інтерфейси для різноманітних мов програмування, які полегшують синтаксичний розбір коду на цих мовах. GCC є стерпним компілятором і працює на більшості платформ, доступних сьогодні, і при цьому підтримує більшість 64-бітових процесорів. GCC є переносних залежним крос-компілятором, який може скомпілювати будь-яку програму, створивши при цьому виконуваний файл для будь-якої платформи, навіть відмінною від тієї, на якій працює сам компілятор GCC. Це дозволяє скомпілювати програмне забезпечення для вбудованих систем, у яких немає можливості працювати з компілятором. GCC написаний на мові C з сильним ухилом на переносимість, і може скомпілювати сам себе; цей компілятор може бути легко адаптований до нових систем. Нарешті, GCC надає свободу в поліпшенні GCC і іншого програмного забезпечення GNU, створеного сторонніми розробниками.

Спроби розробників реалізувати підтримку своїх програм на різних платформах, використовуючи різні компілятори на цих платформах, рідко закінчуються успіхом. Якщо замість цього використовувати компілятор GCC, підтримуваний багатьма платформами, то це зменшить проблеми, що виникають при портировании додатки з однієї платформи на іншу. GCC може полегшити роботу програміста, надавши загальну середу компіляції для різних платформ. Також g ++ тепер ближче до повної відповідності зі стандартами ISO / ANSI C ++.

Зауважимо, що звичайна операційна система AIX не розуміє make-файли GCC. Для того, щоб можна було завантажити компілятор GCC на AIX, необхідно щоб на цій ОС були make-файли GNU. Потрібно виконати команду make -v для того, щоб дізнатися, що необхідно для компіляції з використанням GCC.

Сумісність на рівні двійкових кодів в AIX 5L

IBM забезпечує сумісність на рівні двійкових кодів між версіями ОС AIX 5.1, AIX 5.2 і AIX 5.3. Отже, програми, що працюють на AIX 5.1 або на AIX 5.2, будуть працювати таким же чином і на версії 5.3, в разі якщо при їх розробці були дотримані критерії, викладені в документі IBM's AIX 5L binary compatibility. До цього можна додати, що незалежні постачальники програмного забезпечення (ISV надалі) використовують різні способи підтримки нової версії ОС. Більшість з провідних ISV проводять тестування своїх додатків на сумісність з новою ОС, зазвичай це деякий набір тестів, по завершенню якого ISV заявляє про підтримку нової ОС. Однак інші ISV вивчають розроблені IBM докладні критерії сумісності на рівні двійкових кодів і якщо їх додаток відповідає цим критеріям, то воно вважається сумісним з новою ОС. В обох випадках немає необхідності в перекомпілірованіі додатків для використання їх під ОС AIX 5.3.

Інсталяція GCC на AIX

Інсталювати GCC на AIX легко - для цього потрібен тільки двійкового коду відповідної версії GCC. Виконавчі файли можна завантажити з сайту Bull AIX Freeware. з сайту IBM AIX Toolbox for Linux applications. або з сайту Інтернет-бібліотеки UCLA AIX Software. Після завантаження відповідного двійкового файлу необхідно змінити режим доступу до завантажений файл за допомогою команди chmod. щоб він став виконуваним, а потім запустити SMIT для установки. На Web-сайті UCLA є двійковий код GCC version 3.3.4 для AIX 5.1. Версія GCC 3.3.4 сумісна на рівні двійкових кодів з AIX 5.2. В GCC version 3.3 була додана підтримка для AIX 5.2.

На даний момент на сайті з IBM AIX Toolbox for Linux applications доступні виконавчі файли GCC 3.3.2 для ОС AIX 5.1 і 5.2. Також на сайті BULL Freeware є GCC версії 3.3.2 для ОС AIX 5.2.

Необхідно переконатись, що була встановлена ​​версія GCC, відповідна встановленої версії AIX. GCC встановлює власні копії деяких заголовків файлів, які повинні коректно інтегруватися з заголовками файлами системи AIX для нормального функціонування GCC, інакше при роботі компілятора можуть виникнути повідомлення про помилки, пов'язаних з заголовками файлами. Заголовки, якщо вони не узгоджені, повинні бути заново скомпоновані. Можна видалити кеш заголовки, щоб скомпонувати новий реліз GCC зі старих вихідних кодів, але GCC не працюватиме без кеша заголовних файлів.

Посилання на Web-сайти

Для більш вичерпної інформації про проект GNU та компілятору GCC слід відвідати офіційний Web-сайт. Список нових можливостей в GCC версії 3.3 доступний за цим посиланням. Також, список нових можливостей в GCC версії 3.4.3 доступний за посиланням.

Опції компілятора GCC

Для GCC доступна велика кількість опцій компіляції, починаючи від оптимізації коду, компіляція з урахуванням стандарту ISO / ANSI або без урахування оного, до опцій налагодження, опцій компіляції коду-шаблону. GCC також надає деякі опції, характерні тільки для pSeries (колишніх RS / 6000) і платформ PowerPC.

Повний опис опцій, доступних для платформ POWER і PowerPC, розміщено на Web-сторінці. Нижче ми розглянемо кілька опцій, які ми вважали особливо важливими.

З опцій, які використовуються для настройки типу процесора, наприклад, -mcpu і -mtune. краще використовувати стандартні опції, надані GCC. На AIX 4.3 і AIX 5.1, стандартними опціями є -mcpu = common - цей код буде працювати на всіх комп'ютерах з процесором сімейства pSeries (RS / 6000). На AIX 5.2 і наступних версіях, стандартною опцією є -mcpu = powerpc - цей код буде працювати на процесорах pSeries PowerPC. GCC приймає тип сучасного процесора, асоційованого з поточним релізом AIX, в якості моделі процесора для задач планування.

Для оптимізації під певний процесор або клас процесора слід використовувати опції -mcpu = power. -mcpu = power2. -mcpu = powerpc. -mcpu = power4 і інші. Не варто використовувати опції -mpower. -mpowerpc. -mpower2 або -mpowerpc64. Хоча вони і доступні, вони не призначені для використання кінцевим користувачем. Застосування окремо опції -mpower2 або інших опцій може спричинити непередбачувані результати, тому що компілятор може перебувати в суперечливому режимі з цільовим процесором.

Щоб скомпілювати додаток в 64-х біт, слід використовувати опцію -maix64. яка активує 64-х бітний машинний інтерфейс (ABI в подальшому) AIX, наприклад, 64-бітові покажчики, 64-бітові довгі типи, і інфраструктуру, яка необхідна для їх підтримки. Установка -maix64 тягне за собою установку -mpowerpc64 і -mpowerpc. тоді як -maix32 відключає 64-бітний ABI і опцію -mno-powerpc64. GCC за замовчуванням використовує -maix32.

При отриманні повідомлення про помилку від компоновщика, в якому говориться що переповнене доступне простір TOC (Table of Contents - області змісту), можна зменшити простір TOC за допомогою команди -mminimal-toc. За замовчуванням GCC використовує -mfull-toc. який розподіляє принаймні одну TOC-запис для кожної унікальної неавтоматической посилальної змінної. Також GCC поміщає в TOC константи з плаваючою точкою. Однак, в TOC є тільки 16 384 елементів, і тому цілком можна його переповнити. Опція -mminimal-toc GCC дозволяє ставити у відповідність з одним елементом TOC тільки одну функцію.

-pthread компілює і компонує додаток з бібліотекою POSIX threads таким же чином, як це було б зроблене в середовищі VisualAge (або XL) C / C ++. У VisualAge (або XL) C / C ++ для забезпечення поддержкт потоків можна виконати компіляцію і компонування за допомогою опцій xlc_r або xlC_r. але ці опції не будуть працювати з GCC. Тому для GCC код з підтримкою потоків повинен бути скомпонований з використанням -pthread. Опція -pthread встановить відповідні прапори як для препроцесора, так і для компоновщика.

Опція -g створює інформацію про налагодження, характерну для -gxcoff + на рівні 2. Отладочная інформація може містити деякі додаткові відомості, призначені для GNU Debugger (GDB). Щоб створити зневадження більш сумісну з AIX dbx. слід використовувати опцію -gxcoff.

GCC для AIX не підтримує повністю опцію -msoft-float. Застосування цієї опції припинить використання регістрів з плаваючою точкою в GCC, але, проте, допоміжні бібліотеки GCC і бібліотеки AIX будуть продовжувати використовувати регістри з плаваючою точкою.

Використання опцій -mlittle-endian і -mcall-linux в конфігурації AIX некоректно. У документації вказані всі опції для цільових платформ "rs6000" GCC. Але не всі опції доступні для використання з будь-якої певної конфігурацією.

Для передачі опцій безпосередньо переносних залежному компонувальнику AIX, використовуйте -Wl, .

Опції компіляторів G ++ і GCC

Опис опцій, характерних для компілятора g ++, розміщено за цим посиланням. Ці опції дійсні і для AIX.

Також повний опис опцій, характерних для компілятора gcc, розміщено на Web-сторінці. Ці опції дійсні також для AIX та інших UNIX-систем.

Список опцій для оптимізації розміщений на сторінці.

Найбільш поширеною опцією оптимізації є -O2. яка дозволяє, збільшити продуктивність виконуваного файлу або бібліотеки. -O3 надає більше можливостей оптимізації, які можуть збільшити продуктивність за рахунок більш тривалого процесу компіляції. -Os збільшує продуктивність і при цьому намагається зменшити розміри програмного коду.

Додаткові опції оптимізації, які корисні для складних наукових розрахунків, включають в себе -funroll-loops і -ffast-math. -ffast-math. і дозволяють компілятору збільшити продуктивність за рахунок точної відповідності стандартам IEEE і ISO для математичних функцій.

Бібліотеки колективного доступу в AIX і в Unix System V

Давайте спочатку розглянемо відмінності між AIX і Unix System V, які відносяться до бібліотек колективного доступу, а потім пояснимо як за допомогою GCC можна створювати бібліотеки колективного доступу для AIX.

AIX і Unix System V по різному розглядають бібліотеки колективного доступу. AIX в основному розглядає об'єкти колективного доступу як повністю скомпоновані і закінчені суті, в яких посилання на імена затверджуються під час компонування, і не можуть бути змінені під час завантаження. Unix System V бачить об'єкти колективного доступу як звичайні об'єктні файли, в яких всі глобальні назви змінних затверджуються компоновщиком під час виконання. Однак, AIX має можливість робити компоновку на етапі виконання (run-time linking (RTL)), так що імена змінних можуть залишатися невизначеними до етапу завантаження, на якому буде виконаний пошук необхідних визначень у всіх завантажених модулях.

Спільно переглянуте модуль в AIX може бути об'єктним файлом або архівним файлом, який може містити в собі модулі для спільного використання та / або звичайні об'єктні файли. В Unix System V бібліотеки колективного доступу завжди є звичайними файлами, які були створені за допомогою спеціальних опцій.

Для компілятора GCC бібліотека колективного доступу створюється командою gcc -share. Компоновщик автоматично експортує імена деяких елементів, однак, якщо треба експортувати більше елементів, слід використовувати команду AIX ld -bexpall. Імена з символом підкреслення не експортуються автоматично. У AIX 5.2 або AIX 5.1 на другому рівні обслуговування (maintenance level 2) можна використовувати нову опцію компонування -bexpfull. яка буде експортувати всі імена, і не пропустить імена, які починаються з символу підкреслення (як змінені імена в C ++). Для повного контролю найкраще буде створити експортний файл. Якщо програміст не знайомий з експортними файлів AIX, то йому слід прочитати документ AIX Linking and Loading Mechanisms (Механізми компонування і завантаження AIX) (PDF 184KB).

Як вже говорилося вище, команда gcc -shared створює жорстко-прив'язаний об'єкт в стилі AIX для спільного використання. gcc -shared викликає компоновщик AIX з опцією -bM: SRE -bnoentry. Отже, немає потреби комбінувати ці дві опції AIX.

При використанні -brtl компоновщик AIX буде шукати бібліотеки з розширеннями .a і .so. наприклад, libfoo.a і libfoo.so. Без опції -brtl компоновщик AIX буде шукати тільки libfoo.a. Створити libfoo.a простим архівуванням об'єкта колективного доступу або перейменуванням об'єкту колективного доступу в libfoo.a - для AIX важливо, щоб був суфікс .a. Щоб використовувати в AIX компоновку на етапі виконання, слід за допомогою команди gcc -shared -Wl, -G створити об'єкт колективного доступу і, потім, використовуючи бібліотеку, тобто додавши опцію -Wl, -brtl в команду компонування, створити виконуваний файл. Технічно можна не використовувати опцію -shared. проте ця опція нешкідлива і зменшує плутанину.

Якщо необхідно створити об'єкт для колективного використання за допомогою GCC, знадобиться тільки gcc -shared і, можливо, опція -bexpfull або експортний файл з посиланням на себе -Wl. -bE:.exp Це просто.

Можливі проблеми при використанні GCC / G ++ на AIX

Нижче перераховані кілька можливих проблем, з якими можна зіткнутися при використанні GCC або G ++ на AIX. Для кожної проблеми ми приведемо опис, а потім покажемо спосіб її вирішення.

  • Спроби скомпілювати GCC на AIX закінчуються повідомленням про помилку асемблера. Щоб виправити це, потрібно перевірити, що не використовується застаріла версія GNU асемблера, який не розуміє деякі особливості PowerPC. Як говориться в інструкціях з установки AIX на інтернет-сайті GNU GCC, кращим є використання асемблера AIX.
  • Іноді, по ходу процесу компонування може виникнути повідомлення про помилку:

    Ця помилка може вказувати на те, що диск заповнений або на те, що змінна середовища ULIMIT не дозволяє файлу досягти необхідних розмірів.

  • G ++ виконує зміна імен не таким способом, як VisualAge (або XL) C ++. Це означає що об'єктні файли, скомпільовані одним компілятором, не зможуть використовуватися іншим компілятором.
  • GNU-асемблер (GAS) не підтримує PIC. Для створення PIC-коду слід використовувати будь-які інші асемблери, наприклад, переносних залежний компілятор AIX `/ bin / as '.
  • У AIX, компіляція коду типу:

    призведе до того, що компоновщик повідомить про невизначеному імені foo. Хоча це поведінка і відрізняється від більшості інших систем, воно не є помилковим, оскільки перевизначення зовнішньої змінної в статичну не визначене в ANSI C.

  • "У версіях GCC, що передують GCC 3.4, не всі структури даних передаються за значенням. GCC 3.4 зараз володіє більш кращою підтримкою ABI для передачі параметрів структури. Хоча ці зміни збільшують відповідність між GCC і AIX ABI, вони можуть стати причиною несумісності з кодом, скомпільований за допомогою ранніх версій GCC. Для отримання додаткової інформації потрібно вивчити пропонований документ.
  • Коли GCC збирається для певної версії AIX, він створює деякі файли, характерні тільки для цієї версії ОС і її заголовних файлів. Це може стати проблемою при використанні даної збірки GCC на новіших версіях ОС, або навіть при самосборке цього компілятора на новій ОС. Дана проблема відбувається при складанні GCC на AIX 5.2 за допомогою GCC, скомпільованого для AIX 5.1 (або більш ранньої версії ОС). AIX 5.2 додає підтримку функції atoll (). тоді як збірка GCC для AIX 5.1 включає в себе кешовану версію stdlib.h, яка не містить прототипу цієї функції. Значення, що повертається непрототіпірованной функції за замовчуванням представлено в типі "int" замість "long long", через що GCC некоректно конвертує деякі рядки. Для самонастроювання GCC на AIX 5.2, необхідно видалити з GCC "виправлений" заголовки stdlib.h так, щоб використовувався заголовки AIX 5.2. Системний заголовки може використовуватися старої складанням GCC для самонастроювання компілятора.
  • Нижче представлений приклад з досить великим розміром стека для кожного потоку і відповідним makefile, який GCC використовує для компіляції програми, що використовує pthreads.

    Масив розподілений в стеці, а не в секторі даних. Проблема полягає в розмірі стека для потоку. Для збільшення розміру стека потоку за замовчуванням необхідно використовувати відповідні функції pthread. Без #ifdef _AIX програмний код буде записаний в файл дампа.

    Ресурси для скачування

    Схожі теми

    • "Using the GNU C / C ++ compiler on AIX (EN): оригінал статті.
    • GCC Gnu home page. сайт з докладною інформацією про GCC. (EN)
    • Bull AIX Freeware. різне програмне забезпечення з відкритим вихідним кодом для AIX. (EN)
    • IBM AIX Toolbox for Linux Applications. інформація про завантаження доступна на цій сторінці. (EN)
    • Розділ developerWorks AIX і UNIX містить сотні інформативних статей для читачів початкової, середньої і високої кваліфікації.

    Схожі статті