LINUX.ORG.RU

История изменений

Исправление Deleted, (текущая версия) :

При чём здесь clang? Я всё компилирую через gcc, а линкер там bfd. Моя библиотека (мой форк чужой библиотеки) использует LLVM для некоторых вычислений. Когда я использовал livstdc++.so.6, всё работало нормально, когда стал использовать libstdc++.a, стала вылезать эта ошибка. Если llvm я убираю, ошибка тут же пропадает, и всё работает статически.

Пардон, я неверно понял проблему.

Тогда все чуть «понятнее»:

  • в libstdc++.so есть std::system_category(), потому-что TL;DR он нужен для совместимости по ABI.
  • в libstdc++.a НЕТ std::system_category(), потому-что при сборке актуальным компилятором с актуальными хидерами стандартной библиотеки ссылки на такой символ не возникает (инлайнится, либо получается std::_V1::system_category() или std::_V2::system_category()).
  • а в библиотеках LLVM такая ссылка есть, так как они собраны c другими хидерами стандартной библиотеки C++ и/или с другими опциями (другой стандарт С++).

Варианта три:

  • отказаться от статической линковки.
  • пересобрать LLVM.
  • сделать заглушку для std::system_category() (и лучше пометить её посредством __attribute__((weak))).

Исходная версия Deleted, :

При чём здесь clang? Я всё компилирую через gcc, а линкер там bfd. Моя библиотека (мой форк чужой библиотеки) использует LLVM для некоторых вычислений. Когда я использовал livstdc++.so.6, всё работало нормально, когда стал использовать libstdc++.a, стала вылезать эта ошибка. Если llvm я убираю, ошибка тут же пропадает, и всё работает статически.

Пардон, я неверно понял проблему.

Тогда все чуть «понятнее»:

  • в libstdc++.so есть std::system_category(), потому-что TL;DR он нужен для совместимости по ABI.
  • в libstdc++.a НЕТ std::system_category(), потому-что при сборке актуальным компилятором с актуальными хидерами стандартной библиотеки ссылки на такой символ не возникает (инлайнится, либо получается std::_V1::system_category() или std::_V2::system_category()).
  • а в библиотеках LLVM такая ссылка есть, так как они собраны c другими хидерами стандартной библиотеки C++.

Варианта три:

  • отказаться от статической линковки.
  • пересобрать LLVM.
  • сделать заглушку для std::system_category() (и лучше пометить её посредством __attribute__((weak))).