Skip to content

Linking against static OpenEXR 3.0.3 appears to be broken with gcc #1026

Open
@betajippity

Description

@betajippity

I built OpenEXR 3.0.3 as a static library on RHEL 7 using gcc 8.x, and when attempting to link against the resultant static libraries, I get a ton of missing symbols. There are hundreds and hundreds of lines of linking errors against pretty much everything across all of OpenEXR's constituent libraries; here's a random subset:

/usr/bin/ld: libOpenEXR.a(ImfAttribute.cpp.o): in function `Imf_3_0::Attribute::newAttribute(char const*)':
ImfAttribute.cpp:(.text+0x671): undefined reference to `iex_debugTrap()'
/usr/bin/ld: ImfAttribute.cpp:(.text+0x87d): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: libOpenEXR.a(ImfAttribute.cpp.o): in function `Imf_3_0::Attribute::registerAttributeType(char const*, Imf_3_0::Attribute* (*)())':
ImfAttribute.cpp:(.text+0x93b): undefined reference to `iex_debugTrap()'
/usr/bin/ld: libOpenEXR.a(ImfAttribute.cpp.o): in function `Imf_3_0::Attribute::newAttribute(char const*) [clone .cold]':
ImfAttribute.cpp:(.text.unlikely+0x3): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfAttribute.cpp:(.text.unlikely+0xa): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfAttribute.cpp.o): in function `Imf_3_0::Attribute::registerAttributeType(char const*, Imf_3_0::Attribute* (*)()) [clone .cold]':
ImfAttribute.cpp:(.text.unlikely+0x120): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfAttribute.cpp:(.text.unlikely+0x127): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfAttribute.cpp:(.text.unlikely+0x12e): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::operator[](char const*)':
ImfHeader.cpp:(.text+0x961): undefined reference to `iex_debugTrap()'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::erase(char const*)':
ImfHeader.cpp:(.text+0xebb): undefined reference to `iex_debugTrap()'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::operator[](char const*) const':
ImfHeader.cpp:(.text+0x12e1): undefined reference to `iex_debugTrap()'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::sanityCheck(bool, bool) const':
ImfHeader.cpp:(.text+0x1c06): undefined reference to `iex_debugTrap()'
/usr/bin/ld: ImfHeader.cpp:(.text+0x1e1c): undefined reference to `iex_debugTrap()'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o):ImfHeader.cpp:(.text+0x20ae): more undefined references to `iex_debugTrap()' follow
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::(anonymous namespace)::sanityCheckDisplayWindow(int, int) [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x18): undefined reference to `Iex_3_0::ArgExc::ArgExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x1f): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x26): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `void Imf_3_0::(anonymous namespace)::checkIsNullTerminated<256ul>(char const (&) [256ul], char const*) [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0xd1): undefined reference to `Iex_3_0::InputExc::InputExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0xd8): undefined reference to `Iex_3_0::InputExc::~InputExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0xdf): undefined reference to `typeinfo for Iex_3_0::InputExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::operator[](char const*) [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x174): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x17b): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x182): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::name[abi:cxx11]() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x21c): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x223): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x22a): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::chunkCount() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x262): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x269): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x270): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::tileDescription() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x2a8): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x2af): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x2b6): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::previewImage() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x2ee): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x2f5): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x2fc): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::version() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x334): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x33b): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x342): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::type[abi:cxx11]() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x37a): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x381): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x388): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::view[abi:cxx11]() [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x3c0): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x3c7): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x3ce): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::erase(char const*) [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x402): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x409): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x410): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::operator[](char const*) const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x4a2): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x4a9): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x4b0): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::name[abi:cxx11]() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x54a): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x551): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x558): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::chunkCount() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x590): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x597): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x59e): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::tileDescription() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x5d6): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x5dd): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x5e4): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::previewImage() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x61c): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x623): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x62a): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::version() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x662): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x669): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x670): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::view[abi:cxx11]() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x6a8): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x6af): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x6b6): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::type[abi:cxx11]() const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x6ee): undefined reference to `Iex_3_0::TypeExc::TypeExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x6f5): undefined reference to `Iex_3_0::TypeExc::~TypeExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x6fc): undefined reference to `typeinfo for Iex_3_0::TypeExc'
/usr/bin/ld: libOpenEXR.a(ImfHeader.cpp.o): in function `Imf_3_0::Header::sanityCheck(bool, bool) const [clone .cold]':
ImfHeader.cpp:(.text.unlikely+0x732): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x739): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x740): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x762): undefined reference to `Iex_3_0::ArgExc::ArgExc(std::__cxx11::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >&)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x769): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x770): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x894): undefined reference to `Iex_3_0::ArgExc::ArgExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x89b): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x8a2): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x8de): undefined reference to `Iex_3_0::ArgExc::ArgExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x8e5): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x8ec): undefined reference to `typeinfo for Iex_3_0::ArgExc'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x910): undefined reference to `Iex_3_0::ArgExc::ArgExc(char const*)'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x917): undefined reference to `Iex_3_0::ArgExc::~ArgExc()'
/usr/bin/ld: ImfHeader.cpp:(.text.unlikely+0x91e): undefined reference to `typeinfo for Iex_3_0::ArgExc'

...and so on and so forth. Basically, it seems like when linking a static libOpenEXR.a and libIex.a, the static OpenEXR library can't find symbols from Iex.

If I attempt to link against a version of OpenEXR 3.0.3 that is built as dynamic libraries, everything links just fine.

Also, if I build OpenEXR 3.0.3 as static libraries using clang on macOS 11, I can link against those just fine too.

Am I missing something here? Or are static builds somehow broken with gcc but not with clang?

Metadata

Metadata

Assignees

No one assigned

    Labels

    BuildA problem with building or installing the library.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions