From 78e8d52a5879597cafb75d18ae60bb3c92e742be Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Sun, 17 Aug 2014 19:09:37 +0000 Subject: [PATCH] llvm-objdump: don't print relocations in non-relocatable files. This matches the behavior of GNU objdump. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@215844 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Object/COFF.h | 2 ++ include/llvm/Object/ELFObjectFile.h | 6 ++++++ include/llvm/Object/MachO.h | 2 ++ include/llvm/Object/ObjectFile.h | 3 +++ lib/Object/COFFObjectFile.cpp | 4 ++++ lib/Object/MachOObjectFile.cpp | 4 ++++ test/Object/objdump-reloc-shared.test | 5 +++++ tools/llvm-objdump/llvm-objdump.cpp | 5 +++++ 8 files changed, 31 insertions(+) create mode 100644 test/Object/objdump-reloc-shared.test diff --git a/include/llvm/Object/COFF.h b/include/llvm/Object/COFF.h index 1e8d2c18f3a..fdeab2c92f3 100644 --- a/include/llvm/Object/COFF.h +++ b/include/llvm/Object/COFF.h @@ -462,6 +462,8 @@ public: std::error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const; + bool isRelocatableObject() const override; + static inline bool classof(const Binary *v) { return v->isCOFF(); } }; diff --git a/include/llvm/Object/ELFObjectFile.h b/include/llvm/Object/ELFObjectFile.h index 0ca4c7cb173..8a9e1257655 100644 --- a/include/llvm/Object/ELFObjectFile.h +++ b/include/llvm/Object/ELFObjectFile.h @@ -224,6 +224,8 @@ public: std::pair getELFDynamicSymbolIterators() const override; + + bool isRelocatableObject() const override; }; // Use an alignment of 2 for the typedefs since that is the worst case for @@ -945,6 +947,10 @@ ELFObjectFile::getELFDynamicSymbolIterators() const { return std::make_pair(dynamic_symbol_begin(), dynamic_symbol_end()); } +template bool ELFObjectFile::isRelocatableObject() const { + return EF.getHeader()->e_type == ELF::ET_REL; +} + inline std::error_code getELFRelocationAddend(const RelocationRef R, int64_t &Addend) { const ObjectFile *Obj = R.getObjectFile(); diff --git a/include/llvm/Object/MachO.h b/include/llvm/Object/MachO.h index 808ab11b765..539f1569a05 100644 --- a/include/llvm/Object/MachO.h +++ b/include/llvm/Object/MachO.h @@ -219,6 +219,8 @@ public: static bool isValidArch(StringRef ArchFlag); static Triple getHostArch(); + bool isRelocatableObject() const override; + static bool classof(const Binary *v) { return v->isMachO(); } diff --git a/include/llvm/Object/ObjectFile.h b/include/llvm/Object/ObjectFile.h index af890f5c398..100f65b47a0 100644 --- a/include/llvm/Object/ObjectFile.h +++ b/include/llvm/Object/ObjectFile.h @@ -302,6 +302,9 @@ public: return object_error::invalid_file_type; } + /// True if this is a relocatable object (.o/.obj). + virtual bool isRelocatableObject() const = 0; + /// @returns Pointer to ObjectFile subclass to handle this type of object. /// @param ObjectPath The path to the object file. ObjectPath.isObject must /// return true. diff --git a/lib/Object/COFFObjectFile.cpp b/lib/Object/COFFObjectFile.cpp index 29ea0a1a79c..717f019509b 100644 --- a/lib/Object/COFFObjectFile.cpp +++ b/lib/Object/COFFObjectFile.cpp @@ -979,6 +979,10 @@ COFFObjectFile::getRelocationValueString(DataRefImpl Rel, return object_error::success; } +bool COFFObjectFile::isRelocatableObject() const { + return !DataDirectory; +} + bool ImportDirectoryEntryRef:: operator==(const ImportDirectoryEntryRef &Other) const { return ImportTable == Other.ImportTable && Index == Other.Index; diff --git a/lib/Object/MachOObjectFile.cpp b/lib/Object/MachOObjectFile.cpp index 8e19eb5631d..afc729f9f82 100644 --- a/lib/Object/MachOObjectFile.cpp +++ b/lib/Object/MachOObjectFile.cpp @@ -1688,6 +1688,10 @@ void MachOObjectFile::ReadULEB128s(uint64_t Index, } } +bool MachOObjectFile::isRelocatableObject() const { + return getHeader().filetype == MachO::MH_OBJECT; +} + ErrorOr> ObjectFile::createMachOObjectFile(std::unique_ptr &Buffer) { StringRef Magic = Buffer->getBuffer().slice(0, 4); diff --git a/test/Object/objdump-reloc-shared.test b/test/Object/objdump-reloc-shared.test new file mode 100644 index 00000000000..d899ffb6087 --- /dev/null +++ b/test/Object/objdump-reloc-shared.test @@ -0,0 +1,5 @@ +RUN: llvm-objdump -r %p/Inputs/elf-reloc-no-sym.x86_64 \ +RUN: | FileCheck %s + +; CHECK: elf-reloc-no-sym.x86_64: file format ELF64-x86-64 +; CHECK-NOT: {{.}} diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp index d7c9df1d6e7..791011ddefa 100644 --- a/tools/llvm-objdump/llvm-objdump.cpp +++ b/tools/llvm-objdump/llvm-objdump.cpp @@ -562,6 +562,11 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { static void PrintRelocations(const ObjectFile *Obj) { StringRef Fmt = Obj->getBytesInAddress() > 4 ? "%016" PRIx64 : "%08" PRIx64; + // Regular objdump doesn't print relocations in non-relocatable object + // files. + if (!Obj->isRelocatableObject()) + return; + for (const SectionRef &Section : Obj->sections()) { if (Section.relocation_begin() == Section.relocation_end()) continue; -- 2.34.1