Revert "[ELF] Merge verdefIndex into versionId. NFC" #72208 (#72484)
Reverts llvm/llvm-project#72208
If a unversioned Defined preempts a versioned DSO definition, the
version ID will not be reset.
GitOrigin-RevId: e84575449fc7f70d18b7e0650788b4ad06e80f62
diff --git a/ELF/InputFiles.cpp b/ELF/InputFiles.cpp
index 4b4d7d6..8c7f2c8 100644
--- a/ELF/InputFiles.cpp
+++ b/ELF/InputFiles.cpp
@@ -1546,7 +1546,7 @@
SharedSymbol{*this, name, sym.getBinding(), sym.st_other,
sym.getType(), sym.st_value, sym.st_size, alignment});
if (s->file == this)
- s->versionId = ver;
+ s->verdefIndex = ver;
}
// Also add the symbol with the versioned name to handle undefined symbols
@@ -1563,7 +1563,7 @@
SharedSymbol{*this, saver().save(name), sym.getBinding(), sym.st_other,
sym.getType(), sym.st_value, sym.st_size, alignment});
if (s->file == this)
- s->versionId = idx;
+ s->verdefIndex = idx;
}
}
diff --git a/ELF/Relocations.cpp b/ELF/Relocations.cpp
index d4685ce..6765461 100644
--- a/ELF/Relocations.cpp
+++ b/ELF/Relocations.cpp
@@ -309,6 +309,7 @@
size, &sec)
.overwrite(sym);
+ sym.verdefIndex = old.verdefIndex;
sym.exportDynamic = true;
sym.isUsedInRegularObj = true;
// A copy relocated alias may need a GOT entry.
diff --git a/ELF/SymbolTable.cpp b/ELF/SymbolTable.cpp
index b3d97e4..fe7edd5 100644
--- a/ELF/SymbolTable.cpp
+++ b/ELF/SymbolTable.cpp
@@ -92,6 +92,7 @@
memset(sym, 0, sizeof(Symbol));
sym->setName(name);
sym->partition = 1;
+ sym->verdefIndex = -1;
sym->versionId = VER_NDX_GLOBAL;
if (pos != StringRef::npos)
sym->hasVersionSuffix = true;
@@ -234,9 +235,10 @@
sym->getName().contains('@'))
continue;
- // If the version has not been assigned, assign versionId to the symbol.
- if (!sym->versionScriptAssigned) {
- sym->versionScriptAssigned = true;
+ // If the version has not been assigned, verdefIndex is -1. Use an arbitrary
+ // number (0) to indicate the version has been assigned.
+ if (sym->verdefIndex == uint16_t(-1)) {
+ sym->verdefIndex = 0;
sym->versionId = versionId;
}
if (sym->versionId == versionId)
@@ -254,8 +256,8 @@
// so we set a version to a symbol only if no version has been assigned
// to the symbol. This behavior is compatible with GNU.
for (Symbol *sym : findAllByVersion(ver, includeNonDefault))
- if (!sym->versionScriptAssigned) {
- sym->versionScriptAssigned = true;
+ if (sym->verdefIndex == uint16_t(-1)) {
+ sym->verdefIndex = 0;
sym->versionId = versionId;
}
}
diff --git a/ELF/Symbols.h b/ELF/Symbols.h
index 0c79efc..4addb79 100644
--- a/ELF/Symbols.h
+++ b/ELF/Symbols.h
@@ -313,12 +313,11 @@
uint32_t auxIdx;
uint32_t dynsymIndex;
- // For a Defined symbol, this represents the Verdef index (VER_NDX_LOCAL,
- // VER_NDX_GLOBAL, or a named version). For a SharedSymbol, this represents
- // the Verdef index within the input DSO, which will be converted to a Verneed
- // index in the output.
+ // This field is a index to the symbol's version definition.
+ uint16_t verdefIndex;
+
+ // Version definition index.
uint16_t versionId;
- uint8_t versionScriptAssigned : 1;
void setFlags(uint16_t bits) {
flags.fetch_or(bits, std::memory_order_relaxed);
@@ -358,6 +357,7 @@
}
void overwrite(Symbol &sym) const {
Symbol::overwrite(sym, DefinedKind);
+ sym.verdefIndex = -1;
auto &s = static_cast<Defined &>(sym);
s.value = value;
s.size = size;
diff --git a/ELF/SyntheticSections.cpp b/ELF/SyntheticSections.cpp
index 2b32eb3..0f7ebf9 100644
--- a/ELF/SyntheticSections.cpp
+++ b/ELF/SyntheticSections.cpp
@@ -3140,8 +3140,10 @@
void elf::addVerneed(Symbol *ss) {
auto &file = cast<SharedFile>(*ss->file);
- if (ss->versionId == VER_NDX_GLOBAL)
+ if (ss->verdefIndex == VER_NDX_GLOBAL) {
+ ss->versionId = VER_NDX_GLOBAL;
return;
+ }
if (file.vernauxs.empty())
file.vernauxs.resize(file.verdefs.size());
@@ -3150,10 +3152,10 @@
// already allocated one. The verdef identifiers cover the range
// [1..getVerDefNum()]; this causes the vernaux identifiers to start from
// getVerDefNum()+1.
- if (file.vernauxs[ss->versionId] == 0)
- file.vernauxs[ss->versionId] = ++SharedFile::vernauxNum + getVerDefNum();
+ if (file.vernauxs[ss->verdefIndex] == 0)
+ file.vernauxs[ss->verdefIndex] = ++SharedFile::vernauxNum + getVerDefNum();
- ss->versionId = file.vernauxs[ss->versionId];
+ ss->versionId = file.vernauxs[ss->verdefIndex];
}
template <class ELFT>