1ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===// 224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// The LLVM Compiler Infrastructure 424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source 624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details. 724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ObjectFileELF.h" 1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 12ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include <cassert> 1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <algorithm> 1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson#include "lldb/Core/ArchSpec.h" 1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/DataBuffer.h" 1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Error.h" 18ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#include "lldb/Core/FileSpecList.h" 192877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham#include "lldb/Core/Module.h" 2036b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton#include "lldb/Core/ModuleSpec.h" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/PluginManager.h" 2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Section.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "lldb/Core/Stream.h" 242877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham#include "lldb/Symbol/SymbolContext.h" 25940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton#include "lldb/Host/Host.h" 2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27ce477324f5175d409623856b1bde088f0109a535Stephen Wilson#include "llvm/ADT/PointerUnion.h" 28ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 29ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson#define CASE_AND_STREAM(s, def, width) \ 30ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson case def: s->Printf("%-*s", width, #def); break; 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 34ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonusing namespace elf; 35ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonusing namespace llvm::ELF; 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 37ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonnamespace { 38ce477324f5175d409623856b1bde088f0109a535Stephen Wilson//===----------------------------------------------------------------------===// 39ce477324f5175d409623856b1bde088f0109a535Stephen Wilson/// @class ELFRelocation 40ce477324f5175d409623856b1bde088f0109a535Stephen Wilson/// @brief Generic wrapper for ELFRel and ELFRela. 41ce477324f5175d409623856b1bde088f0109a535Stephen Wilson/// 42ce477324f5175d409623856b1bde088f0109a535Stephen Wilson/// This helper class allows us to parse both ELFRel and ELFRela relocation 43ce477324f5175d409623856b1bde088f0109a535Stephen Wilson/// entries in a generic manner. 44ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonclass ELFRelocation 45ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 46ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonpublic: 47ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 48ce477324f5175d409623856b1bde088f0109a535Stephen Wilson /// Constructs an ELFRelocation entry with a personality as given by @p 49ce477324f5175d409623856b1bde088f0109a535Stephen Wilson /// type. 50ce477324f5175d409623856b1bde088f0109a535Stephen Wilson /// 51ce477324f5175d409623856b1bde088f0109a535Stephen Wilson /// @param type Either DT_REL or DT_RELA. Any other value is invalid. 52ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ELFRelocation(unsigned type); 53ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 54ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ~ELFRelocation(); 55ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 56ce477324f5175d409623856b1bde088f0109a535Stephen Wilson bool 5736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset); 58ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 59ce477324f5175d409623856b1bde088f0109a535Stephen Wilson static unsigned 60ce477324f5175d409623856b1bde088f0109a535Stephen Wilson RelocType32(const ELFRelocation &rel); 61ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 62ce477324f5175d409623856b1bde088f0109a535Stephen Wilson static unsigned 63ce477324f5175d409623856b1bde088f0109a535Stephen Wilson RelocType64(const ELFRelocation &rel); 64ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 65ce477324f5175d409623856b1bde088f0109a535Stephen Wilson static unsigned 66ce477324f5175d409623856b1bde088f0109a535Stephen Wilson RelocSymbol32(const ELFRelocation &rel); 67ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 68ce477324f5175d409623856b1bde088f0109a535Stephen Wilson static unsigned 69ce477324f5175d409623856b1bde088f0109a535Stephen Wilson RelocSymbol64(const ELFRelocation &rel); 70ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 71ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonprivate: 72ce477324f5175d409623856b1bde088f0109a535Stephen Wilson typedef llvm::PointerUnion<ELFRel*, ELFRela*> RelocUnion; 73ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 74ce477324f5175d409623856b1bde088f0109a535Stephen Wilson RelocUnion reloc; 75ce477324f5175d409623856b1bde088f0109a535Stephen Wilson}; 76ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 77ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::ELFRelocation(unsigned type) 78ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 79ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (type == DT_REL) 80ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc = new ELFRel(); 81ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else if (type == DT_RELA) 82ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc = new ELFRela(); 83ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else { 84ce477324f5175d409623856b1bde088f0109a535Stephen Wilson assert(false && "unexpected relocation type"); 85ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc = static_cast<ELFRel*>(NULL); 86ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 87ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 88ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 89ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::~ELFRelocation() 90ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 91ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (reloc.is<ELFRel*>()) 92ce477324f5175d409623856b1bde088f0109a535Stephen Wilson delete reloc.get<ELFRel*>(); 93ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 94ce477324f5175d409623856b1bde088f0109a535Stephen Wilson delete reloc.get<ELFRela*>(); 95ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 96ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 97ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonbool 9836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonELFRelocation::Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset) 99ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 100ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (reloc.is<ELFRel*>()) 101ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return reloc.get<ELFRel*>()->Parse(data, offset); 102ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 103ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return reloc.get<ELFRela*>()->Parse(data, offset); 104ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 105ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 106ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 107ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::RelocType32(const ELFRelocation &rel) 108ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 109ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (rel.reloc.is<ELFRel*>()) 110ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRel::RelocType32(*rel.reloc.get<ELFRel*>()); 111ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 112ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRela::RelocType32(*rel.reloc.get<ELFRela*>()); 113ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 114ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 115ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 116ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::RelocType64(const ELFRelocation &rel) 117ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 118ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (rel.reloc.is<ELFRel*>()) 119ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRel::RelocType64(*rel.reloc.get<ELFRel*>()); 120ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 121ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRela::RelocType64(*rel.reloc.get<ELFRela*>()); 122ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 123ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 124ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 125ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::RelocSymbol32(const ELFRelocation &rel) 126ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 127ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (rel.reloc.is<ELFRel*>()) 128ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel*>()); 129ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 130ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela*>()); 131ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 132ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 133ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 134ce477324f5175d409623856b1bde088f0109a535Stephen WilsonELFRelocation::RelocSymbol64(const ELFRelocation &rel) 135ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 136ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (rel.reloc.is<ELFRel*>()) 137ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel*>()); 138ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 139ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela*>()); 140ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 141ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 142ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} // end anonymous namespace 143ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 144ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 145ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// Static methods. 146ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 14724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 14824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::Initialize() 14924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 150ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson PluginManager::RegisterPlugin(GetPluginNameStatic(), 151ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson GetPluginDescriptionStatic(), 152b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton CreateInstance, 15336b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton CreateMemoryInstance, 15436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton GetModuleSpecifications); 15524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 15624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 15724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 15824943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::Terminate() 15924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 160ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson PluginManager::UnregisterPlugin(CreateInstance); 16124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1630e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 16424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::GetPluginNameStatic() 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1660e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_name("elf"); 1670e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_name; 16824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 16924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerconst char * 17124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::GetPluginDescriptionStatic() 17224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 173ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return "ELF object file reader."; 17424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 17524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFile * 1773508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileELF::CreateInstance (const lldb::ModuleSP &module_sp, 1783508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton DataBufferSP &data_sp, 179cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 180cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const lldb_private::FileSpec* file, 181cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 182cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length) 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 184cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (!data_sp) 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = file->MemoryMapFileContents(file_offset, length); 187cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_offset = 0; 188cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton } 189cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton 190cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) 191cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton { 192cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton const uint8_t *magic = data_sp->GetBytes() + data_offset; 193ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (ELFHeader::MagicBytesMatch(magic)) 194ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 195cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton // Update the data to contain the entire file if it doesn't already 196b7e922a68768c9002c4155cf910d0f683c24692aAndrew Kaylor if (data_sp->GetByteSize() < length) { 197cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton data_sp = file->MemoryMapFileContents(file_offset, length); 19888d0ca9d0196e46494cd73439bd685571d31322dGreg Clayton data_offset = 0; 19988d0ca9d0196e46494cd73439bd685571d31322dGreg Clayton magic = data_sp->GetBytes(); 200b7e922a68768c9002c4155cf910d0f683c24692aAndrew Kaylor } 201ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson unsigned address_size = ELFHeader::AddressSizeInBytes(magic); 202ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (address_size == 4 || address_size == 8) 203ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 204102b2c2681c9a830afe25bfea35557421905e42cGreg Clayton std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(module_sp, data_sp, data_offset, file, file_offset, length)); 205f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson ArchSpec spec; 206f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson if (objfile_ap->GetArchitecture(spec) && 207f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson objfile_ap->SetModulesArchitecture(spec)) 208ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return objfile_ap.release(); 209ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 210ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 21124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 21224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return NULL; 21324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 21424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 215f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson 216b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg ClaytonObjectFile* 2173508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileELF::CreateMemoryInstance (const lldb::ModuleSP &module_sp, 2183508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton DataBufferSP& data_sp, 2193508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const lldb::ProcessSP &process_sp, 2203508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton lldb::addr_t header_addr) 221b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton{ 222b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton return NULL; 223b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton} 224b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 225535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartainbool 226535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael SartainObjectFileELF::MagicBytesMatch (DataBufferSP& data_sp, 227535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain lldb::addr_t data_offset, 228535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain lldb::addr_t data_length) 229535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain{ 230535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) 231535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 232535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain const uint8_t *magic = data_sp->GetBytes() + data_offset; 233535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain return ELFHeader::MagicBytesMatch(magic); 234535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 235535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain return false; 236535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain} 237b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton 2384fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain/* 2394fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c 2404fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain * 2414fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or 2424fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain * code or tables extracted from it, as desired without restriction. 2434fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain */ 2444fa5470e29c0f044af634dbda00a461c211ca964Michael Sartainstatic uint32_t 2454fa5470e29c0f044af634dbda00a461c211ca964Michael Sartaincalc_gnu_debuglink_crc32(const void *buf, size_t size) 2464fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain{ 2474fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain static const uint32_t g_crc32_tab[] = 2484fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain { 2494fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, 2504fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, 2514fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, 2524fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 2534fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, 2544fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, 2554fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, 2564fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 2574fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 2584fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, 2594fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, 2604fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, 2614fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 2624fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 2634fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, 2644fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, 2654fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, 2664fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, 2674fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 2684fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, 2694fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, 2704fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, 2714fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, 2724fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 2734fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, 2744fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, 2754fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, 2764fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 2774fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 2784fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, 2794fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, 2804fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, 2814fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, 2824fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 2834fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, 2844fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, 2854fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, 2864fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 2874fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 2884fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, 2894fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, 2904fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, 2914fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 2924fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain }; 2934fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain const uint8_t *p = (const uint8_t *)buf; 2944fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain uint32_t crc; 2954fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 2964fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain crc = ~0U; 2974fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain while (size--) 2984fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8); 2994fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain return crc ^ ~0U; 3004fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain} 3014fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 30236b877d2d27f7d1890f2d13807a3addb216648e2Greg Claytonsize_t 30336b877d2d27f7d1890f2d13807a3addb216648e2Greg ClaytonObjectFileELF::GetModuleSpecifications (const lldb_private::FileSpec& file, 30436b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::DataBufferSP& data_sp, 30536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t data_offset, 30636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t file_offset, 30736b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb::offset_t length, 30836b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton lldb_private::ModuleSpecList &specs) 30936b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton{ 310535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain const size_t initial_count = specs.GetSize(); 3110be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain 312535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) 313535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 314535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain DataExtractor data; 315535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain data.SetData(data_sp); 316535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain elf::ELFHeader header; 317535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (header.Parse(data, &data_offset)) 318535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 319535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (data_sp) 320535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 321535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain ModuleSpec spec; 322535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain spec.GetFileSpec() = file; 323535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain spec.GetArchitecture().SetArchitecture(eArchTypeELF, 324535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain header.e_machine, 325535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain LLDB_INVALID_CPUTYPE); 326535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain if (spec.GetArchitecture().IsValid()) 327535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain { 3280be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain // We could parse the ABI tag information (in .note, .notes, or .note.ABI-tag) to get the 329a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // machine information. However, this info isn't guaranteed to exist or be correct. Details: 3300be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain // http://refspecs.linuxfoundation.org/LSB_1.2.0/gLSB/noteabitag.html 3310be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain // Instead of passing potentially incorrect information down the pipeline, grab 3320be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain // the host information and use it. 3330be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain spec.GetArchitecture().GetTriple().setOSName (Host::GetOSString().GetCString()); 3340be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain spec.GetArchitecture().GetTriple().setVendorName(Host::GetVendorString().GetCString()); 335a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 336a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Try to get the UUID from the section list. Usually that's at the end, so 337a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // map the file in if we don't have it already. 338a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain size_t section_header_end = header.e_shoff + header.e_shnum * header.e_shentsize; 339a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_header_end > data_sp->GetByteSize()) 340a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 341a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain data_sp = file.MemoryMapFileContents (file_offset, section_header_end); 342a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain data.SetData(data_sp); 343a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 344a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 3454fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain uint32_t gnu_debuglink_crc = 0; 346a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain std::string gnu_debuglink_file; 347a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain SectionHeaderColl section_headers; 3484fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain lldb_private::UUID &uuid = spec.GetUUID(); 3494fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain GetSectionHeaderInfo(section_headers, data, header, uuid, gnu_debuglink_file, gnu_debuglink_crc); 3504fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain 3514fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain if (!uuid.IsValid()) 3524fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain { 3534fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain if (!gnu_debuglink_crc) 3544fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain { 3554fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain // Need to map entire file into memory to calculate the crc. 3564fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain data_sp = file.MemoryMapFileContents (file_offset, SIZE_MAX); 3574fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain data.SetData(data_sp); 3584fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain gnu_debuglink_crc = calc_gnu_debuglink_crc32 (data.GetDataStart(), data.GetByteSize()); 3594fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain } 3604fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain if (gnu_debuglink_crc) 3614fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain { 3624fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain // Use 4 bytes of crc from the .gnu_debuglink section. 3634fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain uint32_t uuidt[4] = { gnu_debuglink_crc, 0, 0, 0 }; 3644fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain uuid.SetBytes (uuidt, sizeof(uuidt)); 3654fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain } 3664fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain } 367a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 368535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain specs.Append(spec); 369535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 370535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 371535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 372535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain } 3730be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain 374535df0cfa77054c4bd28d0040441ac1a05e7d1a0Michael Sartain return specs.GetSize() - initial_count; 37536b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton} 37636b877d2d27f7d1890f2d13807a3addb216648e2Greg Clayton 377ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 378ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// PluginInterface protocol 379ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 3800e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 381ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::GetPluginName() 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 383ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return GetPluginNameStatic(); 384ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 385ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 386ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonuint32_t 387ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::GetPluginVersion() 388ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 389ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return m_plugin_version; 390ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 391ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 392ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ObjectFile protocol 393ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//------------------------------------------------------------------ 39424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3953508c387c3f0c9ecc439d98048fd7694d41bab1bGreg ClaytonObjectFileELF::ObjectFileELF (const lldb::ModuleSP &module_sp, 396cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton DataBufferSP& data_sp, 397cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t data_offset, 3983508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const FileSpec* file, 399cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t file_offset, 400cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton lldb::offset_t length) : 401cbe61bd26db663fa3036866dc33315c6ffc37910Greg Clayton ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset), 4023508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_header(), 4033508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_program_headers(), 4043508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton m_section_headers(), 405a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_filespec_ap() 40624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 40724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (file) 40824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_file = *file; 409ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ::memset(&m_header, 0, sizeof(m_header)); 410a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_gnu_debuglink_crc = 0; 411a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain m_gnu_debuglink_file.clear(); 41224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 41424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::~ObjectFileELF() 41524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 41624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 41724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 4187508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Inghambool 4197508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim InghamObjectFileELF::IsExecutable() const 4207508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham{ 42190987395d3649450dfad93b5d2776974e5adab7fStephen Wilson return m_header.e_entry != 0; 4227508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham} 4237508e732818c32e1cfeaaf7d1d507fe3834ce9d2Jim Ingham 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerByteOrder 425ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::GetByteOrder() const 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_header.e_ident[EI_DATA] == ELFDATA2MSB) 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eByteOrderBig; 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_header.e_ident[EI_DATA] == ELFDATA2LSB) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eByteOrderLittle; 43124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return eByteOrderInvalid; 43224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 43436da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonuint32_t 435ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::GetAddressByteSize() const 43624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 43724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_data.GetAddressByteSize(); 43824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 43924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 441ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) 44224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 44336da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton return std::distance(m_section_headers.begin(), I) + 1u; 444ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 44524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 44636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Claytonsize_t 447ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const 448ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 44936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton return std::distance(m_section_headers.begin(), I) + 1u; 450ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 45124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 452ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonbool 453ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::ParseHeader() 454ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 455f043618acf59de1f269f0b9f29e980fb9000f1f9Filipe Cabecinhas lldb::offset_t offset = 0; 456ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return m_header.Parse(m_data, &offset); 45724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 45824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 45924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 4600467c78e9a75eff9ec33d3c1f39fa83e1c5d9241Greg ClaytonObjectFileELF::GetUUID(lldb_private::UUID* uuid) 46124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 462a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Need to parse the section list to get the UUIDs, so make sure that's been done. 463a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!ParseSectionHeaders()) 464a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return false; 465a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 4660be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain if (m_uuid.IsValid()) 4670be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain { 468a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // We have the full build id uuid. 4690be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain *uuid = m_uuid; 4700be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain return true; 4710be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain } 472a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain else 473a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 4744fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain if (!m_gnu_debuglink_crc) 4754fa5470e29c0f044af634dbda00a461c211ca964Michael Sartain m_gnu_debuglink_crc = calc_gnu_debuglink_crc32 (m_data.GetDataStart(), m_data.GetByteSize()); 476a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (m_gnu_debuglink_crc) 477a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 478a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Use 4 bytes of crc from the .gnu_debuglink section. 479a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint32_t uuidt[4] = { m_gnu_debuglink_crc, 0, 0, 0 }; 480a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uuid->SetBytes (uuidt, sizeof(uuidt)); 481a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return true; 482a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 483a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 484a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 48524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 488a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartainlldb_private::FileSpecList 489a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainObjectFileELF::GetDebugSymbolFilePaths() 490a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain{ 491a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpecList file_spec_list; 492a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 493a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!m_gnu_debuglink_file.empty()) 494a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 495a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain FileSpec file_spec (m_gnu_debuglink_file.c_str(), false); 496a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain file_spec_list.Append (file_spec); 497a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 498a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return file_spec_list; 499a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain} 500a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 50124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 502ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::GetDependentModules(FileSpecList &files) 50324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 504ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson size_t num_modules = ParseDependentModules(); 505ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t num_specs = 0; 506ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 507ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (unsigned i = 0; i < num_modules; ++i) 508ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 509ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i))) 510ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson num_specs++; 511ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 512ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 513ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return num_specs; 514ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 515ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 516ce477324f5175d409623856b1bde088f0109a535Stephen WilsonAddress 517ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::GetImageInfoAddress() 518ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 519ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!ParseDynamicSymbols()) 520f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson return Address(); 521f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson 522f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson SectionList *section_list = GetSectionList(); 523f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson if (!section_list) 524f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson return Address(); 525f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson 5267940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Find the SHT_DYNAMIC (.dynamic) section. 5277940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionSP dynsym_section_sp (section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true)); 5287940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!dynsym_section_sp) 529ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return Address(); 5307940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert (dynsym_section_sp->GetObjectFile() == this); 531ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 5327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton user_id_t dynsym_id = dynsym_section_sp->GetID(); 533a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id); 534ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!dynsym_hdr) 535ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return Address(); 536ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 5377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) 538f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson { 5397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ELFDynamic &symbol = m_dynamic_symbols[i]; 5403508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton 5417940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (symbol.d_tag == DT_DEBUG) 5427940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 5437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Compute the offset as the number of previous entries plus the 5447940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // size of d_tag. 5457940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize(); 5467940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return Address(dynsym_section_sp, offset); 547f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson } 548f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson } 549f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson 550f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson return Address(); 551f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson} 552f2ad3259066acd7e365dbe014de2f039f771fca3Stephen Wilson 5532877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Inghamlldb_private::Address 5542877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim InghamObjectFileELF::GetEntryPointAddress () 5552877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham{ 556791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson if (m_entry_point_address.IsValid()) 5572877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham return m_entry_point_address; 558791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson 559791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson if (!ParseHeader() || !IsExecutable()) 5602877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham return m_entry_point_address; 5612877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham 5627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = GetSectionList(); 5637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton addr_t offset = m_header.e_entry; 564791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson 5657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!section_list) 566791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson m_entry_point_address.SetOffset(offset); 5677940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton else 5687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list); 569791af3bfcea2942267e92b4dfa1cdd0e44c7f3caStephen Wilson return m_entry_point_address; 5702877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham} 5712877594f4442cfc4d0ed2abd30af6b8027a84fc1Jim Ingham 572ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//---------------------------------------------------------------------- 573ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ParseDependentModules 574ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson//---------------------------------------------------------------------- 575ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonsize_t 576ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::ParseDependentModules() 577ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 578ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (m_filespec_ap.get()) 579ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return m_filespec_ap->GetSize(); 580ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 581ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson m_filespec_ap.reset(new FileSpecList()); 582ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 583a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!ParseSectionHeaders()) 584ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 585ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 586ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson SectionList *section_list = GetSectionList(); 587ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (!section_list) 588ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 589ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 5907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Find the SHT_DYNAMIC section. 5917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get(); 5927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!dynsym) 5937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return 0; 5947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert (dynsym->GetObjectFile() == this); 5957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 5967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex (dynsym->GetID()); 5977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!header) 5987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return 0; 5997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // sh_link: section header index of string table used by entries in the section. 6007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Section *dynstr = section_list->FindSectionByID (header->sh_link + 1).get(); 6017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!dynstr) 602ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 603ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 604ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson DataExtractor dynsym_data; 605ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson DataExtractor dynstr_data; 606b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (ReadSectionData(dynsym, dynsym_data) && 607b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ReadSectionData(dynstr, dynstr_data)) 608ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 609ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFDynamic symbol; 61036da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const lldb::offset_t section_size = dynsym_data.GetByteSize(); 61136da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 612ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 613ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson // The only type of entries we are concerned with are tagged DT_NEEDED, 614ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson // yielding the name of a required library. 615ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson while (offset < section_size) 616ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 617ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (!symbol.Parse(dynsym_data, &offset)) 618ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson break; 619ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 620ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (symbol.d_tag != DT_NEEDED) 621ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson continue; 622ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 623ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t str_index = static_cast<uint32_t>(symbol.d_val); 624ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson const char *lib_name = dynstr_data.PeekCStr(str_index); 625537a7a86687683fd403ce652d178fbc89e06ef9fGreg Clayton m_filespec_ap->Append(FileSpec(lib_name, true)); 626ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 627ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 628ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 629ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return m_filespec_ap->GetSize(); 63024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 63124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 63224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 63324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// ParseProgramHeaders 63424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 63524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 63624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::ParseProgramHeaders() 63724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 63824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have already parsed the program headers 63924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (!m_program_headers.empty()) 64024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_program_headers.size(); 64124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 642ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson // If there are no program headers to read we are done. 643ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (m_header.e_phnum == 0) 644ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 64524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 646ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson m_program_headers.resize(m_header.e_phnum); 647ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (m_program_headers.size() != m_header.e_phnum) 648ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 64924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 650ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson const size_t ph_size = m_header.e_phnum * m_header.e_phentsize; 651db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton const elf_off ph_offset = m_header.e_phoff; 652db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton DataExtractor data; 653db2dc2b824b61ef7578dc8cdad7b338aa82b1f17Greg Clayton if (GetData (ph_offset, ph_size, data) != ph_size) 654ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 65524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 656ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t idx; 65736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset; 658ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (idx = 0, offset = 0; idx < m_header.e_phnum; ++idx) 659ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 660ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (m_program_headers[idx].Parse(data, &offset) == false) 661ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson break; 66224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 66324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 664ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (idx < m_program_headers.size()) 665ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson m_program_headers.resize(idx); 666ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 66724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_program_headers.size(); 66824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 66924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 670a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartainstatic bool 671a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainParseNoteGNUBuildID(DataExtractor &data, lldb_private::UUID &uuid) 672a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain{ 673a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Try to parse the note section (ie .note.gnu.build-id|.notes|.note|...) and get the build id. 674a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // BuildID documentation: https://fedoraproject.org/wiki/Releases/FeatureBuildId 675a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain struct 676a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 677a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint32_t name_len; // Length of note name 678a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint32_t desc_len; // Length of note descriptor 679a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint32_t type; // Type of note (1 is ABI_TAG, 3 is BUILD_ID) 680a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } notehdr; 681a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb::offset_t offset = 0; 682a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain static const uint32_t g_gnu_build_id = 3; // NT_GNU_BUILD_ID from elf.h 683a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 684a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain while (true) 685a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 686a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (data.GetU32 (&offset, ¬ehdr, 3) == NULL) 687a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return false; 688a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 689a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain notehdr.name_len = llvm::RoundUpToAlignment (notehdr.name_len, 4); 690a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain notehdr.desc_len = llvm::RoundUpToAlignment (notehdr.desc_len, 4); 691a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 692a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb::offset_t offset_next_note = offset + notehdr.name_len + notehdr.desc_len; 693a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 694a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // 16 bytes is UUID|MD5, 20 bytes is SHA1 695a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if ((notehdr.type == g_gnu_build_id) && (notehdr.name_len == 4) && 696a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain (notehdr.desc_len == 16 || notehdr.desc_len == 20)) 697a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 698a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain char name[4]; 699a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (data.GetU8 (&offset, name, 4) == NULL) 700a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return false; 701a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!strcmp(name, "GNU")) 702a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 703a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint8_t uuidbuf[20]; 704a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (data.GetU8 (&offset, &uuidbuf, notehdr.desc_len) == NULL) 705a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return false; 706a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uuid.SetBytes (uuidbuf, notehdr.desc_len); 707a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return true; 708a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 709a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 710a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain offset = offset_next_note; 711a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 712a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return false; 713a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain} 714a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 71524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 716a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain// GetSectionHeaderInfo 71724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 71824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 719a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl §ion_headers, 720a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb_private::DataExtractor &object_data, 721a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const elf::ELFHeader &header, 722a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb_private::UUID &uuid, 723a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain std::string &gnu_debuglink_file, 724a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain uint32_t &gnu_debuglink_crc) 72524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 72624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We have already parsed the section headers 727a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!section_headers.empty()) 728a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return section_headers.size(); 72924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 730ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson // If there are no section headers we are done. 731a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (header.e_shnum == 0) 732ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 73324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 734a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_headers.resize(header.e_shnum); 735a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_headers.size() != header.e_shnum) 736ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 73724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 738a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const size_t sh_size = header.e_shnum * header.e_shentsize; 739a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const elf_off sh_offset = header.e_shoff; 740a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DataExtractor sh_data; 741a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (sh_data.SetData (object_data, sh_offset, sh_size) != sh_size) 742ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return 0; 74324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 744ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t idx; 74536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset; 746a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) 747ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 748a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_headers[idx].Parse(sh_data, &offset) == false) 749ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson break; 75024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 751a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (idx < section_headers.size()) 752a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_headers.resize(idx); 75324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 754a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const unsigned strtab_idx = header.e_shstrndx; 755a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (strtab_idx && strtab_idx < section_headers.size()) 75624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 757a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx]; 758a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const size_t byte_size = sheader.sh_size; 759a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const Elf64_Off offset = sheader.sh_offset; 760a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb_private::DataExtractor shstr_data; 761ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 762a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (shstr_data.SetData (object_data, offset, byte_size) == byte_size) 76324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 764a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain for (SectionHeaderCollIter I = section_headers.begin(); 765a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain I != section_headers.end(); ++I) 766a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 767a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain static ConstString g_sect_name_gnu_debuglink (".gnu_debuglink"); 768a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo &header = *I; 769a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const uint64_t section_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 770a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ConstString name(shstr_data.PeekCStr(I->sh_name)); 771a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 772a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain I->section_name = name; 77324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 774a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (name == g_sect_name_gnu_debuglink) 775a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 776a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DataExtractor data; 777a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) 778a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 779a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain lldb::offset_t gnu_debuglink_offset = 0; 780a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain gnu_debuglink_file = data.GetCStr (&gnu_debuglink_offset); 781a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain gnu_debuglink_offset = llvm::RoundUpToAlignment (gnu_debuglink_offset, 4); 782a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain data.GetU32 (&gnu_debuglink_offset, &gnu_debuglink_crc, 1); 783a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 784a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 785a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 786a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (header.sh_type == SHT_NOTE && !uuid.IsValid()) 787a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 788a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain DataExtractor data; 789a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_size && (data.SetData (object_data, header.sh_offset, section_size) == section_size)) 790a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 791a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ParseNoteGNUBuildID (data, uuid); 792a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 793a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 794a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 795a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 796a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return section_headers.size(); 79724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 79824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 799a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 800a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain section_headers.clear(); 801a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return 0; 802a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain} 803a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 804513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthisize_t 805513ca6036e91258b84fc38d703ae611b250ed868Ashok ThirumurthiObjectFileELF::GetProgramHeaderCount() 806513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi{ 807513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return ParseProgramHeaders(); 808513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi} 809513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi 810513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthiconst elf::ELFProgramHeader * 811513ca6036e91258b84fc38d703ae611b250ed868Ashok ThirumurthiObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id) 812513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi{ 813513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi if (!id || !ParseProgramHeaders()) 814513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return NULL; 815513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi 816513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi if (--id < m_program_headers.size()) 817513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return &m_program_headers[id]; 818513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi 819513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return NULL; 820513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi} 821513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi 822513ca6036e91258b84fc38d703ae611b250ed868Ashok ThirumurthiDataExtractor 823513ca6036e91258b84fc38d703ae611b250ed868Ashok ThirumurthiObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) 824513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi{ 825513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id); 826513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi if (segment_header == NULL) 827513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return DataExtractor(); 828513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi return DataExtractor(m_data, segment_header->p_offset, segment_header->p_filesz); 829513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi} 830513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi 831a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain//---------------------------------------------------------------------- 832a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain// ParseSectionHeaders 833a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain//---------------------------------------------------------------------- 834a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartainsize_t 835a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainObjectFileELF::ParseSectionHeaders() 836a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain{ 837a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc); 83824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 83924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 840a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartainconst ObjectFileELF::ELFSectionHeaderInfo * 841ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) 842ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 843513ca6036e91258b84fc38d703ae611b250ed868Ashok Thirumurthi if (!id || !ParseSectionHeaders()) 844ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return NULL; 845ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 846ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (--id < m_section_headers.size()) 847ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return &m_section_headers[id]; 848ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 849ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return NULL; 850ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 851ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 8527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonvoid 8537940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileELF::CreateSections(SectionList &unified_section_list) 85424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!m_sections_ap.get() && ParseSectionHeaders()) 85624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 85724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_sections_ap.reset(new SectionList()); 85824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 859ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (SectionHeaderCollIter I = m_section_headers.begin(); 860ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson I != m_section_headers.end(); ++I) 861ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 862a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo &header = *I; 863ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 864a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ConstString& name = I->section_name; 86523d90aea32663f114ffee323775b02dad09f2f18Greg Clayton const uint64_t file_size = header.sh_type == SHT_NOBITS ? 0 : header.sh_size; 86623d90aea32663f114ffee323775b02dad09f2f18Greg Clayton const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0; 867ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 86832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_text (".text"); 86932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_data (".data"); 87032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_bss (".bss"); 8719ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton static ConstString g_sect_name_tdata (".tdata"); 8729ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton static ConstString g_sect_name_tbss (".tbss"); 87332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_abbrev (".debug_abbrev"); 87432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_aranges (".debug_aranges"); 87532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_frame (".debug_frame"); 87632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_info (".debug_info"); 87732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_line (".debug_line"); 87832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_loc (".debug_loc"); 87932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_macinfo (".debug_macinfo"); 88032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_pubnames (".debug_pubnames"); 88132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_pubtypes (".debug_pubtypes"); 88232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_ranges (".debug_ranges"); 88332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_dwarf_debug_str (".debug_str"); 88432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton static ConstString g_sect_name_eh_frame (".eh_frame"); 88532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton 88632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton SectionType sect_type = eSectionTypeOther; 88732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton 8889ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton bool is_thread_specific = false; 889a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 89032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton if (name == g_sect_name_text) sect_type = eSectionTypeCode; 89132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_data) sect_type = eSectionTypeData; 89232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_bss) sect_type = eSectionTypeZeroFill; 8939ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton else if (name == g_sect_name_tdata) 8949ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton { 8959ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton sect_type = eSectionTypeData; 8969ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton is_thread_specific = true; 8979ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton } 8989ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton else if (name == g_sect_name_tbss) 8999ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton { 9009ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton sect_type = eSectionTypeZeroFill; 9019ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton is_thread_specific = true; 9029ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton } 903a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_abbrev – Abbreviations used in the .debug_info section 904a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_aranges – Lookup table for mapping addresses to compilation units 905a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_frame – Call frame information 906a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_info – The core DWARF information section 907a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_line – Line number information 908a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_loc – Location lists used in DW_AT_location attributes 909a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_macinfo – Macro information 910a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_pubnames – Lookup table for mapping object and function names to compilation units 911a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_pubtypes – Lookup table for mapping type names to compilation units 912a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_ranges – Address ranges used in DW_AT_ranges attributes 913a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // .debug_str – String table used in .debug_info 9140bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section, http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html 9150bbfea68d47cc401b6f8309acc788d8224401ed6Michael Sartain // MISSING? .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644 916a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // MISSING? .debug_types - Type descriptions from DWARF 4? See http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo 91732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_abbrev) sect_type = eSectionTypeDWARFDebugAbbrev; 91832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_aranges) sect_type = eSectionTypeDWARFDebugAranges; 91932a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_frame) sect_type = eSectionTypeDWARFDebugFrame; 92032a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_info) sect_type = eSectionTypeDWARFDebugInfo; 92132a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_line) sect_type = eSectionTypeDWARFDebugLine; 92232a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_loc) sect_type = eSectionTypeDWARFDebugLoc; 92332a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_macinfo) sect_type = eSectionTypeDWARFDebugMacInfo; 92432a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_pubnames) sect_type = eSectionTypeDWARFDebugPubNames; 92532a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_pubtypes) sect_type = eSectionTypeDWARFDebugPubTypes; 92632a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_ranges) sect_type = eSectionTypeDWARFDebugRanges; 92732a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_dwarf_debug_str) sect_type = eSectionTypeDWARFDebugStr; 92832a8c7e02b84fbc36ee0fdb553002a1880c8d83eGreg Clayton else if (name == g_sect_name_eh_frame) sect_type = eSectionTypeEHFrame; 929a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 930a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain switch (header.sh_type) 9310be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain { 932a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case SHT_SYMTAB: 933a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain assert (sect_type == eSectionTypeOther); 934a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain sect_type = eSectionTypeELFSymbolTable; 935a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain break; 936a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case SHT_DYNSYM: 937a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain assert (sect_type == eSectionTypeOther); 938a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain sect_type = eSectionTypeELFDynamicSymbols; 939a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain break; 940a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case SHT_RELA: 941a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case SHT_REL: 942a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain assert (sect_type == eSectionTypeOther); 943a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain sect_type = eSectionTypeELFRelocationEntries; 944a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain break; 945a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain case SHT_DYNAMIC: 946a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain assert (sect_type == eSectionTypeOther); 947a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain sect_type = eSectionTypeELFDynamicLinkInfo; 948a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain break; 9490be9b3b58e6ba0929b325c4520d388aafed5891fMichael Sartain } 950a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 9517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionSP section_sp (new Section(GetModule(), // Module to which this section belongs. 9527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton this, // ObjectFile to which this section belongs and should read section data from. 9537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionIndex(I), // Section ID. 9547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton name, // Section name. 9557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton sect_type, // Section type. 9567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton header.sh_addr, // VM address. 9577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton vm_size, // VM size in bytes of this section. 9587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton header.sh_offset, // Offset of this section in the file. 9597940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton file_size, // Size of the section as found in the file. 9607940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton header.sh_flags)); // Flags for this section. 961ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 9629ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton if (is_thread_specific) 9639ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton section_sp->SetIsThreadSpecific (is_thread_specific); 9649ab696e40530fa966e08cab7af77ea62e4fff1c0Greg Clayton m_sections_ap->AddSection(section_sp); 96524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 96624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 967ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 9687940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (m_sections_ap.get()) 9697940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 9707940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (GetType() == eTypeDebugInfo) 9717940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 9727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton static const SectionType g_sections[] = 9737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 9747940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugAranges, 9757940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugInfo, 9767940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugAbbrev, 9777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugFrame, 9787940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugLine, 9797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugStr, 9807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugLoc, 9817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugMacInfo, 9827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugPubNames, 9837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugPubTypes, 9847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeDWARFDebugRanges, 9857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton eSectionTypeELFSymbolTable, 9867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton }; 9877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *elf_section_list = m_sections_ap.get(); 9887940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]); ++idx) 9897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 9907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionType section_type = g_sections[idx]; 9917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionSP section_sp (elf_section_list->FindSectionByType (section_type, true)); 9927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (section_sp) 9937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 9947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionSP module_section_sp (unified_section_list.FindSectionByType (section_type, true)); 9957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_section_sp) 9967940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton unified_section_list.ReplaceSection (module_section_sp->GetID(), section_sp); 9977940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton else 9987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton unified_section_list.AddSection (section_sp); 9997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 10007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 10017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 10027940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton else 10037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 10047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton unified_section_list = *m_sections_ap; 10057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 10067940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 100724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 100824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton// private 1010a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartainunsigned 10117940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileELF::ParseSymbols (Symtab *symtab, 10127940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton user_id_t start_id, 10137940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list, 10147940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const size_t num_symbols, 10157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const DataExtractor &symtab_data, 10167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const DataExtractor &strtab_data) 101724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1018ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ELFSymbol symbol; 101936da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 1020ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 102124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString text_section_name(".text"); 102224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString init_section_name(".init"); 102324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString fini_section_name(".fini"); 102424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString ctors_section_name(".ctors"); 102524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString dtors_section_name(".dtors"); 102624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 102724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString data_section_name(".data"); 102824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString rodata_section_name(".rodata"); 102924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString rodata1_section_name(".rodata1"); 103024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString data2_section_name(".data1"); 103124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString bss_section_name(".bss"); 103224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1033f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton //StreamFile strm(stdout, false); 1034ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned i; 1035ce477324f5175d409623856b1bde088f0109a535Stephen Wilson for (i = 0; i < num_symbols; ++i) 103624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1037ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (symbol.Parse(symtab_data, &offset) == false) 103824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 1039f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 1040f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 1041f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 1042f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton // No need to add symbols that have no names 1043f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton if (symbol_name == NULL || symbol_name[0] == '\0') 1044f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton continue; 1045f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton 1046f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton //symbol.Dump (&strm, i, &strtab_data, section_list); 104724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10483508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP symbol_section_sp; 104924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SymbolType symbol_type = eSymbolTypeInvalid; 1050ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson Elf64_Half symbol_idx = symbol.st_shndx; 105124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1052ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson switch (symbol_idx) 105324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 105424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case SHN_ABS: 105524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type = eSymbolTypeAbsolute; 105624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 105724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case SHN_UNDEF: 105824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type = eSymbolTypeUndefined; 105924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 106024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 10613508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_section_sp = section_list->GetSectionAtIndex(symbol_idx); 106224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 106324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 106424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1065092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // If a symbol is undefined do not process it further even if it has a STT type 1066092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec if (symbol_type != eSymbolTypeUndefined) 106724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1068092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec switch (symbol.getType()) 1069092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec { 1070092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec default: 1071092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec case STT_NOTYPE: 1072092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // The symbol's type is not specified. 1073092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec break; 107424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1075092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec case STT_OBJECT: 1076092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // The symbol is associated with a data object, such as a variable, 1077092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // an array, etc. 1078092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec symbol_type = eSymbolTypeData; 1079092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec break; 108024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1081092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec case STT_FUNC: 1082092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // The symbol is associated with a function or other executable code. 1083092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec symbol_type = eSymbolTypeCode; 1084092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec break; 108524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1086092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec case STT_SECTION: 1087092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // The symbol is associated with a section. Symbol table entries of 1088092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // this type exist primarily for relocation and normally have 1089092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // STB_LOCAL binding. 1090092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec break; 109124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1092092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec case STT_FILE: 1093092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // Conventionally, the symbol's name gives the name of the source 1094092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // file associated with the object file. A file symbol has STB_LOCAL 1095092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // binding, its section index is SHN_ABS, and it precedes the other 1096092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec // STB_LOCAL symbols for the file, if it is present. 1097f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton symbol_type = eSymbolTypeSourceFile; 1098092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec break; 10994f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec 11004f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec case STT_GNU_IFUNC: 11014f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec // The symbol is associated with an indirect function. The actual 11024f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec // function will be resolved if it is referenced. 11034f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec symbol_type = eSymbolTypeResolver; 11044f9103faba72fdfc4b4299d6d459bc820ee597b2Matt Kopec break; 1105092ea400350a06d959f14d391c0b1facc77e674dMatt Kopec } 110624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 110724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 110824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symbol_type == eSymbolTypeInvalid) 110924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11103508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (symbol_section_sp) 111124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 11123508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const ConstString §_name = symbol_section_sp->GetName(); 111324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (sect_name == text_section_name || 111424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_name == init_section_name || 111524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_name == fini_section_name || 111624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_name == ctors_section_name || 111724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner sect_name == dtors_section_name) 111824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 111924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type = eSymbolTypeCode; 112024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1121ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson else if (sect_name == data_section_name || 1122ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson sect_name == data2_section_name || 1123ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson sect_name == rodata_section_name || 1124ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson sect_name == rodata1_section_name || 1125ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson sect_name == bss_section_name) 112624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 112724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symbol_type = eSymbolTypeData; 112824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 112924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 113024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 113124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 11327940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // If the symbol section we've found has no data (SHT_NOBITS), then check the module section 11337940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // list. This can happen if we're parsing the debug file and it has no .text section, for example. 1134a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (symbol_section_sp && (symbol_section_sp->GetFileSize() == 0)) 1135a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1136a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ModuleSP module_sp(GetModule()); 1137a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (module_sp) 1138a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 11397940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *module_section_list = module_sp->GetSectionList(); 11407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_section_list && module_section_list != section_list) 1141a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1142a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ConstString §_name = symbol_section_sp->GetName(); 11437940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton lldb::SectionSP section_sp (module_section_list->FindSectionByName (sect_name)); 1144a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (section_sp && section_sp->GetFileSize()) 1145a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1146a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain symbol_section_sp = section_sp; 1147a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1148a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1149a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1150a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1151a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 115224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint64_t symbol_value = symbol.st_value; 11533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (symbol_section_sp) 11543508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_value -= symbol_section_sp->GetFileAddress(); 1155ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson bool is_global = symbol.getBinding() == STB_GLOBAL; 1156ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t flags = symbol.st_other << 8 | symbol.st_info; 115723d90aea32663f114ffee323775b02dad09f2f18Greg Clayton bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false; 1158ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson Symbol dc_symbol( 11593508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton i + start_id, // ID is the original symbol table index. 11603508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_name, // Symbol name. 116123d90aea32663f114ffee323775b02dad09f2f18Greg Clayton is_mangled, // Is the symbol name mangled? 11623508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_type, // Type of this symbol 11633508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton is_global, // Is this globally visible? 11643508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton false, // Is this symbol debug info? 11653508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton false, // Is this symbol a trampoline? 11663508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton false, // Is this symbol artificial? 11673508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_section_sp, // Section in which this symbol is defined or null. 11683508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol_value, // Offset in section or symbol value. 11693508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symbol.st_size, // Size in bytes of this symbol. 1170f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton true, // Size is valid 11713508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton flags); // Symbol flags. 117224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner symtab->AddSymbol(dc_symbol); 117324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 1174ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1175ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return i; 117624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 117724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1178ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 11797940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileELF::ParseSymbolTable(Symtab *symbol_table, user_id_t start_id, lldb_private::Section *symtab) 1180ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 11817940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (symtab->GetObjectFile() != this) 11827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 11837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // If the symbol table section is owned by a different object file, have it do the 11847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // parsing. 11857940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ObjectFileELF *obj_file_elf = static_cast<ObjectFileELF *>(symtab->GetObjectFile()); 11867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return obj_file_elf->ParseSymbolTable (symbol_table, start_id, symtab); 11877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton } 11887940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 11897940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Get section list for this object file. 11907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = m_sections_ap.get(); 1191ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (!section_list) 1192ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1193ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 11947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton user_id_t symtab_id = symtab->GetID(); 11957940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id); 1196a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain assert(symtab_hdr->sh_type == SHT_SYMTAB || 1197a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain symtab_hdr->sh_type == SHT_DYNSYM); 1198a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 11997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // sh_link: section header index of associated string table. 1200ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson // Section ID's are ones based. 1201ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t strtab_id = symtab_hdr->sh_link + 1; 1202ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson Section *strtab = section_list->FindSectionByID(strtab_id).get(); 12037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 1204ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned num_symbols = 0; 1205ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (symtab && strtab) 1206ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 12077940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert (symtab->GetObjectFile() == this); 12087940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert (strtab->GetObjectFile() == this); 12097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 1210ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson DataExtractor symtab_data; 1211ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson DataExtractor strtab_data; 1212b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (ReadSectionData(symtab, symtab_data) && 1213b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton ReadSectionData(strtab, strtab_data)) 1214ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 12157940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize; 12167940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 1217ce477324f5175d409623856b1bde088f0109a535Stephen Wilson num_symbols = ParseSymbols(symbol_table, start_id, 12187940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton section_list, num_symbols, 1219ce477324f5175d409623856b1bde088f0109a535Stephen Wilson symtab_data, strtab_data); 1220ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1221ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1222ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1223ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return num_symbols; 1224ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 1225ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1226ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonsize_t 1227ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::ParseDynamicSymbols() 1228ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 1229ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (m_dynamic_symbols.size()) 1230ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return m_dynamic_symbols.size(); 1231ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1232ce477324f5175d409623856b1bde088f0109a535Stephen Wilson SectionList *section_list = GetSectionList(); 1233ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!section_list) 12348c1b38294f9b33d14d10ace3f7bd50fbbe9923d9Bill Wendling return 0; 1235ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 12367940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Find the SHT_DYNAMIC section. 12377940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Section *dynsym = section_list->FindSectionByType (eSectionTypeELFDynamicLinkInfo, true).get(); 1238ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!dynsym) 12398c1b38294f9b33d14d10ace3f7bd50fbbe9923d9Bill Wendling return 0; 12407940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert (dynsym->GetObjectFile() == this); 1241ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1242ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ELFDynamic symbol; 1243ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor dynsym_data; 1244b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (ReadSectionData(dynsym, dynsym_data)) 1245ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 124636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const lldb::offset_t section_size = dynsym_data.GetByteSize(); 124736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t cursor = 0; 1248ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1249ce477324f5175d409623856b1bde088f0109a535Stephen Wilson while (cursor < section_size) 1250ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 1251ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!symbol.Parse(dynsym_data, &cursor)) 1252ce477324f5175d409623856b1bde088f0109a535Stephen Wilson break; 1253ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1254ce477324f5175d409623856b1bde088f0109a535Stephen Wilson m_dynamic_symbols.push_back(symbol); 1255ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 1256ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 1257ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1258ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return m_dynamic_symbols.size(); 1259ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 1260ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1261ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonconst ELFDynamic * 1262ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::FindDynamicSymbol(unsigned tag) 1263ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 1264ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!ParseDynamicSymbols()) 1265ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return NULL; 1266ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1267ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DynamicSymbolCollIter I = m_dynamic_symbols.begin(); 1268ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DynamicSymbolCollIter E = m_dynamic_symbols.end(); 1269ce477324f5175d409623856b1bde088f0109a535Stephen Wilson for ( ; I != E; ++I) 1270ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 1271ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ELFDynamic *symbol = &*I; 1272ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1273ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (symbol->d_tag == tag) 1274ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return symbol; 1275ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1276ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1277ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return NULL; 1278ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 1279ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1280ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 1281ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::PLTRelocationType() 1282ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 1283ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL); 1284ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1285ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (symbol) 1286ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return symbol->d_val; 1287ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1288ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1289ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 1290ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1291ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonstatic unsigned 1292ce477324f5175d409623856b1bde088f0109a535Stephen WilsonParsePLTRelocations(Symtab *symbol_table, 1293ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t start_id, 1294ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned rel_type, 1295ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const ELFHeader *hdr, 1296ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const ELFSectionHeader *rel_hdr, 1297ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const ELFSectionHeader *plt_hdr, 1298ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const ELFSectionHeader *sym_hdr, 12993508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton const lldb::SectionSP &plt_section_sp, 1300ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor &rel_data, 1301ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor &symtab_data, 1302ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor &strtab_data) 1303ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 1304ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ELFRelocation rel(rel_type); 1305ce477324f5175d409623856b1bde088f0109a535Stephen Wilson ELFSymbol symbol; 130636da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t offset = 0; 130736da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const elf_xword plt_entsize = plt_hdr->sh_entsize; 130836da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize; 1309ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1310ce477324f5175d409623856b1bde088f0109a535Stephen Wilson typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel); 1311ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_info_fn reloc_type; 1312ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_info_fn reloc_symbol; 1313ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1314f96e9492e90cc2e72486a194a049faaf7d27f8e0Greg Clayton if (hdr->Is32Bit()) 1315ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 1316ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_type = ELFRelocation::RelocType32; 1317ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_symbol = ELFRelocation::RelocSymbol32; 1318ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1319ce477324f5175d409623856b1bde088f0109a535Stephen Wilson else 1320ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 1321ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_type = ELFRelocation::RelocType64; 1322ce477324f5175d409623856b1bde088f0109a535Stephen Wilson reloc_symbol = ELFRelocation::RelocSymbol64; 1323ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1324ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1325ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned slot_type = hdr->GetRelocationJumpSlotType(); 1326ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned i; 1327ce477324f5175d409623856b1bde088f0109a535Stephen Wilson for (i = 0; i < num_relocations; ++i) 1328ce477324f5175d409623856b1bde088f0109a535Stephen Wilson { 1329ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (rel.Parse(rel_data, &offset) == false) 1330ce477324f5175d409623856b1bde088f0109a535Stephen Wilson break; 1331ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1332ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (reloc_type(rel) != slot_type) 1333ce477324f5175d409623856b1bde088f0109a535Stephen Wilson continue; 1334ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 133536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg Clayton lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize; 1336ce477324f5175d409623856b1bde088f0109a535Stephen Wilson uint64_t plt_index = (i + 1) * plt_entsize; 1337ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1338ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!symbol.Parse(symtab_data, &symbol_offset)) 1339ce477324f5175d409623856b1bde088f0109a535Stephen Wilson break; 1340ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1341ce477324f5175d409623856b1bde088f0109a535Stephen Wilson const char *symbol_name = strtab_data.PeekCStr(symbol.st_name); 134223d90aea32663f114ffee323775b02dad09f2f18Greg Clayton bool is_mangled = symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false; 1343ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1344ce477324f5175d409623856b1bde088f0109a535Stephen Wilson Symbol jump_symbol( 1345ce477324f5175d409623856b1bde088f0109a535Stephen Wilson i + start_id, // Symbol table index 1346ce477324f5175d409623856b1bde088f0109a535Stephen Wilson symbol_name, // symbol name. 134723d90aea32663f114ffee323775b02dad09f2f18Greg Clayton is_mangled, // is the symbol name mangled? 1348ce477324f5175d409623856b1bde088f0109a535Stephen Wilson eSymbolTypeTrampoline, // Type of this symbol 1349ce477324f5175d409623856b1bde088f0109a535Stephen Wilson false, // Is this globally visible? 1350ce477324f5175d409623856b1bde088f0109a535Stephen Wilson false, // Is this symbol debug info? 1351ce477324f5175d409623856b1bde088f0109a535Stephen Wilson true, // Is this symbol a trampoline? 1352ce477324f5175d409623856b1bde088f0109a535Stephen Wilson true, // Is this symbol artificial? 13533508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton plt_section_sp, // Section in which this symbol is defined or null. 1354ce477324f5175d409623856b1bde088f0109a535Stephen Wilson plt_index, // Offset in section or symbol value. 1355ce477324f5175d409623856b1bde088f0109a535Stephen Wilson plt_entsize, // Size in bytes of this symbol. 1356f58438fa7751274b6f4e4b1805940127dce13b00Greg Clayton true, // Size is valid 1357ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 0); // Symbol flags. 1358ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1359ce477324f5175d409623856b1bde088f0109a535Stephen Wilson symbol_table->AddSymbol(jump_symbol); 1360ce477324f5175d409623856b1bde088f0109a535Stephen Wilson } 1361ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1362ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return i; 1363ce477324f5175d409623856b1bde088f0109a535Stephen Wilson} 1364ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1365ce477324f5175d409623856b1bde088f0109a535Stephen Wilsonunsigned 1366ce477324f5175d409623856b1bde088f0109a535Stephen WilsonObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, 1367ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t start_id, 1368a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo *rel_hdr, 1369ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t rel_id) 1370ce477324f5175d409623856b1bde088f0109a535Stephen Wilson{ 1371ce477324f5175d409623856b1bde088f0109a535Stephen Wilson assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL); 1372ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 13737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // The link field points to the associated symbol table. The info field 1374ce477324f5175d409623856b1bde088f0109a535Stephen Wilson // points to the section holding the plt. 1375ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t symtab_id = rel_hdr->sh_link; 1376ce477324f5175d409623856b1bde088f0109a535Stephen Wilson user_id_t plt_id = rel_hdr->sh_info; 1377ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1378ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!symtab_id || !plt_id) 1379ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1380ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1381ce477324f5175d409623856b1bde088f0109a535Stephen Wilson // Section ID's are ones based; 1382ce477324f5175d409623856b1bde088f0109a535Stephen Wilson symtab_id++; 1383ce477324f5175d409623856b1bde088f0109a535Stephen Wilson plt_id++; 1384ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1385a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id); 1386ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!plt_hdr) 1387ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1388ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1389a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id); 1390ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!sym_hdr) 1391ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1392ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 13937940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = m_sections_ap.get(); 1394ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!section_list) 1395ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1396ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1397ce477324f5175d409623856b1bde088f0109a535Stephen Wilson Section *rel_section = section_list->FindSectionByID(rel_id).get(); 1398ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!rel_section) 1399ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1400ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 14013508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton SectionSP plt_section_sp (section_list->FindSectionByID(plt_id)); 14023508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton if (!plt_section_sp) 1403ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1404ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1405ce477324f5175d409623856b1bde088f0109a535Stephen Wilson Section *symtab = section_list->FindSectionByID(symtab_id).get(); 1406ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!symtab) 1407ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1408ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 14097940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // sh_link points to associated string table. 1410ce477324f5175d409623856b1bde088f0109a535Stephen Wilson Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get(); 1411ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!strtab) 1412ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1413ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1414ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor rel_data; 1415b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (!ReadSectionData(rel_section, rel_data)) 1416ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1417ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1418ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor symtab_data; 1419b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (!ReadSectionData(symtab, symtab_data)) 1420ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1421ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1422ce477324f5175d409623856b1bde088f0109a535Stephen Wilson DataExtractor strtab_data; 1423b5a8f1498e1ddaeed5187a878d57ea0b74af9c26Greg Clayton if (!ReadSectionData(strtab, strtab_data)) 1424ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1425ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 1426ce477324f5175d409623856b1bde088f0109a535Stephen Wilson unsigned rel_type = PLTRelocationType(); 1427ce477324f5175d409623856b1bde088f0109a535Stephen Wilson if (!rel_type) 1428ce477324f5175d409623856b1bde088f0109a535Stephen Wilson return 0; 1429ce477324f5175d409623856b1bde088f0109a535Stephen Wilson 14303508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton return ParsePLTRelocations (symbol_table, 14313508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton start_id, 14323508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton rel_type, 14333508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton &m_header, 14343508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton rel_hdr, 14353508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton plt_hdr, 14363508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton sym_hdr, 14373508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton plt_section_sp, 14383508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton rel_data, 14393508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton symtab_data, 14403508c387c3f0c9ecc439d98048fd7694d41bab1bGreg Clayton strtab_data); 1441ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 144224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 144324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerSymtab * 14447940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileELF::GetSymtab() 144524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1446a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain ModuleSP module_sp(GetModule()); 14477940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!module_sp) 14487940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return NULL; 1449a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 14507940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // We always want to use the main object file so we (hopefully) only have one cached copy 14517940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // of our symtab, dynamic sections, etc. 14527940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ObjectFile *module_obj_file = module_sp->GetObjectFile(); 14537940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (module_obj_file && module_obj_file != this) 14547940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return module_obj_file->GetSymtab(); 14557940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 14567940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (m_symtab_ap.get() == NULL) 14577940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton { 14587940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton SectionList *section_list = GetSectionList(); 1459a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!section_list) 1460a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain return NULL; 1461a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 14627940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton uint64_t symbol_id = 0; 14637940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton lldb_private::Mutex::Locker locker(module_sp->GetMutex()); 146424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 14657940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton m_symtab_ap.reset(new Symtab(this)); 146624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1467a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // Sharable objects and dynamic executables usually have 2 distinct symbol 1468a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // tables, one named ".symtab", and the other ".dynsym". The dynsym is a smaller 1469a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // version of the symtab that only contains global symbols. The information found 1470a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // in the dynsym is therefore also found in the symtab, while the reverse is not 1471a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // necessarily true. 14727940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Section *symtab = section_list->FindSectionByType (eSectionTypeELFSymbolTable, true).get(); 14737940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (!symtab) 1474a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 1475a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // The symtab section is non-allocable and can be stripped, so if it doesn't exist 1476a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain // then use the dynsym section which should always be there. 14777940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton symtab = section_list->FindSectionByType (eSectionTypeELFDynamicSymbols, true).get(); 1478a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 14797940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (symtab) 14807940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton symbol_id += ParseSymbolTable (m_symtab_ap.get(), symbol_id, symtab); 1481ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 14827940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // Synthesize trampoline symbols to help navigate the PLT. 14837940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL); 14847940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (symbol) 1485ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 14867940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton addr_t addr = symbol->d_ptr; 14877940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton Section *reloc_section = section_list->FindSectionContainingFileAddress(addr).get(); 14887940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton if (reloc_section) 1489a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain { 14907940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton user_id_t reloc_id = reloc_section->GetID(); 14917940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton const ELFSectionHeaderInfo *reloc_header = GetSectionHeaderByIndex(reloc_id); 14927940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton assert(reloc_header); 1493a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain 14947940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton ParseTrampolineSymbols (m_symtab_ap.get(), symbol_id, reloc_header, reloc_id); 1495a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1496a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 1497a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain } 14987940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return m_symtab_ap.get(); 14997940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton} 15007940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton 15017940069905bee0b2e5f0661bf37c9f906ddf8603Greg Claytonbool 15027940069905bee0b2e5f0661bf37c9f906ddf8603Greg ClaytonObjectFileELF::IsStripped () 15037940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton{ 15047940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton // TODO: determine this for ELF 15057940069905bee0b2e5f0661bf37c9f906ddf8603Greg Clayton return false; 150624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 150724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 150824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===// 150924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump 151024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 151124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the specifics of the runtime file container (such as any headers 151224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// segments, sections, etc). 151324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 151424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 151524943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::Dump(Stream *s) 151624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 151724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFHeader(s, m_header); 151824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 151924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFProgramHeaders(s); 152024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 152124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFSectionHeaders(s); 152224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 152324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SectionList *section_list = GetSectionList(); 152424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (section_list) 152558e844b3561848e73e69d6d98746d4851e78306eGreg Clayton section_list->Dump(s, NULL, true, UINT32_MAX); 152624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Symtab *symtab = GetSymtab(); 152724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (symtab) 1528b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton symtab->Dump(s, NULL, eSortOrderNone); 152924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 1530ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson DumpDependentModules(s); 1531ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->EOL(); 153224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 153324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 153424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 153524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFHeader 153624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 153724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump the ELF header to the specified output stream 153824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 153924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1540ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) 1541ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 1542ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->PutCString("ELF Header\n"); 1543ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]); 1544ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", 1545ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson header.e_ident[EI_MAG1], header.e_ident[EI_MAG1]); 1546ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", 1547ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson header.e_ident[EI_MAG2], header.e_ident[EI_MAG2]); 1548ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", 1549ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson header.e_ident[EI_MAG3], header.e_ident[EI_MAG3]); 1550ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 1551ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]); 1552ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]); 155324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]); 155424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf ("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]); 155524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf ("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]); 155624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 155724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_type = 0x%4.4x ", header.e_type); 155824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFHeader_e_type(s, header.e_type); 155924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine); 156024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_version = 0x%8.8x\n", header.e_version); 15615f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry); 15625f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff); 15635f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff); 156424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_flags = 0x%8.8x\n", header.e_flags); 156524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize); 156624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize); 156724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_phnum = 0x%4.4x\n", header.e_phnum); 156824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize); 156924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_shnum = 0x%4.4x\n", header.e_shnum); 157024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("e_shstrndx = 0x%4.4x\n", header.e_shstrndx); 157124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 157224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 157324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 157424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFHeader_e_type 157524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 157624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF header member e_type 157724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 157824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1579ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) 158024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 158124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (e_type) 158224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 158324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ET_NONE: *s << "ET_NONE"; break; 158424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ET_REL: *s << "ET_REL"; break; 158524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ET_EXEC: *s << "ET_EXEC"; break; 158624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ET_DYN: *s << "ET_DYN"; break; 158724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ET_CORE: *s << "ET_CORE"; break; 158824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 158924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 159024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 159124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 159224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 159324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 159424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFHeader_e_ident_EI_DATA 159524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 159624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF header member e_ident[EI_DATA] 159724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 159824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1599ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s, unsigned char ei_data) 160024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 160124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (ei_data) 160224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 160324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ELFDATANONE: *s << "ELFDATANONE"; break; 160424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ELFDATA2LSB: *s << "ELFDATA2LSB - Little Endian"; break; 160524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner case ELFDATA2MSB: *s << "ELFDATA2MSB - Big Endian"; break; 160624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 160724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 160824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 160924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 161024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 161224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 161324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFProgramHeader 161424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 161524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a single ELF program header to the specified output stream 161624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 161724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1618ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFProgramHeader(Stream *s, const ELFProgramHeader &ph) 161924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 162024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFProgramHeader_p_type(s, ph.p_type); 16215f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset, ph.p_vaddr, ph.p_paddr); 16225f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz, ph.p_flags); 1623ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 162424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFProgramHeader_p_flags(s, ph.p_flags); 16255f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(") %8.8" PRIx64, ph.p_align); 162624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 162724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 162824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 162924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFProgramHeader_p_type 163024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 163124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF program header member p_type which 163224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// describes the type of the program header 1633ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson// ---------------------------------------------------------------------- 163424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1635ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) 163624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1637d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas const int kStrWidth = 15; 163824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (p_type) 163924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1640d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_NULL , kStrWidth); 1641d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_LOAD , kStrWidth); 1642d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_DYNAMIC , kStrWidth); 1643d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_INTERP , kStrWidth); 1644d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_NOTE , kStrWidth); 1645d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_SHLIB , kStrWidth); 1646d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_PHDR , kStrWidth); 1647d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_TLS , kStrWidth); 1648d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth); 164924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 165024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, ""); 165124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 165224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 165324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 165424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 165624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 165724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFProgramHeader_p_flags 165824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 165924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF program header member p_flags 166024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 166124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1662ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) 166324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 166424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *s << ((p_flags & PF_X) ? "PF_X" : " ") 166524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ') 166624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << ((p_flags & PF_W) ? "PF_W" : " ") 166724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ') 166824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << ((p_flags & PF_R) ? "PF_R" : " "); 166924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 167024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 167124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 167224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFProgramHeaders 167324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 167424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump all of the ELF program header to the specified output stream 167524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 167624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 167724943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::DumpELFProgramHeaders(Stream *s) 167824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 167924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (ParseProgramHeaders()) 168024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 168124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->PutCString("Program Headers\n"); 1682d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas s->PutCString("IDX p_type p_offset p_vaddr p_paddr " 1683ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "p_filesz p_memsz p_flags p_align\n"); 1684d5a5e25deebaf7eef739e3bd2a6cbc0fbce56534Filipe Cabecinhas s->PutCString("==== --------------- -------- -------- -------- " 1685ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "-------- -------- ------------------------- --------\n"); 168624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 168724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t idx = 0; 1688ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (ProgramHeaderCollConstIter I = m_program_headers.begin(); 1689ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson I != m_program_headers.end(); ++I, ++idx) 169024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1691ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("[%2u] ", idx); 1692ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ObjectFileELF::DumpELFProgramHeader(s, *I); 169324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->EOL(); 169424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 169624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 169724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 169824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 169924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFSectionHeader 170024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 170124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump a single ELF section header to the specified output stream 170224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 170324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1704a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael SartainObjectFileELF::DumpELFSectionHeader(Stream *s, const ELFSectionHeaderInfo &sh) 170524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1706ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("%8.8x ", sh.sh_name); 170724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFSectionHeader_sh_type(s, sh.sh_type); 17085f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" %8.8" PRIx64 " (", sh.sh_flags); 170924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DumpELFSectionHeader_sh_flags(s, sh.sh_flags); 17105f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr, sh.sh_offset, sh.sh_size); 1711ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info); 17125f35a4be95aed0e5b2cb36f7d785bcbfc67284aeDaniel Malea s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize); 171324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 171424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 171524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 171624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFSectionHeader_sh_type 171724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 171824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF section header member sh_type which 171924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// describes the type of the section 172024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 172124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 1722ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) 172324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 172424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner const int kStrWidth = 12; 172524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner switch (sh_type) 172624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 172724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_NULL , kStrWidth); 172824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_PROGBITS , kStrWidth); 172924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_SYMTAB , kStrWidth); 173024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_STRTAB , kStrWidth); 173124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_RELA , kStrWidth); 173224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_HASH , kStrWidth); 173324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_DYNAMIC , kStrWidth); 173424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_NOTE , kStrWidth); 173524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_NOBITS , kStrWidth); 173624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_REL , kStrWidth); 173724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_SHLIB , kStrWidth); 173824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_DYNSYM , kStrWidth); 173924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_LOPROC , kStrWidth); 174024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_HIPROC , kStrWidth); 174124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_LOUSER , kStrWidth); 174224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner CASE_AND_STREAM(s, SHT_HIUSER , kStrWidth); 174324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner default: 174424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, ""); 174524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner break; 174624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 174724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 174824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 174924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 175024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFSectionHeader_sh_flags 175124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 175224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump an token value for the ELF section header member sh_flags 175324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 175424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 175536da2aa6dc5ad9994b638ed09eb81c44cc05540bGreg ClaytonObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s, elf_xword sh_flags) 175624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 175724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ") 175824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ') 175924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ") 176024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ') 176124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " "); 176224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 1763ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 176424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 176524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// DumpELFSectionHeaders 176624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// 176724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Dump all of the ELF section header to the specified output stream 176824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 176924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 177024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerObjectFileELF::DumpELFSectionHeaders(Stream *s) 177124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1772a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain if (!ParseSectionHeaders()) 1773ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return; 1774ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 1775ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->PutCString("Section Headers\n"); 1776ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->PutCString("IDX name type flags " 1777ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "addr offset size link info addralgn " 1778ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "entsize Name\n"); 1779ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->PutCString("==== -------- ------------ -------------------------------- " 1780ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "-------- -------- -------- -------- -------- -------- " 1781ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson "-------- ====================\n"); 1782ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson 1783ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson uint32_t idx = 0; 1784ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (SectionHeaderCollConstIter I = m_section_headers.begin(); 1785ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson I != m_section_headers.end(); ++I, ++idx) 178624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1787ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf("[%2u] ", idx); 1788ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson ObjectFileELF::DumpELFSectionHeader(s, *I); 1789a807ceef5dad2b24e5bae5c5a193ff03aa7ec8d9Michael Sartain const char* section_name = I->section_name.AsCString(""); 1790ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (section_name) 1791ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson *s << ' ' << section_name << "\n"; 1792ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson } 1793ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson} 179424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1795ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilsonvoid 1796ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen WilsonObjectFileELF::DumpDependentModules(lldb_private::Stream *s) 1797ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson{ 1798ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson size_t num_modules = ParseDependentModules(); 179924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1800ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson if (num_modules > 0) 1801ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson { 1802ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->PutCString("Dependent Modules:\n"); 1803ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson for (unsigned i = 0; i < num_modules; ++i) 180424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 1805ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i); 1806ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson s->Printf(" %s\n", spec.GetFilename().GetCString()); 180724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 180924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 181024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 181124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 1812395fc33dc4b06c048ed35047ec461bc092ef2df3Greg ClaytonObjectFileELF::GetArchitecture (ArchSpec &arch) 181324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 1814f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson if (!ParseHeader()) 1815f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson return false; 1816f7cc64d65f527ae132b4d6e014eeadca8175f3a8Stephen Wilson 1817b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton arch.SetArchitecture (eArchTypeELF, m_header.e_machine, LLDB_INVALID_CPUTYPE); 1818940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton arch.GetTriple().setOSName (Host::GetOSString().GetCString()); 1819940b103224f3062578c7a7e6e76d8bf4a7956f2aGreg Clayton arch.GetTriple().setVendorName(Host::GetVendorString().GetCString()); 1820ddd2962a3b9f22ddfe472ef6ba225d0c55b23727Stephen Wilson return true; 182124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 182224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 1823ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Type 1824ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileELF::CalculateType() 1825ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{ 1826ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton switch (m_header.e_type) 1827ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton { 1828ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_NONE: 1829ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 0 - No file type 1830ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeUnknown; 1831ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1832ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_REL: 1833ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 1 - Relocatable file 1834ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeObjectFile; 1835ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1836ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_EXEC: 1837ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 2 - Executable file 1838ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeExecutable; 1839ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1840ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_DYN: 1841ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 3 - Shared object file 1842ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeSharedLibrary; 1843ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1844ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case ET_CORE: 1845ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 4 - Core file 1846ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeCoreFile; 1847ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1848ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton default: 1849ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton break; 1850ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton } 1851ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eTypeUnknown; 1852ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton} 1853ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1854ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFile::Strata 1855ca31997f0ff24dbba39623054d5a94a0181c52d6Greg ClaytonObjectFileELF::CalculateStrata() 1856ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton{ 1857ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton switch (m_header.e_type) 1858ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton { 1859ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_NONE: 1860ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 0 - No file type 1861ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUnknown; 1862ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1863ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_REL: 1864ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 1 - Relocatable file 1865ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUnknown; 1866ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1867ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_EXEC: 1868ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 2 - Executable file 1869ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // TODO: is there any way to detect that an executable is a kernel 1870ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // related executable by inspecting the program headers, section 1871ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // headers, symbols, or any other flag bits??? 1872ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUser; 1873ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1874ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case llvm::ELF::ET_DYN: 1875ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 3 - Shared object file 1876ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // TODO: is there any way to detect that an shared library is a kernel 1877ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // related executable by inspecting the program headers, section 1878ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // headers, symbols, or any other flag bits??? 1879ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUnknown; 1880ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1881ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton case ET_CORE: 1882ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // 4 - Core file 1883ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // TODO: is there any way to detect that an core file is a kernel 1884ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // related executable by inspecting the program headers, section 1885ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton // headers, symbols, or any other flag bits??? 1886ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUnknown; 1887ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1888ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton default: 1889ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton break; 1890ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton } 1891ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton return eStrataUnknown; 1892ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton} 1893ca31997f0ff24dbba39623054d5a94a0181c52d6Greg Clayton 1894