From 790552c20fbd8daa77d343419f0f6ec4e7fa1457 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Sun, 27 Nov 2011 10:37:47 +0000 Subject: Revert r145180 as it is causing test failures on all the bots. Original commit message: Fixed ObjectFile functions: - getSymbolOffset() renamed as getSymbolFileOffset() - getSymbolFileOffset(), getSymbolAddress(), getRelocationAddress() returns same result for ELFObjectFile, MachOObjectFile and COFFObjectFile. - added getRelocationOffset() - fixed MachOObjectFile::getSymbolSize() - fixed MachOObjectFile::getSymbolSection() - fixed MachOObjectFile::getSymbolOffset() for symbols without section data. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145182 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/ELFObjectFile.cpp | 49 ++++++++++++-------------------------------- 1 file changed, 13 insertions(+), 36 deletions(-) (limited to 'lib/Object/ELFObjectFile.cpp') diff --git a/lib/Object/ELFObjectFile.cpp b/lib/Object/ELFObjectFile.cpp index a6c4c257d0..d1a43e7b95 100644 --- a/lib/Object/ELFObjectFile.cpp +++ b/lib/Object/ELFObjectFile.cpp @@ -325,7 +325,7 @@ class ELFObjectFile : public ObjectFile { protected: virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; - virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; + virtual error_code getSymbolOffset(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; @@ -355,8 +355,6 @@ protected: RelocationRef &Res) const; virtual error_code getRelocationAddress(DataRefImpl Rel, uint64_t &Res) const; - virtual error_code getRelocationOffset(DataRefImpl Rel, - uint64_t &Res) const; virtual error_code getRelocationSymbol(DataRefImpl Rel, SymbolRef &Res) const; virtual error_code getRelocationType(DataRefImpl Rel, @@ -464,7 +462,7 @@ ELFObjectFile template error_code ELFObjectFile - ::getSymbolFileOffset(DataRefImpl Symb, + ::getSymbolOffset(DataRefImpl Symb, uint64_t &Result) const { validateSymbol(Symb); const Elf_Sym *symb = getSymbol(Symb); @@ -488,8 +486,7 @@ error_code ELFObjectFile case ELF::STT_FUNC: case ELF::STT_OBJECT: case ELF::STT_NOTYPE: - Result = symb->st_value + - (Section ? Section->sh_offset - Section->sh_addr : 0); + Result = symb->st_value; return object_error::success; default: Result = UnknownAddressOrSize; @@ -505,25 +502,28 @@ error_code ELFObjectFile const Elf_Sym *symb = getSymbol(Symb); const Elf_Shdr *Section; switch (getSymbolTableIndex(symb)) { - case ELF::SHN_COMMON: + case ELF::SHN_COMMON: // Fall through. // Undefined symbols have no address yet. case ELF::SHN_UNDEF: Result = UnknownAddressOrSize; return object_error::success; case ELF::SHN_ABS: - Result = symb->st_value; + Result = reinterpret_cast(base()+symb->st_value); return object_error::success; default: Section = getSection(symb); } - + const uint8_t* addr = base(); + if (Section) + addr += Section->sh_offset; switch (symb->getType()) { case ELF::STT_SECTION: - Result = Section ? Section->sh_addr : UnknownAddressOrSize; + Result = reinterpret_cast(addr); return object_error::success; - case ELF::STT_FUNC: - case ELF::STT_OBJECT: + case ELF::STT_FUNC: // Fall through. + case ELF::STT_OBJECT: // Fall through. case ELF::STT_NOTYPE: - Result = symb->st_value; + addr += symb->st_value; + Result = reinterpret_cast(addr); return object_error::success; default: Result = UnknownAddressOrSize; @@ -920,29 +920,6 @@ error_code ELFObjectFile return object_error::success; } -template -error_code ELFObjectFile - ::getRelocationOffset(DataRefImpl Rel, - uint64_t &Result) const { - uint64_t offset; - const Elf_Shdr *sec = getSection(Rel.w.b); - switch (sec->sh_type) { - default : - report_fatal_error("Invalid section type in Rel!"); - case ELF::SHT_REL : { - offset = getRel(Rel)->r_offset; - break; - } - case ELF::SHT_RELA : { - offset = getRela(Rel)->r_offset; - break; - } - } - - Result = offset - sec->sh_addr; - return object_error::success; -} - template error_code ELFObjectFile ::getRelocationType(DataRefImpl Rel, -- cgit v1.2.3-18-g5258