Skip to content

Revert "[ELF] Merge verdefIndex into versionId. NFC" #72208 #72484

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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