[ELF] Error for undefined foo@v1
authorFangrui Song <i@maskray.me>
Tue, 1 Dec 2020 16:59:54 +0000 (08:59 -0800)
committerFangrui Song <i@maskray.me>
Tue, 1 Dec 2020 16:59:54 +0000 (08:59 -0800)
commit843c2b2303004c1a7e4fa8037905fbc70601b155
tree926b8db581c12f82c97f674c2084fc3e9378bd4c
parent624af932a808b363a888139beca49f57313d9a3b
[ELF] Error for undefined foo@v1

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

Reviewed By: grimar

Differential Revision: https://reviews.llvm.org/D92260
lld/ELF/Relocations.cpp
lld/ELF/Symbols.h
lld/test/ELF/lto/version-script2.ll
lld/test/ELF/symver.s