27 #include "llvm/Support/DJB.h"
33 size_t ObjectFile::g_initial_bytes_to_read = 512;
41 (callback = PluginManager::GetObjectContainerCreateCallbackAtIndex(
44 std::unique_ptr<ObjectContainer> object_container_up(callback(
45 module_sp, data_sp, data_offset, file, file_offset, file_size));
46 if (object_container_up)
47 return object_container_up->GetObjectFile(file);
53 ObjectFile::FindPlugin(
const lldb::ModuleSP &module_sp,
const FileSpec *file,
57 "ObjectFile::FindPlugin (module = %s, file = %p, file_offset = "
58 "0x%8.8" PRIx64
", file_size = 0x%8.8" PRIx64
")",
59 module_sp->GetFileSpec().GetPath().c_str(),
60 static_cast<const void *
>(file),
static_cast<uint64_t
>(file_offset),
61 static_cast<uint64_t
>(file_size));
70 const bool file_exists = FileSystem::Instance().Exists(*file);
74 if (file_exists && module_sp->GetObjectName()) {
76 module_sp, file, file_offset, file_size, data_sp, data_offset);
78 return object_file_sp;
85 data_sp = FileSystem::Instance().CreateDataBuffer(
86 file->
GetPath(), g_initial_bytes_to_read, file_offset);
91 if (!data_sp || data_sp->GetByteSize() == 0) {
93 llvm::SmallString<256> path_with_object;
94 module_sp->GetFileSpec().GetPath(path_with_object);
98 const bool must_exist =
true;
99 if (ObjectFile::SplitArchivePathWithObject(path_with_object, archive_file,
100 archive_object, must_exist)) {
101 file_size = FileSystem::Instance().GetByteSize(archive_file);
103 file = &archive_file;
104 module_sp->SetFileSpecAndObjectName(archive_file, archive_object);
113 module_sp, file, file_offset, file_size, data_sp, data_offset);
115 return object_file_sp;
118 data_sp = FileSystem::Instance().CreateDataBuffer(
119 archive_file.
GetPath(), g_initial_bytes_to_read, file_offset);
124 if (data_sp && data_sp->GetByteSize() > 0) {
129 (callback = PluginManager::GetObjectFileCreateCallbackAtIndex(idx)) !=
132 ObjectFileSP object_file_sp(callback(module_sp, data_sp, data_offset,
133 file, file_offset, file_size));
134 if (object_file_sp.get())
135 return object_file_sp;
142 module_sp, file, file_offset, file_size, data_sp, data_offset);
144 return object_file_sp;
152 ObjectFileSP ObjectFile::FindPlugin(
const lldb::ModuleSP &module_sp,
153 const ProcessSP &process_sp,
155 WritableDataBufferSP data_sp) {
156 ObjectFileSP object_file_sp;
160 "%s, process = %p, header_addr = "
162 module_sp->GetFileSpec().GetPath().c_str(),
163 static_cast<void *
>(process_sp.get()), header_addr);
168 ObjectFileCreateMemoryInstance create_callback;
171 PluginManager::GetObjectFileCreateMemoryCallbackAtIndex(idx)) !=
174 object_file_sp.reset(
175 create_callback(module_sp, data_sp, process_sp, header_addr));
176 if (object_file_sp.get())
177 return object_file_sp;
183 object_file_sp.reset();
184 return object_file_sp;
187 size_t ObjectFile::GetModuleSpecifications(
const FileSpec &file,
191 DataBufferSP data_sp) {
193 data_sp = FileSystem::Instance().CreateDataBuffer(
194 file.
GetPath(), g_initial_bytes_to_read, file_offset);
196 if (file_size == 0) {
198 FileSystem::Instance().GetByteSize(file);
199 if (actual_file_size > file_offset)
200 file_size = actual_file_size - file_offset;
202 return ObjectFile::GetModuleSpecifications(file,
212 size_t ObjectFile::GetModuleSpecifications(
216 const size_t initial_count = specs.
GetSize();
217 ObjectFileGetModuleSpecifications callback;
222 PluginManager::GetObjectFileGetModuleSpecificationsCallbackAtIndex(
225 if (callback(file, data_sp, data_offset, file_offset, file_size, specs) > 0)
226 return specs.
GetSize() - initial_count;
231 (callback = PluginManager::
232 GetObjectContainerGetModuleSpecificationsCallbackAtIndex(i)) !=
235 if (callback(file, data_sp, data_offset, file_offset, file_size, specs) > 0)
236 return specs.
GetSize() - initial_count;
241 ObjectFile::ObjectFile(
const lldb::ModuleSP &module_sp,
247 m_type(eTypeInvalid), m_strata(eStrataInvalid),
248 m_file_offset(file_offset), m_length(length), m_data(), m_process_wp(),
250 m_symtab_once_up(new
llvm::once_flag()) {
257 "%p ObjectFile::ObjectFile() module = %p (%s), file = %s, "
258 "file_offset = 0x%8.8" PRIx64
", size = %" PRIu64,
259 static_cast<void *
>(
this),
static_cast<void *
>(module_sp.get()),
260 module_sp->GetSpecificationDescription().c_str(),
267 DataBufferSP header_data_sp)
268 :
ModuleChild(module_sp), m_file(), m_type(eTypeInvalid),
269 m_strata(eStrataInvalid), m_file_offset(0), m_length(0), m_data(),
270 m_process_wp(process_sp), m_memory_addr(header_addr), m_sections_up(),
271 m_symtab_up(), m_symtab_once_up(new
llvm::once_flag()) {
273 m_data.
SetData(header_data_sp, 0, header_data_sp->GetByteSize());
276 "%p ObjectFile::ObjectFile() module = %p (%s), process = %p, "
277 "header_addr = 0x%" PRIx64,
278 static_cast<void *
>(
this),
static_cast<void *
>(module_sp.get()),
279 module_sp->GetSpecificationDescription().c_str(),
285 LLDB_LOGF(log,
"%p ObjectFile::~ObjectFile ()\n",
static_cast<void *
>(
this));
291 return module_sp->SetArchitecture(new_arch);
303 const SectionType section_type = section_sp->GetType();
304 switch (section_type) {
381 switch (symbol_type) {
448 DataBufferSP data_sp;
450 std::unique_ptr<DataBufferHeap> data_up(
new DataBufferHeap(byte_size, 0));
452 const size_t bytes_read = process_sp->ReadMemory(
453 addr, data_up->GetBytes(), data_up->GetByteSize(),
error);
454 if (bytes_read == byte_size)
455 data_sp.reset(data_up.release());
492 const addr_t base_load_addr =
495 return process_sp->ReadMemory(base_load_addr + section_offset, dst,
500 if (section_offset < section_file_size) {
501 const size_t section_bytes_left = section_file_size - section_offset;
502 size_t section_dst_len = dst_len;
503 if (section_dst_len > section_bytes_left)
504 section_dst_len = section_bytes_left;
506 section_dst_len, dst);
509 const uint64_t section_size = section->
GetByteSize();
510 const uint64_t section_bytes_left = section_size - section_offset;
511 uint64_t section_dst_len = dst_len;
512 if (section_dst_len > section_bytes_left)
513 section_dst_len = section_bytes_left;
514 memset(dst, 0, section_dst_len);
515 return section_dst_len;
535 const addr_t base_load_addr =
538 DataBufferSP data_sp(
541 section_data.
SetData(data_sp, 0, data_sp->GetByteSize());
560 size_t len = path_with_object.size();
561 if (len < 2 || path_with_object.back() !=
')')
563 llvm::StringRef archive = path_with_object.substr(0, path_with_object.rfind(
'('));
566 llvm::StringRef
object = path_with_object.substr(archive.size() + 1).drop_back();
567 archive_file.
SetFile(archive, FileSpec::Style::native);
578 LLDB_LOGF(log,
"%p ObjectFile::ClearSymtab () symtab = %p",
579 static_cast<void *
>(
this),
590 if (update_module_section_list) {
593 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
608 if (name.startswith(
"_OBJC_")) {
610 if (name.startswith(
"_OBJC_CLASS_$_"))
612 if (name.startswith(
"_OBJC_METACLASS_$_"))
614 if (name.startswith(
"_OBJC_IVAR_$_"))
616 }
else if (name.startswith(
".objc_class_name_")) {
621 return symbol_type_hint;
624 std::vector<ObjectFile::LoadableData>
626 std::vector<LoadableData> loadables;
632 for (
size_t i = 0; i < section_count; ++i) {
640 if (section_sp->GetFileSize() == 0)
643 section_sp->GetSectionData(section_data);
646 loadables.push_back(loadable);
664 void llvm::format_provider<ObjectFile::Type>::format(
680 OS <<
"dynamic linker";
686 OS <<
"shared library";
689 OS <<
"stub library";
700 void llvm::format_provider<ObjectFile::Strata>::format(
744 std::lock_guard<std::recursive_mutex> symtab_guard(symtab->
GetMutex());