48 std::optional<uint64_t> maybe_phdr_addr =
50 std::optional<uint64_t> maybe_phdr_entry_size =
52 std::optional<uint64_t> maybe_phdr_num_entries =
54 if (!maybe_phdr_addr || !maybe_phdr_entry_size || !maybe_phdr_num_entries)
57 size_t phdr_entry_size = *maybe_phdr_entry_size;
58 size_t phdr_num_entries = *maybe_phdr_num_entries;
64 bool found_load_bias =
false;
66 uint64_t dynamic_section_size = 0;
67 bool found_dynamic_section =
false;
69 for (
size_t i = 0; i < phdr_num_entries; i++) {
72 sizeof(phdr_entry), bytes_read);
75 if (phdr_entry.p_type == llvm::ELF::PT_PHDR) {
76 load_bias = phdr_addr - phdr_entry.p_vaddr;
77 found_load_bias =
true;
80 if (phdr_entry.p_type == llvm::ELF::PT_DYNAMIC) {
81 dynamic_section_addr = phdr_entry.p_vaddr;
82 dynamic_section_size = phdr_entry.p_memsz;
83 found_dynamic_section =
true;
87 if (!found_load_bias || !found_dynamic_section)
91 dynamic_section_addr += load_bias;
92 ELF_DYN dynamic_entry;
93 size_t dynamic_num_entries = dynamic_section_size /
sizeof(dynamic_entry);
94 for (
size_t i = 0; i < dynamic_num_entries; i++) {
96 auto error =
ReadMemory(dynamic_section_addr + i *
sizeof(dynamic_entry),
97 &dynamic_entry,
sizeof(dynamic_entry), bytes_read);
102 if (dynamic_entry.d_tag == llvm::ELF::DT_DEBUG) {
103 return dynamic_section_addr + i *
sizeof(dynamic_entry) +
104 sizeof(dynamic_entry.d_tag);
147 return llvm::createStringError(llvm::inconvertibleErrorCode(),
148 "Invalid shared library info address");
154 if (!status.Success())
155 return status.ToError();
157 return llvm::createStringError(llvm::inconvertibleErrorCode(),
158 "Invalid r_debug address");
163 if (!status.Success())
164 return status.ToError();
166 return llvm::createStringError(llvm::inconvertibleErrorCode(),
167 "Invalid link_map address");
169 std::vector<SVR4LibraryInfo> library_list;
171 llvm::Expected<SVR4LibraryInfo> info =
175 return info.takeError();
176 if (!info->name.empty() && info->base_addr != 0)
177 library_list.push_back(*info);
178 link_map = info->next;