blob: 4d5ae558a5b16b437f71c05cb189bb5f463c9d6f [file] [log] [blame]
Greg Claytonfc7117a2011-03-05 01:04:56 +00001//===-- DynamicLoaderStatic.cpp ---------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "lldb/Core/Module.h"
11#include "lldb/Core/PluginManager.h"
12#include "lldb/Target/Target.h"
13
14#include "DynamicLoaderStatic.h"
15
16using namespace lldb;
17using namespace lldb_private;
18
19//----------------------------------------------------------------------
20// Create an instance of this class. This function is filled into
21// the plugin info class that gets handed out by the plugin factory and
22// allows the lldb to instantiate an instance of this class.
23//----------------------------------------------------------------------
24DynamicLoader *
25DynamicLoaderStatic::CreateInstance (Process* process, bool force)
26{
27 bool create = force;
28 if (!create)
29 {
30 const llvm::Triple &triple_ref = process->GetTarget().GetArchitecture().GetTriple();
31 const llvm::Triple::OSType os_type = triple_ref.getOS();
Sean Callananfb0b7582011-03-15 00:17:19 +000032 if ((os_type == llvm::Triple::UnknownOS))
Greg Claytonfc7117a2011-03-05 01:04:56 +000033 create = true;
34 }
35
36 if (create)
37 return new DynamicLoaderStatic (process);
38 return NULL;
39}
40
41//----------------------------------------------------------------------
42// Constructor
43//----------------------------------------------------------------------
44DynamicLoaderStatic::DynamicLoaderStatic (Process* process) :
45 DynamicLoader(process)
46{
47}
48
49//----------------------------------------------------------------------
50// Destructor
51//----------------------------------------------------------------------
52DynamicLoaderStatic::~DynamicLoaderStatic()
53{
54}
55
56//------------------------------------------------------------------
57/// Called after attaching a process.
58///
59/// Allow DynamicLoader plug-ins to execute some code after
60/// attaching to a process.
61//------------------------------------------------------------------
62void
63DynamicLoaderStatic::DidAttach ()
64{
65 LoadAllImagesAtFileAddresses();
66}
67
68//------------------------------------------------------------------
69/// Called after attaching a process.
70///
71/// Allow DynamicLoader plug-ins to execute some code after
72/// attaching to a process.
73//------------------------------------------------------------------
74void
75DynamicLoaderStatic::DidLaunch ()
76{
77 LoadAllImagesAtFileAddresses();
78}
79
80void
81DynamicLoaderStatic::LoadAllImagesAtFileAddresses ()
82{
83 ModuleList &module_list = m_process->GetTarget().GetImages();
84
85 ModuleList loaded_module_list;
86
87 const size_t num_modules = module_list.GetSize();
88 for (uint32_t idx = 0; idx < num_modules; ++idx)
89 {
90 ModuleSP module_sp (module_list.GetModuleAtIndex (idx));
91 if (module_sp)
92 {
93 bool changed = false;
94 ObjectFile *image_object_file = module_sp->GetObjectFile();
95 if (image_object_file)
96 {
97 SectionList *section_list = image_object_file->GetSectionList ();
98 if (section_list)
99 {
100 // All sections listed in the dyld image info structure will all
101 // either be fixed up already, or they will all be off by a single
102 // slide amount that is determined by finding the first segment
103 // that is at file offset zero which also has bytes (a file size
104 // that is greater than zero) in the object file.
105
106 // Determine the slide amount (if any)
107 const size_t num_sections = section_list->GetSize();
108 size_t sect_idx = 0;
109 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx)
110 {
111 // Iterate through the object file sections to find the
112 // first section that starts of file offset zero and that
113 // has bytes in the file...
114 Section *section = section_list->GetSectionAtIndex (sect_idx).get();
115 if (section)
116 {
117 if (m_process->GetTarget().GetSectionLoadList().SetSectionLoadAddress (section, section->GetFileAddress()))
118 changed = true;
119 }
120 }
121 }
122 }
123
124 if (changed)
125 loaded_module_list.AppendIfNeeded (module_sp);
126 }
127 }
128
129 if (loaded_module_list.GetSize())
130 m_process->GetTarget().ModulesDidLoad (loaded_module_list);
131}
132
133ThreadPlanSP
134DynamicLoaderStatic::GetStepThroughTrampolinePlan (Thread &thread, bool stop_others)
135{
136 return ThreadPlanSP();
137}
138
139Error
140DynamicLoaderStatic::CanLoadImage ()
141{
142 Error error;
143 error.SetErrorString ("can't load images on with a static debug session");
144 return error;
145}
146
147void
148DynamicLoaderStatic::Initialize()
149{
150 PluginManager::RegisterPlugin (GetPluginNameStatic(),
151 GetPluginDescriptionStatic(),
152 CreateInstance);
153}
154
155void
156DynamicLoaderStatic::Terminate()
157{
158 PluginManager::UnregisterPlugin (CreateInstance);
159}
160
161
162const char *
163DynamicLoaderStatic::GetPluginNameStatic()
164{
165 return "dynamic-loader.static";
166}
167
168const char *
169DynamicLoaderStatic::GetPluginDescriptionStatic()
170{
171 return "Dynamic loader plug-in that will load any images at the static addresses contained in each image.";
172}
173
174
175//------------------------------------------------------------------
176// PluginInterface protocol
177//------------------------------------------------------------------
178const char *
179DynamicLoaderStatic::GetPluginName()
180{
181 return "DynamicLoaderStatic";
182}
183
184const char *
185DynamicLoaderStatic::GetShortPluginName()
186{
187 return GetPluginNameStatic();
188}
189
190uint32_t
191DynamicLoaderStatic::GetPluginVersion()
192{
193 return 1;
194}
195