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, &notehdr, 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 &section_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 &sect_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 &sect_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