If an object file has an undefined foo@v1, we emit a dynamic symbol foo.
This is incorrect if at runtime a shared object provides the non-default version foo@v1
(the undefined foo may bind to foo@@v2, for example).
GNU ld issues an error for this case, even if foo@v1 is undefined weak
(https://sourceware.org/bugzilla/show_bug.cgi?id=3351). This behavior makes
sense because to represent an undefined foo@v1, we have to construct a Verneed
entry. However, without knowing the defining filename, we cannot construct a
Verneed entry (Verneed::vn_file is unavailable).
This patch implements the error.
Depends on D92258
We have the similar hacky check in
std::string lld::toString(const elf::Symbol &sym) { StringRef name = sym.getName(); std::string ret = demangle(name); // If sym has a non-default version, its name may have been truncated at '@' // by Symbol::parseSymbolVersion(). Add the trailing part. This check is safe // because every symbol name ends with '\0'. if (name.data()[name.size()] == '@') ret += name.data() + name.size(); return ret; }I think we should introduce Symbol::isVersioned or alike method to have this logic in a single place.