Spec-Zone.ru › GCC 4

11.2 Взаимодействие

В этом разделе перечислены различные трудности, возникающие при использовании GCC совместно с другими компиляторами или с ассемблерами, линковщиками, библиотеками и отладчиками на определенных системах.

  • На многих платформах GCC поддерживает другой ABI для C++ по сравнению с другими компиляторами, поэтому объектные файлы, скомпилированные GCC, не могут использоваться с объектными файлами, сгенерированными другим компилятором C++.

    Область, где это различие наиболее очевидно, — это преобразование имен. Использование различных преобразований имен является намеренным, чтобы защитить вас от более тонких проблем. Компиляторы отличаются по многим внутренним деталям реализации C++, включая: как располагаются экземпляры классов, как реализуется множественное наследование и как обрабатываются виртуальные вызовы функций. Если бы кодирование имен было одинаковым, ваши программы подключались бы к библиотекам, предоставленным другими компиляторами, но программы затем аварийно завершались при запуске. Несовместимые библиотеки тогда обнаруживаются во время линковки, а не во время выполнения.

  • На некоторых системах BSD, включая некоторые версии Ultrix, использование профилирования приводит к тому, что статические деструкторы переменных (в настоящее время используются только в C++) не выполняются.
  • На SPARC GCC выравнивает все значения типа double по границе 8 байт, и он ожидает, что каждое double будет выровнено таким образом. Компилятор Sun обычно обеспечивает double выравнивание 8 байт, за исключением одного случая: аргументы функций типа double могут не быть выровнены.

    В результате, если функция, скомпилированная с помощью Sun CC, берет адрес аргумента типа double и передает этот указатель типа double * функции, скомпилированной с помощью GCC, разыменование указателя может вызвать фатальный сигнал.

    Один из способов решения этой проблемы — компиляция всей программы с помощью GCC. Другое решение — изменить функцию, скомпилированную с помощью Sun CC, чтобы скопировать аргумент в локальную переменную; локальные переменные всегда должным образом выравниваются. Третье решение — изменить функцию, использующую указатель, для разыменования его через следующую функцию access_double вместо прямого использования ‘*’:

    inline double
    access_double (double *unaligned_ptr)
    {
      union d2i { double d; int i[2]; };
    
      union d2i *p = (union d2i *) unaligned_ptr;
      union d2i u;
    
      u.i[0] = p->i[0];
      u.i[1] = p->i[1];
    
      return u.d;
    }

    Запись в указатель может быть сделана аналогичным образом с использованием того же объединения.

  • В Solaris функция malloc в библиотеке libmalloc.a может выделять память, выровненную только по границе 4 байта. Поскольку GCC на SPARC предполагает, что числа с плавающей точкой имеют выравнивание 8 байт, это может привести к фатальному сигналу, если числа с плавающей точкой хранятся в памяти, выделенной библиотекой libmalloc.a.

    Решение состоит в том, чтобы не использовать библиотеку libmalloc.a. Используйте вместо нее malloc и связанные функции из libc.a; они не имеют этой проблемы.

  • На машине HP PA ADB иногда не работает с функциями, скомпилированными с помощью GCC. В частности, это не работает с функциями, которые используют alloca или массивами переменного размера. Это связано с тем, что GCC не генерирует дескрипторы разматывания HP-UX для таких функций. Возможно, даже невозможно их сгенерировать.
  • Отладка (-g) не поддерживается на машине HP PA, если вы не используете предварительные инструменты GNU.
  • Взятие адреса метки может сгенерировать ошибки от ассемблера HP-UX PA. GAS для PA не имеет этой проблемы.
  • Использование параметров с плавающей точкой для косвенных вызовов статических функций не будет работать при использовании ассемблера HP. Просто нет способа для GCC указать, какие регистры содержат аргументы для статических функций при использовании ассемблера HP. GAS для PA не имеет этой проблемы.
  • В очень редких случаях, связанных с некоторыми очень большими функциями, вы можете получить ошибки от HP линковщика, жалующиеся на смещение безусловного перехода за пределами границ. Раньше это происходило чаще в предыдущих версиях GCC, но сейчас это крайне редко. Если вы столкнетесь с этим, вы можете обойти проблему, сделав свою функцию меньше.
  • Код, скомпилированный GCC, иногда генерирует предупреждения от ассемблера HP-UX в форме:
    (warning) Use of GR3 when
      frame >= 8192 may cause conflict.

    Эти предупреждения безвредны и могут быть безопасно проигнорированы.

  • В крайне редких случаях, связанных с некоторыми очень большими функциями, вы можете получить ошибки от AIX ассемблера, жалующиеся на слишком большое смещение. Если вы столкнетесь с этим, вы можете обойти проблему, сделав свою функцию меньше.
  • Библиотека libstdc++.a в GCC полагается на семантику динамического линковщика SVR4, которая объединяет глобальные символы между библиотеками и приложениями, особенно необходимая для функциональности потоков C++. Это не является стандартным поведением общих библиотек и динамической линковки AIX. libstdc++.a построена на AIX с включенным «runtime-linking», чтобы объединение символов могло происходить. Для использования этой функции приложение, связанное с libstdc++.a, должно включать флаг -Wl,-brtl в строке линковки. G++ не может навязать это, поскольку этот параметр может повлиять на семантику программы пользователя, и пользователи не всегда используют ‘g++’ для линковки своего приложения. Приложения не обязаны использовать флаг -Wl,-brtl в строке линковки — остальная часть библиотеки libstdc++.a, которая не зависит от семантики объединения символов, будет продолжать работать правильно.
  • Приложение может вставить собственное определение функций для функций, вызываемых libstdc++.a с включенным «runtime-linking» на AIX. Для этого приложение должно быть связано с опцией «runtime-linking», и функции явно должны быть экспортированы приложением (-Wl,-brtl,-bE:exportfile).
  • AIX на RS/6000 обеспечивает поддержку (NLS) для сред за пределами США. Компиляторы и ассемблеры используют NLS для поддержки локализованных представлений различных объектов, включая числа с плавающей точкой (‘.’ против ‘,’ для разделения десятичных дробей). Были сообщения о проблемах, когда библиотека, связанная с GCC, не производит те же форматы чисел с плавающей точкой, которые принимает ассемблер. Если у вас возникла эта проблема, установите переменную окружения LANG в значение ‘C’ или ‘En_US’.
  • Даже если вы укажете -fdollars-in-identifiers, вы не сможете успешно использовать ‘$’ в идентификаторах на RS/6000 из-за ограничения в ассемблере IBM. GAS поддерживает эти идентификаторы.

© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Interoperation.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API