Spec-Zone.ru › GCC 11

Next: Несовместимости GCC, Previous: Действительные ошибки, которые мы ещё не исправили, Up: Известные причины проблем с GCC [Содержание][Индекс]

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

Next: Несовместимости GCC, Previous: Действительные ошибки, которые мы ещё не исправили, Up: Известные причины проблем с GCC [Содержание][Индекс]

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

Spec-Zone.ru

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