Skip to content

Commit

Permalink
[llvm-readobj] [COFF] Print the symbol index for relocations
Browse files Browse the repository at this point in the history
There can be multiple local symbols with the same name (for e.g.
comdat sections), and thus the symbol name itself isn't enough
to disambiguate symbols.

Differential Revision: https://reviews.llvm.org/D56140

llvm-svn: 350288
  • Loading branch information
mstorsjo committed Jan 3, 2019
1 parent 5ef47ad commit 74e7d26
Show file tree
Hide file tree
Showing 6 changed files with 26 additions and 3 deletions.
2 changes: 2 additions & 0 deletions llvm/include/llvm/Object/COFF.h
Expand Up @@ -1022,6 +1022,8 @@ class COFFObjectFile : public ObjectFile {

ArrayRef<uint8_t> getSymbolAuxData(COFFSymbolRef Symbol) const;

uint32_t getSymbolIndex(COFFSymbolRef Symbol) const;

size_t getSymbolTableEntrySize() const {
if (COFFHeader)
return sizeof(coff_symbol16);
Expand Down
10 changes: 10 additions & 0 deletions llvm/lib/Object/COFFObjectFile.cpp
Expand Up @@ -1065,6 +1065,16 @@ COFFObjectFile::getSymbolAuxData(COFFSymbolRef Symbol) const {
return makeArrayRef(Aux, Symbol.getNumberOfAuxSymbols() * SymbolSize);
}

uint32_t COFFObjectFile::getSymbolIndex(COFFSymbolRef Symbol) const {
uintptr_t Offset =
reinterpret_cast<uintptr_t>(Symbol.getRawPtr()) - getSymbolTable();
assert(Offset % getSymbolTableEntrySize() == 0 &&
"Symbol did not point to the beginning of a symbol");
size_t Index = Offset / getSymbolTableEntrySize();
assert(Index < getNumberOfSymbols());
return Index;
}

std::error_code COFFObjectFile::getSectionName(const coff_section *Sec,
StringRef &Res) const {
StringRef Name;
Expand Down
4 changes: 4 additions & 0 deletions llvm/test/MC/COFF/cross-section-relative.s
Expand Up @@ -87,21 +87,25 @@ t6:
// READOBJ-NEXT: Offset: 0x0
// READOBJ-NEXT: Type: IMAGE_REL_AMD64_REL32 (4)
// READOBJ-NEXT: Symbol: g3
// READOBJ-NEXT: SymbolIndex: 12
// READOBJ-NEXT: }
// READOBJ-NEXT: Relocation {
// READOBJ-NEXT: Offset: 0x4
// READOBJ-NEXT: Type: IMAGE_REL_AMD64_ADDR32NB (3)
// READOBJ-NEXT: Symbol: g3
// READOBJ-NEXT: SymbolIndex: 12
// READOBJ-NEXT: }
// READOBJ-NEXT: Relocation {
// READOBJ-NEXT: Offset: 0x20
// READOBJ-NEXT: Type: IMAGE_REL_AMD64_REL32 (4)
// READOBJ-NEXT: Symbol: g3
// READOBJ-NEXT: SymbolIndex: 12
// READOBJ-NEXT: }
// READOBJ-NEXT: Relocation {
// READOBJ-NEXT: Offset: 0x28
// READOBJ-NEXT: Type: IMAGE_REL_AMD64_REL32 (4)
// READOBJ-NEXT: Symbol: foobar
// READOBJ-NEXT: SymbolIndex: 20
// READOBJ-NEXT: }
// READOBJ-NEXT: }
// READOBJ-NEXT:]
3 changes: 3 additions & 0 deletions llvm/test/Object/yaml2obj-readobj.test
Expand Up @@ -13,16 +13,19 @@ RUN: | FileCheck %s --check-prefix COFF-I386
// COFF-I386-NEXT: Offset: 0xE
// COFF-I386-NEXT: Type: IMAGE_REL_I386_DIR32 (6)
// COFF-I386-NEXT: Symbol: L_.str
// COFF-I386-NEXT: SymbolIndex: 5
// COFF-I386-NEXT: }
// COFF-I386-NEXT: Relocation {
// COFF-I386-NEXT: Offset: 0x13
// COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 (20)
// COFF-I386-NEXT: Symbol: _puts
// COFF-I386-NEXT: SymbolIndex: 6
// COFF-I386-NEXT: }
// COFF-I386-NEXT: Relocation {
// COFF-I386-NEXT: Offset: 0x18
// COFF-I386-NEXT: Type: IMAGE_REL_I386_REL32 (20)
// COFF-I386-NEXT: Symbol: _SomeOtherFunction
// COFF-I386-NEXT: SymbolIndex: 7
// COFF-I386-NEXT: }
// COFF-I386-NEXT: }
// COFF-I386-NEXT: ]
6 changes: 3 additions & 3 deletions llvm/test/tools/llvm-readobj/relocations.test
Expand Up @@ -21,9 +21,9 @@ RUN: | FileCheck %s -check-prefix WASM

COFF: Relocations [
COFF-NEXT: Section (1) .text {
COFF-NEXT: 0x4 IMAGE_REL_I386_DIR32 .data
COFF-NEXT: 0x9 IMAGE_REL_I386_REL32 _puts
COFF-NEXT: 0xE IMAGE_REL_I386_REL32 _SomeOtherFunction
COFF-NEXT: 0x4 IMAGE_REL_I386_DIR32 .data (4)
COFF-NEXT: 0x9 IMAGE_REL_I386_REL32 _puts (7)
COFF-NEXT: 0xE IMAGE_REL_I386_REL32 _SomeOtherFunction (8)
COFF-NEXT: }
COFF-NEXT: ]

Expand Down
4 changes: 4 additions & 0 deletions llvm/tools/llvm-readobj/COFFDumper.cpp
Expand Up @@ -1365,22 +1365,26 @@ void COFFDumper::printRelocation(const SectionRef &Section,
StringRef SymbolName;
Reloc.getTypeName(RelocName);
symbol_iterator Symbol = Reloc.getSymbol();
int64_t SymbolIndex = -1;
if (Symbol != Obj->symbol_end()) {
Expected<StringRef> SymbolNameOrErr = Symbol->getName();
error(errorToErrorCode(SymbolNameOrErr.takeError()));
SymbolName = *SymbolNameOrErr;
SymbolIndex = Obj->getSymbolIndex(Obj->getCOFFSymbol(*Symbol));
}

if (opts::ExpandRelocs) {
DictScope Group(W, "Relocation");
W.printHex("Offset", Offset);
W.printNumber("Type", RelocName, RelocType);
W.printString("Symbol", SymbolName.empty() ? "-" : SymbolName);
W.printNumber("SymbolIndex", SymbolIndex);
} else {
raw_ostream& OS = W.startLine();
OS << W.hex(Offset)
<< " " << RelocName
<< " " << (SymbolName.empty() ? "-" : SymbolName)
<< " (" << SymbolIndex << ")"
<< "\n";
}
}
Expand Down

0 comments on commit 74e7d26

Please sign in to comment.