From 7486d92a6c949a193bb75c0ffa0170eeb2fabb80 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Thu, 30 May 2013 03:05:14 +0000 Subject: Change how we iterate over relocations on ELF. For COFF and MachO, sections semantically have relocations that apply to them. That is not the case on ELF. In relocatable objects (.o), a section with relocations in ELF has offsets to another section where the relocations should be applied. In dynamic objects and executables, relocations don't have an offset, they have a virtual address. The section sh_info may or may not point to another section, but that is not actually used for resolving the relocations. This patch exposes that in the ObjectFile API. It has the following advantages: * Most (all?) clients can handle this more efficiently. They will normally walk all relocations, so doing an effort to iterate in a particular order doesn't save time. * llvm-readobj now prints relocations in the same way the native readelf does. * probably most important, relocations that don't point to any section are now visible. This is the case of relocations in the rela.dyn section. See the updated relocation-executable.test for example. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182908 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/ObjectFile.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'lib/Object/ObjectFile.cpp') diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 77fd995cf0..5b3165db94 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -33,6 +33,10 @@ error_code ObjectFile::getSymbolAlignment(DataRefImpl DRI, return object_error::success; } +section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { + return section_iterator(SectionRef(Sec, this)); +} + ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { if (!Object || Object->getBufferSize() < 64) return 0; -- cgit v1.2.3 From f12745f7a7e68c05c89ebd515b9b4faedce37dd0 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 10 Jun 2013 15:27:39 +0000 Subject: Pass a StringRef to sys::identifyFileType. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183669 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/ObjectFile.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'lib/Object/ObjectFile.cpp') diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index 5b3165db94..c64af84346 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -40,8 +40,7 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { if (!Object || Object->getBufferSize() < 64) return 0; - sys::LLVMFileType type = sys::IdentifyFileType(Object->getBufferStart(), - static_cast(Object->getBufferSize())); + sys::LLVMFileType type = sys::identifyFileType(Object->getBuffer()); switch (type) { case sys::Unknown_FileType: return 0; -- cgit v1.2.3 From d27a9785d5290a54b1400c85d70e92c2b6106098 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 11 Jun 2013 15:19:04 +0000 Subject: Convert another use of sys::identifyFileType. No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183747 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/ObjectFile.cpp | 51 ++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 25 deletions(-) (limited to 'lib/Object/ObjectFile.cpp') diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index c64af84346..b5f666f27f 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -14,8 +14,8 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/ADT/OwningPtr.h" #include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Path.h" #include "llvm/Support/system_error.h" using namespace llvm; @@ -40,31 +40,32 @@ section_iterator ObjectFile::getRelocatedSection(DataRefImpl Sec) const { ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { if (!Object || Object->getBufferSize() < 64) return 0; - sys::LLVMFileType type = sys::identifyFileType(Object->getBuffer()); - switch (type) { - case sys::Unknown_FileType: - return 0; - case sys::ELF_Relocatable_FileType: - case sys::ELF_Executable_FileType: - case sys::ELF_SharedObject_FileType: - case sys::ELF_Core_FileType: - return createELFObjectFile(Object); - case sys::Mach_O_Object_FileType: - case sys::Mach_O_Executable_FileType: - case sys::Mach_O_FixedVirtualMemorySharedLib_FileType: - case sys::Mach_O_Core_FileType: - case sys::Mach_O_PreloadExecutable_FileType: - case sys::Mach_O_DynamicallyLinkedSharedLib_FileType: - case sys::Mach_O_DynamicLinker_FileType: - case sys::Mach_O_Bundle_FileType: - case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType: - case sys::Mach_O_DSYMCompanion_FileType: - return createMachOObjectFile(Object); - case sys::COFF_FileType: - return createCOFFObjectFile(Object); - default: - llvm_unreachable("Unexpected Object File Type"); + + sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer()); + switch (Type) { + case sys::fs::file_magic::unknown: + return 0; + case sys::fs::file_magic::elf_relocatable: + case sys::fs::file_magic::elf_executable: + case sys::fs::file_magic::elf_shared_object: + case sys::fs::file_magic::elf_core: + return createELFObjectFile(Object); + case sys::fs::file_magic::macho_object: + case sys::fs::file_magic::macho_executable: + case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib: + case sys::fs::file_magic::macho_core: + case sys::fs::file_magic::macho_preload_executable: + case sys::fs::file_magic::macho_dynamically_linked_shared_lib: + case sys::fs::file_magic::macho_dynamic_linker: + case sys::fs::file_magic::macho_bundle: + case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub: + case sys::fs::file_magic::macho_dsym_companion: + return createMachOObjectFile(Object); + case sys::fs::file_magic::coff_object: + case sys::fs::file_magic::pecoff_executable: + return createCOFFObjectFile(Object); } + llvm_unreachable("Unexpected Object File Type"); } ObjectFile *ObjectFile::createObjectFile(StringRef ObjectPath) { -- cgit v1.2.3 From 4fbf6633024d40dcb7849f45db5a4d41b2a5b3f1 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Tue, 11 Jun 2013 15:29:10 +0000 Subject: Fix variable name style. Don't cast to and from int. This enables the compiler to see the enum and produce warnings about a switch not being fully covered. Fix one of these warnings. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@183749 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Object/ObjectFile.cpp | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib/Object/ObjectFile.cpp') diff --git a/lib/Object/ObjectFile.cpp b/lib/Object/ObjectFile.cpp index b5f666f27f..3ec29bf7e7 100644 --- a/lib/Object/ObjectFile.cpp +++ b/lib/Object/ObjectFile.cpp @@ -44,6 +44,8 @@ ObjectFile *ObjectFile::createObjectFile(MemoryBuffer *Object) { sys::fs::file_magic Type = sys::fs::identify_magic(Object->getBuffer()); switch (Type) { case sys::fs::file_magic::unknown: + case sys::fs::file_magic::bitcode: + case sys::fs::file_magic::archive: return 0; case sys::fs::file_magic::elf_relocatable: case sys::fs::file_magic::elf_executable: -- cgit v1.2.3