Skip to content

Commit

Permalink
Revert "[ELF] Merge verdefIndex into versionId. NFC (#72208)"
Browse files Browse the repository at this point in the history
This reverts commit 667ea2c.
  • Loading branch information
MaskRay committed Nov 16, 2023
1 parent ae51ec8 commit 2e889e7
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 16 deletions.
4 changes: 2 additions & 2 deletions lld/ELF/InputFiles.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1546,7 +1546,7 @@ template <class ELFT> void SharedFile::parse() {
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
Expand All @@ -1563,7 +1563,7 @@ template <class ELFT> void SharedFile::parse() {
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;
}
}

Expand Down
1 change: 1 addition & 0 deletions lld/ELF/Relocations.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -309,6 +309,7 @@ static void replaceWithDefined(Symbol &sym, SectionBase &sec, uint64_t value,
size, &sec)
.overwrite(sym);

sym.verdefIndex = old.verdefIndex;
sym.exportDynamic = true;
sym.isUsedInRegularObj = true;
// A copy relocated alias may need a GOT entry.
Expand Down
12 changes: 7 additions & 5 deletions lld/ELF/SymbolTable.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ Symbol *SymbolTable::insert(StringRef name) {
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;
Expand Down Expand Up @@ -234,9 +235,10 @@ bool SymbolTable::assignExactVersion(SymbolVersion ver, uint16_t versionId,
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)
Expand All @@ -254,8 +256,8 @@ void SymbolTable::assignWildcardVersion(SymbolVersion ver, uint16_t versionId,
// 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;
}
}
Expand Down
10 changes: 5 additions & 5 deletions lld/ELF/Symbols.h
Original file line number Diff line number Diff line change
Expand Up @@ -313,12 +313,11 @@ class Symbol {
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);
Expand Down Expand Up @@ -358,6 +357,7 @@ class Defined : public Symbol {
}
void overwrite(Symbol &sym) const {
Symbol::overwrite(sym, DefinedKind);
sym.verdefIndex = -1;
auto &s = static_cast<Defined &>(sym);
s.value = value;
s.size = size;
Expand Down
10 changes: 6 additions & 4 deletions lld/ELF/SyntheticSections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3140,8 +3140,10 @@ bool VersionTableSection::isNeeded() const {

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());
Expand All @@ -3150,10 +3152,10 @@ void elf::addVerneed(Symbol *ss) {
// 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>
Expand Down

0 comments on commit 2e889e7

Please sign in to comment.