Spec-Zone.ru › GCC 5

13.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 с включенной опцией «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-5.5.0/gcc/Interoperation.html

Spec-Zone.ru

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