blob: ac9642b2968d1b1fefdf27b1ddb34595bcac2b66 [file] [log] [blame]
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001//===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Chris Lattner30fdc8d2010-06-08 16:52:24 +00006//
7//===----------------------------------------------------------------------===//
8
9#include "ObjectFileELF.h"
10
Chris Lattner30fdc8d2010-06-08 16:52:24 +000011#include <algorithm>
Kate Stoneb9c1b512016-09-06 20:57:50 +000012#include <cassert>
Tamas Berghammer9fa11472015-10-27 10:43:27 +000013#include <unordered_map>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000014
Stephen Wilsonf325ba92010-07-13 23:07:23 +000015#include "lldb/Core/FileSpecList.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000016#include "lldb/Core/Module.h"
Greg Claytonf4d6de62013-04-24 22:29:28 +000017#include "lldb/Core/ModuleSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000018#include "lldb/Core/PluginManager.h"
19#include "lldb/Core/Section.h"
Jonas Devlieghere59b78bc2018-11-01 04:45:28 +000020#include "lldb/Host/FileSystem.h"
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +000021#include "lldb/Symbol/DWARFCallFrameInfo.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000022#include "lldb/Symbol/SymbolContext.h"
Steve Pucci9e02dac2014-02-06 19:02:19 +000023#include "lldb/Target/SectionLoadList.h"
Ed Maste54803652013-10-11 17:39:07 +000024#include "lldb/Target/Target.h"
Pavel Labath5f19b902017-11-13 16:16:33 +000025#include "lldb/Utility/ArchSpec.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000026#include "lldb/Utility/DataBufferHeap.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000027#include "lldb/Utility/Log.h"
Pavel Labathb8093312019-03-06 14:41:43 +000028#include "lldb/Utility/RangeMap.h"
Zachary Turner97206d52017-05-12 04:51:55 +000029#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000030#include "lldb/Utility/Stream.h"
Pavel Labath38d06322017-06-29 14:32:17 +000031#include "lldb/Utility/Timer.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
Pavel Labathf55aea72019-01-09 16:50:45 +000033#include "llvm/ADT/IntervalMap.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000034#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000035#include "llvm/ADT/StringRef.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000036#include "llvm/Object/Decompressor.h"
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +000037#include "llvm/Support/ARMBuildAttributes.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000038#include "llvm/Support/MathExtras.h"
Zachary Turner3f4a4b32017-02-24 18:56:49 +000039#include "llvm/Support/MemoryBuffer.h"
Sagar Thakurad5b55a2016-05-24 14:52:50 +000040#include "llvm/Support/MipsABIFlags.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000041
Kate Stoneb9c1b512016-09-06 20:57:50 +000042#define CASE_AND_STREAM(s, def, width) \
43 case def: \
44 s->Printf("%-*s", width, #def); \
45 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046
Chris Lattner30fdc8d2010-06-08 16:52:24 +000047using namespace lldb;
48using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000049using namespace elf;
50using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000051
Stephen Wilson499b40e2011-03-30 16:07:05 +000052namespace {
Todd Fialab91de782014-06-27 16:52:49 +000053
54// ELF note owner definitions
55const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000056const char *const LLDB_NT_OWNER_GNU = "GNU";
57const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Michal Gorny4f134fb2019-02-20 14:31:06 +000058const char *const LLDB_NT_OWNER_NETBSDCORE = "NetBSD-CORE";
Kamil Rytarowski12801f12017-03-26 15:34:57 +000059const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000060const char *const LLDB_NT_OWNER_ANDROID = "Android";
Kate Stoneb9c1b512016-09-06 20:57:50 +000061const char *const LLDB_NT_OWNER_CORE = "CORE";
62const char *const LLDB_NT_OWNER_LINUX = "LINUX";
Todd Fialab91de782014-06-27 16:52:49 +000063
64// ELF note type definitions
Kate Stoneb9c1b512016-09-06 20:57:50 +000065const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000066const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
67
Kate Stoneb9c1b512016-09-06 20:57:50 +000068const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
69const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
Todd Fialab91de782014-06-27 16:52:49 +000070
71const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
72
Michal Gorny4f134fb2019-02-20 14:31:06 +000073const elf_word LLDB_NT_NETBSD_IDENT_TAG = 1;
74const elf_word LLDB_NT_NETBSD_IDENT_DESCSZ = 4;
75const elf_word LLDB_NT_NETBSD_IDENT_NAMESZ = 7;
76const elf_word LLDB_NT_NETBSD_PROCINFO = 1;
Todd Fialab91de782014-06-27 16:52:49 +000077
78// GNU ABI note OS constants
Kate Stoneb9c1b512016-09-06 20:57:50 +000079const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
80const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000081const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
82
Greg Claytonb704b692015-10-28 18:04:38 +000083// LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants
Kate Stoneb9c1b512016-09-06 20:57:50 +000084#define NT_PRSTATUS 1
85#define NT_PRFPREG 2
86#define NT_PRPSINFO 3
87#define NT_TASKSTRUCT 4
88#define NT_AUXV 6
89#define NT_SIGINFO 0x53494749
90#define NT_FILE 0x46494c45
91#define NT_PRXFPREG 0x46e62b7f
92#define NT_PPC_VMX 0x100
93#define NT_PPC_SPE 0x101
94#define NT_PPC_VSX 0x102
95#define NT_386_TLS 0x200
96#define NT_386_IOPERM 0x201
97#define NT_X86_XSTATE 0x202
98#define NT_S390_HIGH_GPRS 0x300
99#define NT_S390_TIMER 0x301
100#define NT_S390_TODCMP 0x302
101#define NT_S390_TODPREG 0x303
102#define NT_S390_CTRS 0x304
103#define NT_S390_PREFIX 0x305
104#define NT_S390_LAST_BREAK 0x306
105#define NT_S390_SYSTEM_CALL 0x307
106#define NT_S390_TDB 0x308
107#define NT_S390_VXRS_LOW 0x309
108#define NT_S390_VXRS_HIGH 0x30a
109#define NT_ARM_VFP 0x400
110#define NT_ARM_TLS 0x401
111#define NT_ARM_HW_BREAK 0x402
112#define NT_ARM_HW_WATCH 0x403
113#define NT_ARM_SYSTEM_CALL 0x404
114#define NT_METAG_CBUF 0x500
115#define NT_METAG_RPIPE 0x501
116#define NT_METAG_TLS 0x502
Greg Claytonb704b692015-10-28 18:04:38 +0000117
Stephen Wilson499b40e2011-03-30 16:07:05 +0000118//===----------------------------------------------------------------------===//
Adrian Prantlf05b42e2019-03-11 17:09:29 +0000119/// \class ELFRelocation
Adrian Prantld8f460e2018-05-02 16:55:16 +0000120/// Generic wrapper for ELFRel and ELFRela.
Stephen Wilson499b40e2011-03-30 16:07:05 +0000121///
122/// This helper class allows us to parse both ELFRel and ELFRela relocation
123/// entries in a generic manner.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000124class ELFRelocation {
Stephen Wilson499b40e2011-03-30 16:07:05 +0000125public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000126 /// Constructs an ELFRelocation entry with a personality as given by @p
127 /// type.
128 ///
Adrian Prantlf05b42e2019-03-11 17:09:29 +0000129 /// \param type Either DT_REL or DT_RELA. Any other value is invalid.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 ELFRelocation(unsigned type);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 ~ELFRelocation();
Ed Maste81b4c5f2016-01-04 01:43:47 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 static unsigned RelocType32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 static unsigned RelocType64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 static unsigned RelocSymbol32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 static unsigned RelocSymbol64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 static unsigned RelocOffset32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 static unsigned RelocOffset64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000147
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 static unsigned RelocAddend32(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 static unsigned RelocAddend64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000151
Stephen Wilson499b40e2011-03-30 16:07:05 +0000152private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155 RelocUnion reloc;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000156};
157
Kate Stoneb9c1b512016-09-06 20:57:50 +0000158ELFRelocation::ELFRelocation(unsigned type) {
159 if (type == DT_REL || type == SHT_REL)
160 reloc = new ELFRel();
161 else if (type == DT_RELA || type == SHT_RELA)
162 reloc = new ELFRela();
163 else {
164 assert(false && "unexpected relocation type");
165 reloc = static_cast<ELFRel *>(NULL);
166 }
Stephen Wilson499b40e2011-03-30 16:07:05 +0000167}
168
Kate Stoneb9c1b512016-09-06 20:57:50 +0000169ELFRelocation::~ELFRelocation() {
170 if (reloc.is<ELFRel *>())
171 delete reloc.get<ELFRel *>();
172 else
173 delete reloc.get<ELFRela *>();
Stephen Wilson499b40e2011-03-30 16:07:05 +0000174}
175
Kate Stoneb9c1b512016-09-06 20:57:50 +0000176bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
177 lldb::offset_t *offset) {
178 if (reloc.is<ELFRel *>())
179 return reloc.get<ELFRel *>()->Parse(data, offset);
180 else
181 return reloc.get<ELFRela *>()->Parse(data, offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000182}
183
Kate Stoneb9c1b512016-09-06 20:57:50 +0000184unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
185 if (rel.reloc.is<ELFRel *>())
186 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
187 else
188 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000189}
190
Kate Stoneb9c1b512016-09-06 20:57:50 +0000191unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
192 if (rel.reloc.is<ELFRel *>())
193 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
194 else
195 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000196}
197
Kate Stoneb9c1b512016-09-06 20:57:50 +0000198unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
199 if (rel.reloc.is<ELFRel *>())
200 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
201 else
202 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000203}
204
Kate Stoneb9c1b512016-09-06 20:57:50 +0000205unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
206 if (rel.reloc.is<ELFRel *>())
207 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
208 else
209 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000210}
211
Kate Stoneb9c1b512016-09-06 20:57:50 +0000212unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
213 if (rel.reloc.is<ELFRel *>())
214 return rel.reloc.get<ELFRel *>()->r_offset;
215 else
216 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000217}
218
Kate Stoneb9c1b512016-09-06 20:57:50 +0000219unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
220 if (rel.reloc.is<ELFRel *>())
221 return rel.reloc.get<ELFRel *>()->r_offset;
222 else
223 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000224}
225
Kate Stoneb9c1b512016-09-06 20:57:50 +0000226unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
227 if (rel.reloc.is<ELFRel *>())
228 return 0;
229 else
230 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000231}
232
Kate Stoneb9c1b512016-09-06 20:57:50 +0000233unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
234 if (rel.reloc.is<ELFRel *>())
235 return 0;
236 else
237 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000238}
239
Stephen Wilson499b40e2011-03-30 16:07:05 +0000240} // end anonymous namespace
241
Pavel Labathf55aea72019-01-09 16:50:45 +0000242static user_id_t SegmentID(size_t PHdrIndex) { return ~PHdrIndex; }
243
Kate Stoneb9c1b512016-09-06 20:57:50 +0000244bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
245 // Read all fields.
246 if (data.GetU32(offset, &n_namesz, 3) == NULL)
247 return false;
Ed Mastec113ff82013-12-02 17:49:13 +0000248
Adrian Prantl05097242018-04-30 16:49:04 +0000249 // The name field is required to be nul-terminated, and n_namesz includes the
250 // terminating nul in observed implementations (contrary to the ELF-64 spec).
251 // A special case is needed for cores generated by some older Linux versions,
252 // which write a note named "CORE" without a nul terminator and n_namesz = 4.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000253 if (n_namesz == 4) {
254 char buf[4];
255 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
256 return false;
257 if (strncmp(buf, "CORE", 4) == 0) {
258 n_name = "CORE";
259 *offset += 4;
260 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000261 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000262 }
Ed Mastec113ff82013-12-02 17:49:13 +0000263
Kate Stoneb9c1b512016-09-06 20:57:50 +0000264 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
265 if (cstr == NULL) {
266 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
267 if (log)
268 log->Printf("Failed to parse note name lacking nul terminator");
Ed Mastec113ff82013-12-02 17:49:13 +0000269
Kate Stoneb9c1b512016-09-06 20:57:50 +0000270 return false;
271 }
272 n_name = cstr;
273 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000274}
275
Nitesh Jain706c5202017-03-31 11:06:25 +0000276static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
277 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
278 uint32_t endian = header.e_ident[EI_DATA];
Kate Stoneb9c1b512016-09-06 20:57:50 +0000279 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
Nitesh Jain706c5202017-03-31 11:06:25 +0000280 uint32_t fileclass = header.e_ident[EI_CLASS];
281
Adrian Prantl05097242018-04-30 16:49:04 +0000282 // If there aren't any elf flags available (e.g core elf file) then return
283 // default
Nitesh Jain706c5202017-03-31 11:06:25 +0000284 // 32 or 64 bit arch (without any architecture revision) based on object file's class.
285 if (header.e_type == ET_CORE) {
286 switch (fileclass) {
287 case llvm::ELF::ELFCLASS32:
288 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
289 : ArchSpec::eMIPSSubType_mips32;
290 case llvm::ELF::ELFCLASS64:
291 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
292 : ArchSpec::eMIPSSubType_mips64;
293 default:
294 return arch_variant;
295 }
296 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000297
Kate Stoneb9c1b512016-09-06 20:57:50 +0000298 switch (mips_arch) {
299 case llvm::ELF::EF_MIPS_ARCH_1:
300 case llvm::ELF::EF_MIPS_ARCH_2:
301 case llvm::ELF::EF_MIPS_ARCH_32:
302 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
303 : ArchSpec::eMIPSSubType_mips32;
304 case llvm::ELF::EF_MIPS_ARCH_32R2:
305 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
306 : ArchSpec::eMIPSSubType_mips32r2;
307 case llvm::ELF::EF_MIPS_ARCH_32R6:
308 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
309 : ArchSpec::eMIPSSubType_mips32r6;
310 case llvm::ELF::EF_MIPS_ARCH_3:
311 case llvm::ELF::EF_MIPS_ARCH_4:
312 case llvm::ELF::EF_MIPS_ARCH_5:
313 case llvm::ELF::EF_MIPS_ARCH_64:
314 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
315 : ArchSpec::eMIPSSubType_mips64;
316 case llvm::ELF::EF_MIPS_ARCH_64R2:
317 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
318 : ArchSpec::eMIPSSubType_mips64r2;
319 case llvm::ELF::EF_MIPS_ARCH_64R6:
320 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
321 : ArchSpec::eMIPSSubType_mips64r6;
322 default:
323 break;
324 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000325
Kate Stoneb9c1b512016-09-06 20:57:50 +0000326 return arch_variant;
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000327}
328
Kate Stoneb9c1b512016-09-06 20:57:50 +0000329static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
330 if (header.e_machine == llvm::ELF::EM_MIPS)
Nitesh Jain706c5202017-03-31 11:06:25 +0000331 return mipsVariantFromElfFlags(header);
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000332
Jonas Devliegheref8819bd2019-03-27 16:23:50 +0000333 return LLDB_INVALID_CPUTYPE;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000334}
335
Todd Fiala4339f3a2014-03-25 19:29:09 +0000336// Arbitrary constant used as UUID prefix for core files.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000337const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000338
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000339// Static methods.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000340void ObjectFileELF::Initialize() {
341 PluginManager::RegisterPlugin(GetPluginNameStatic(),
342 GetPluginDescriptionStatic(), CreateInstance,
343 CreateMemoryInstance, GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000344}
345
Kate Stoneb9c1b512016-09-06 20:57:50 +0000346void ObjectFileELF::Terminate() {
347 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000348}
349
Kate Stoneb9c1b512016-09-06 20:57:50 +0000350lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
351 static ConstString g_name("elf");
352 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000353}
354
Kate Stoneb9c1b512016-09-06 20:57:50 +0000355const char *ObjectFileELF::GetPluginDescriptionStatic() {
356 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000357}
358
Kate Stoneb9c1b512016-09-06 20:57:50 +0000359ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
360 DataBufferSP &data_sp,
361 lldb::offset_t data_offset,
362 const lldb_private::FileSpec *file,
363 lldb::offset_t file_offset,
364 lldb::offset_t length) {
365 if (!data_sp) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000366 data_sp = MapFileData(*file, length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000367 if (!data_sp)
368 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000369 data_offset = 0;
370 }
371
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000372 assert(data_sp);
373
374 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
375 return nullptr;
376
377 const uint8_t *magic = data_sp->GetBytes() + data_offset;
378 if (!ELFHeader::MagicBytesMatch(magic))
379 return nullptr;
380
381 // Update the data to contain the entire file if it doesn't already
382 if (data_sp->GetByteSize() < length) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000383 data_sp = MapFileData(*file, length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000384 if (!data_sp)
385 return nullptr;
386 data_offset = 0;
387 magic = data_sp->GetBytes();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000388 }
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000389
390 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
391 if (address_size == 4 || address_size == 8) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000392 std::unique_ptr<ObjectFileELF> objfile_up(new ObjectFileELF(
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000393 module_sp, data_sp, data_offset, file, file_offset, length));
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000394 ArchSpec spec = objfile_up->GetArchitecture();
395 if (spec && objfile_up->SetModulesArchitecture(spec))
396 return objfile_up.release();
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000397 }
398
Kate Stoneb9c1b512016-09-06 20:57:50 +0000399 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400}
401
Kate Stoneb9c1b512016-09-06 20:57:50 +0000402ObjectFile *ObjectFileELF::CreateMemoryInstance(
403 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
404 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
405 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) {
406 const uint8_t *magic = data_sp->GetBytes();
407 if (ELFHeader::MagicBytesMatch(magic)) {
408 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
409 if (address_size == 4 || address_size == 8) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000410 std::unique_ptr<ObjectFileELF> objfile_up(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000411 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000412 ArchSpec spec = objfile_up->GetArchitecture();
413 if (spec && objfile_up->SetModulesArchitecture(spec))
414 return objfile_up.release();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000415 }
Andrew MacPherson17220c12014-03-05 10:12:43 +0000416 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000417 }
418 return NULL;
Greg Claytonc9660542012-02-05 02:38:54 +0000419}
420
Kate Stoneb9c1b512016-09-06 20:57:50 +0000421bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp,
422 lldb::addr_t data_offset,
423 lldb::addr_t data_length) {
424 if (data_sp &&
425 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) {
426 const uint8_t *magic = data_sp->GetBytes() + data_offset;
427 return ELFHeader::MagicBytesMatch(magic);
428 }
429 return false;
Michael Sartain9f0013d2013-05-17 00:20:21 +0000430}
Greg Claytonc9660542012-02-05 02:38:54 +0000431
Michael Sartain9f4517a2013-07-03 01:52:14 +0000432/*
433 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
434 *
435 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
436 * code or tables extracted from it, as desired without restriction.
437 */
Kate Stoneb9c1b512016-09-06 20:57:50 +0000438static uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size) {
439 static const uint32_t g_crc32_tab[] = {
440 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
441 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
442 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
443 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
444 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
445 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
446 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
447 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
448 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
449 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
450 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
451 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
452 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
453 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
454 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
455 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
456 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
457 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
458 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
459 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
460 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
461 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
462 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
463 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
464 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
465 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
466 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
467 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
468 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
469 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
470 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
471 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
472 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
473 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
474 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
475 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
476 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
477 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
478 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
479 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
480 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
481 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
482 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
483 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000484
Kate Stoneb9c1b512016-09-06 20:57:50 +0000485 crc = crc ^ ~0U;
486 while (size--)
487 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
488 return crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000489}
490
Kate Stoneb9c1b512016-09-06 20:57:50 +0000491static uint32_t calc_gnu_debuglink_crc32(const void *buf, size_t size) {
492 return calc_crc32(0U, buf, size);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000493}
494
Kate Stoneb9c1b512016-09-06 20:57:50 +0000495uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32(
496 const ProgramHeaderColl &program_headers, DataExtractor &object_data) {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000497
Kate Stoneb9c1b512016-09-06 20:57:50 +0000498 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000499
Pavel Labath5ea7ecd2018-12-12 14:20:28 +0000500 for (const ELFProgramHeader &H : program_headers) {
501 if (H.p_type == llvm::ELF::PT_NOTE) {
502 const elf_off ph_offset = H.p_offset;
503 const size_t ph_size = H.p_filesz;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000504
Kate Stoneb9c1b512016-09-06 20:57:50 +0000505 DataExtractor segment_data;
506 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
Adrian Prantl05097242018-04-30 16:49:04 +0000507 // The ELF program header contained incorrect data, probably corefile
508 // is incomplete or corrupted.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000509 break;
510 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000511
Kate Stoneb9c1b512016-09-06 20:57:50 +0000512 core_notes_crc = calc_crc32(core_notes_crc, segment_data.GetDataStart(),
513 segment_data.GetByteSize());
Todd Fiala4339f3a2014-03-25 19:29:09 +0000514 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000515 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000516
Kate Stoneb9c1b512016-09-06 20:57:50 +0000517 return core_notes_crc;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000518}
519
Kate Stoneb9c1b512016-09-06 20:57:50 +0000520static const char *OSABIAsCString(unsigned char osabi_byte) {
521#define _MAKE_OSABI_CASE(x) \
522 case x: \
523 return #x
524 switch (osabi_byte) {
525 _MAKE_OSABI_CASE(ELFOSABI_NONE);
526 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
527 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
528 _MAKE_OSABI_CASE(ELFOSABI_GNU);
529 _MAKE_OSABI_CASE(ELFOSABI_HURD);
530 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
531 _MAKE_OSABI_CASE(ELFOSABI_AIX);
532 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
533 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
534 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
535 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
536 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
537 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
538 _MAKE_OSABI_CASE(ELFOSABI_NSK);
539 _MAKE_OSABI_CASE(ELFOSABI_AROS);
540 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
541 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
542 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
543 _MAKE_OSABI_CASE(ELFOSABI_ARM);
544 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
545 default:
546 return "<unknown-osabi>";
547 }
Todd Fialab91de782014-06-27 16:52:49 +0000548#undef _MAKE_OSABI_CASE
549}
550
Ed Mastef6a13122015-06-05 13:03:08 +0000551//
552// WARNING : This function is being deprecated
Adrian Prantl05097242018-04-30 16:49:04 +0000553// It's functionality has moved to ArchSpec::SetArchitecture This function is
554// only being kept to validate the move.
Ed Mastef6a13122015-06-05 13:03:08 +0000555//
556// TODO : Remove this function
Kate Stoneb9c1b512016-09-06 20:57:50 +0000557static bool GetOsFromOSABI(unsigned char osabi_byte,
558 llvm::Triple::OSType &ostype) {
559 switch (osabi_byte) {
560 case ELFOSABI_AIX:
561 ostype = llvm::Triple::OSType::AIX;
562 break;
563 case ELFOSABI_FREEBSD:
564 ostype = llvm::Triple::OSType::FreeBSD;
565 break;
566 case ELFOSABI_GNU:
567 ostype = llvm::Triple::OSType::Linux;
568 break;
569 case ELFOSABI_NETBSD:
570 ostype = llvm::Triple::OSType::NetBSD;
571 break;
572 case ELFOSABI_OPENBSD:
573 ostype = llvm::Triple::OSType::OpenBSD;
574 break;
575 case ELFOSABI_SOLARIS:
576 ostype = llvm::Triple::OSType::Solaris;
577 break;
578 default:
579 ostype = llvm::Triple::OSType::UnknownOS;
580 }
581 return ostype != llvm::Triple::OSType::UnknownOS;
Todd Fialab91de782014-06-27 16:52:49 +0000582}
583
Kate Stoneb9c1b512016-09-06 20:57:50 +0000584size_t ObjectFileELF::GetModuleSpecifications(
585 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
586 lldb::offset_t data_offset, lldb::offset_t file_offset,
587 lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
588 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Todd Fialab91de782014-06-27 16:52:49 +0000589
Kate Stoneb9c1b512016-09-06 20:57:50 +0000590 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000591
Kate Stoneb9c1b512016-09-06 20:57:50 +0000592 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
593 DataExtractor data;
594 data.SetData(data_sp);
595 elf::ELFHeader header;
Pavel Labath23ccc292017-01-31 23:09:46 +0000596 lldb::offset_t header_offset = data_offset;
597 if (header.Parse(data, &header_offset)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000598 if (data_sp) {
599 ModuleSpec spec(file);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000600
Kate Stoneb9c1b512016-09-06 20:57:50 +0000601 const uint32_t sub_type = subTypeFromElfHeader(header);
602 spec.GetArchitecture().SetArchitecture(
603 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000604
Kate Stoneb9c1b512016-09-06 20:57:50 +0000605 if (spec.GetArchitecture().IsValid()) {
606 llvm::Triple::OSType ostype;
607 llvm::Triple::VendorType vendor;
608 llvm::Triple::OSType spec_ostype =
609 spec.GetArchitecture().GetTriple().getOS();
Todd Fialab91de782014-06-27 16:52:49 +0000610
Kate Stoneb9c1b512016-09-06 20:57:50 +0000611 if (log)
612 log->Printf("ObjectFileELF::%s file '%s' module OSABI: %s",
613 __FUNCTION__, file.GetPath().c_str(),
614 OSABIAsCString(header.e_ident[EI_OSABI]));
Ed Mastef6a13122015-06-05 13:03:08 +0000615
Kate Stoneb9c1b512016-09-06 20:57:50 +0000616 // SetArchitecture should have set the vendor to unknown
617 vendor = spec.GetArchitecture().GetTriple().getVendor();
618 assert(vendor == llvm::Triple::UnknownVendor);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +0000619 UNUSED_IF_ASSERT_DISABLED(vendor);
Ed Mastef6a13122015-06-05 13:03:08 +0000620
Kate Stoneb9c1b512016-09-06 20:57:50 +0000621 //
622 // Validate it is ok to remove GetOsFromOSABI
623 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
624 assert(spec_ostype == ostype);
625 if (spec_ostype != llvm::Triple::OSType::UnknownOS) {
626 if (log)
627 log->Printf("ObjectFileELF::%s file '%s' set ELF module OS type "
628 "from ELF header OSABI.",
629 __FUNCTION__, file.GetPath().c_str());
630 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000631
Pavel Labath4f033122018-02-05 17:25:40 +0000632 data_sp = MapFileData(file, -1, file_offset);
633 if (data_sp)
634 data.SetData(data_sp);
Adrian Prantl05097242018-04-30 16:49:04 +0000635 // In case there is header extension in the section #0, the header we
636 // parsed above could have sentinel values for e_phnum, e_shnum, and
637 // e_shstrndx. In this case we need to reparse the header with a
638 // bigger data source to get the actual values.
Pavel Labath4f033122018-02-05 17:25:40 +0000639 if (header.HasHeaderExtension()) {
640 lldb::offset_t header_offset = data_offset;
641 header.Parse(data, &header_offset);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000642 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000643
Kate Stoneb9c1b512016-09-06 20:57:50 +0000644 uint32_t gnu_debuglink_crc = 0;
645 std::string gnu_debuglink_file;
646 SectionHeaderColl section_headers;
647 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000648
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000649 GetSectionHeaderInfo(section_headers, data, header, uuid,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650 gnu_debuglink_file, gnu_debuglink_crc,
651 spec.GetArchitecture());
Ravitheja Addepally15f89c42016-01-19 12:55:21 +0000652
Kate Stoneb9c1b512016-09-06 20:57:50 +0000653 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple();
Todd Fialab91de782014-06-27 16:52:49 +0000654
Kate Stoneb9c1b512016-09-06 20:57:50 +0000655 if (log)
656 log->Printf("ObjectFileELF::%s file '%s' module set to triple: %s "
657 "(architecture %s)",
658 __FUNCTION__, file.GetPath().c_str(),
659 spec_triple.getTriple().c_str(),
660 spec.GetArchitecture().GetArchitectureName());
Todd Fialab91de782014-06-27 16:52:49 +0000661
Kate Stoneb9c1b512016-09-06 20:57:50 +0000662 if (!uuid.IsValid()) {
663 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000664
Kate Stoneb9c1b512016-09-06 20:57:50 +0000665 if (!gnu_debuglink_crc) {
Pavel Labathf9d16472017-05-15 13:02:37 +0000666 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000667 lldb_private::Timer scoped_timer(
Pavel Labathf9d16472017-05-15 13:02:37 +0000668 func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000669 "Calculating module crc32 %s with size %" PRIu64 " KiB",
670 file.GetLastPathComponent().AsCString(),
Jonas Devlieghere59b78bc2018-11-01 04:45:28 +0000671 (FileSystem::Instance().GetByteSize(file) - file_offset) /
672 1024);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000673
Kate Stoneb9c1b512016-09-06 20:57:50 +0000674 // For core files - which usually don't happen to have a
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000675 // gnu_debuglink, and are pretty bulky - calculating whole
676 // contents crc32 would be too much of luxury. Thus we will need
677 // to fallback to something simpler.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000678 if (header.e_type == llvm::ELF::ET_CORE) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000679 ProgramHeaderColl program_headers;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000680 GetProgramHeaderInfo(program_headers, data, header);
Michael Sartainc836ae72013-05-23 20:57:03 +0000681
Kate Stoneb9c1b512016-09-06 20:57:50 +0000682 core_notes_crc =
683 CalculateELFNotesSegmentsCRC32(program_headers, data);
684 } else {
Pavel Labath4f033122018-02-05 17:25:40 +0000685 gnu_debuglink_crc = calc_gnu_debuglink_crc32(
686 data.GetDataStart(), data.GetByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000687 }
688 }
Pavel Labath77c397f2018-06-29 11:20:29 +0000689 using u32le = llvm::support::ulittle32_t;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000690 if (gnu_debuglink_crc) {
691 // Use 4 bytes of crc from the .gnu_debuglink section.
Pavel Labath77c397f2018-06-29 11:20:29 +0000692 u32le data(gnu_debuglink_crc);
693 uuid = UUID::fromData(&data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000694 } else if (core_notes_crc) {
695 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
Adrian Prantl05097242018-04-30 16:49:04 +0000696 // it look different form .gnu_debuglink crc followed by 4 bytes
697 // of note segments crc.
Pavel Labath77c397f2018-06-29 11:20:29 +0000698 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
699 uuid = UUID::fromData(data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000700 }
701 }
702
703 specs.Append(spec);
704 }
705 }
706 }
707 }
708
709 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000710}
711
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000712// PluginInterface protocol
Kate Stoneb9c1b512016-09-06 20:57:50 +0000713lldb_private::ConstString ObjectFileELF::GetPluginName() {
714 return GetPluginNameStatic();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000715}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000716
Kate Stoneb9c1b512016-09-06 20:57:50 +0000717uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000718// ObjectFile protocol
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000719
Kate Stoneb9c1b512016-09-06 20:57:50 +0000720ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
721 DataBufferSP &data_sp, lldb::offset_t data_offset,
722 const FileSpec *file, lldb::offset_t file_offset,
723 lldb::offset_t length)
724 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
725 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
726 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000727 m_filespec_up(), m_entry_point_address(), m_arch_spec() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000728 if (file)
729 m_file = *file;
730 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000731}
732
Kate Stoneb9c1b512016-09-06 20:57:50 +0000733ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
734 DataBufferSP &header_data_sp,
735 const lldb::ProcessSP &process_sp,
736 addr_t header_addr)
737 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
738 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
739 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000740 m_filespec_up(), m_entry_point_address(), m_arch_spec() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000741 ::memset(&m_header, 0, sizeof(m_header));
Andrew MacPherson17220c12014-03-05 10:12:43 +0000742}
743
Kate Stoneb9c1b512016-09-06 20:57:50 +0000744ObjectFileELF::~ObjectFileELF() {}
745
746bool ObjectFileELF::IsExecutable() const {
747 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000748}
749
Kate Stoneb9c1b512016-09-06 20:57:50 +0000750bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
751 bool value_is_offset) {
752 ModuleSP module_sp = GetModule();
753 if (module_sp) {
754 size_t num_loaded_sections = 0;
755 SectionList *section_list = GetSectionList();
756 if (section_list) {
757 if (!value_is_offset) {
Pavel Labath976af432019-01-10 09:32:31 +0000758 addr_t base = GetBaseAddress().GetFileAddress();
759 if (base == LLDB_INVALID_ADDRESS)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000760 return false;
Pavel Labath976af432019-01-10 09:32:31 +0000761 value -= base;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000762 }
763
764 const size_t num_sections = section_list->GetSize();
765 size_t sect_idx = 0;
766
767 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
Adrian Prantl05097242018-04-30 16:49:04 +0000768 // Iterate through the object file sections to find all of the sections
769 // that have SHF_ALLOC in their flag bits.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000770 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
Pavel Labathf55aea72019-01-09 16:50:45 +0000771 if (section_sp->Test(SHF_ALLOC) ||
772 section_sp->GetType() == eSectionTypeContainer) {
Pavel Labathec03d7e2018-02-28 20:42:29 +0000773 lldb::addr_t load_addr = section_sp->GetFileAddress();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000774 // We don't want to update the load address of a section with type
775 // eSectionTypeAbsoluteAddress as they already have the absolute load
Adrian Prantl05097242018-04-30 16:49:04 +0000776 // address already specified
Kate Stoneb9c1b512016-09-06 20:57:50 +0000777 if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
778 load_addr += value;
779
780 // On 32-bit systems the load address have to fit into 4 bytes. The
Adrian Prantl05097242018-04-30 16:49:04 +0000781 // rest of the bytes are the overflow from the addition.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000782 if (GetAddressByteSize() == 4)
783 load_addr &= 0xFFFFFFFF;
784
785 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
786 load_addr))
787 ++num_loaded_sections;
788 }
789 }
790 return num_loaded_sections > 0;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000791 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000792 }
793 return false;
794}
795
796ByteOrder ObjectFileELF::GetByteOrder() const {
797 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
798 return eByteOrderBig;
799 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
800 return eByteOrderLittle;
801 return eByteOrderInvalid;
802}
803
804uint32_t ObjectFileELF::GetAddressByteSize() const {
805 return m_data.GetAddressByteSize();
806}
807
808AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
809 Symtab *symtab = GetSymtab();
810 if (!symtab)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000811 return AddressClass::eUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000812
Adrian Prantl05097242018-04-30 16:49:04 +0000813 // The address class is determined based on the symtab. Ask it from the
814 // object file what contains the symtab information.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000815 ObjectFile *symtab_objfile = symtab->GetObjectFile();
816 if (symtab_objfile != nullptr && symtab_objfile != this)
817 return symtab_objfile->GetAddressClass(file_addr);
818
819 auto res = ObjectFile::GetAddressClass(file_addr);
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000820 if (res != AddressClass::eCode)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000821 return res;
822
823 auto ub = m_address_class_map.upper_bound(file_addr);
824 if (ub == m_address_class_map.begin()) {
Adrian Prantl05097242018-04-30 16:49:04 +0000825 // No entry in the address class map before the address. Return default
826 // address class for an address in a code section.
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000827 return AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000828 }
829
830 // Move iterator to the address class entry preceding address
831 --ub;
832
833 return ub->second;
834}
835
836size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
Pavel Labath0d38e4f2018-12-18 15:56:45 +0000837 return std::distance(m_section_headers.begin(), I);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000838}
839
840size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
Pavel Labath0d38e4f2018-12-18 15:56:45 +0000841 return std::distance(m_section_headers.begin(), I);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000842}
843
844bool ObjectFileELF::ParseHeader() {
845 lldb::offset_t offset = 0;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000846 return m_header.Parse(m_data, &offset);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000847}
848
Pavel Labathbd334ef2019-02-11 16:14:02 +0000849UUID ObjectFileELF::GetUUID() {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000850 // Need to parse the section list to get the UUIDs, so make sure that's been
851 // done.
852 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Pavel Labathbd334ef2019-02-11 16:14:02 +0000853 return UUID();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000854
Pavel Labathbd334ef2019-02-11 16:14:02 +0000855 if (!m_uuid) {
856 using u32le = llvm::support::ulittle32_t;
857 if (GetType() == ObjectFile::eTypeCoreFile) {
858 uint32_t core_notes_crc = 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000859
Pavel Labathbd334ef2019-02-11 16:14:02 +0000860 if (!ParseProgramHeaders())
861 return UUID();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000862
Pavel Labathbd334ef2019-02-11 16:14:02 +0000863 core_notes_crc =
864 CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000865
Pavel Labathbd334ef2019-02-11 16:14:02 +0000866 if (core_notes_crc) {
867 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
868 // look different form .gnu_debuglink crc - followed by 4 bytes of note
869 // segments crc.
870 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
871 m_uuid = UUID::fromData(data, sizeof(data));
872 }
873 } else {
874 if (!m_gnu_debuglink_crc)
875 m_gnu_debuglink_crc = calc_gnu_debuglink_crc32(m_data.GetDataStart(),
876 m_data.GetByteSize());
877 if (m_gnu_debuglink_crc) {
878 // Use 4 bytes of crc from the .gnu_debuglink section.
879 u32le data(m_gnu_debuglink_crc);
880 m_uuid = UUID::fromData(&data, sizeof(data));
881 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000882 }
883 }
884
Pavel Labathbd334ef2019-02-11 16:14:02 +0000885 return m_uuid;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000886}
887
Kate Stoneb9c1b512016-09-06 20:57:50 +0000888lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() {
889 FileSpecList file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000890
Kate Stoneb9c1b512016-09-06 20:57:50 +0000891 if (!m_gnu_debuglink_file.empty()) {
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000892 FileSpec file_spec(m_gnu_debuglink_file);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000893 file_spec_list.Append(file_spec);
894 }
895 return file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000896}
897
Kate Stoneb9c1b512016-09-06 20:57:50 +0000898uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
899 size_t num_modules = ParseDependentModules();
900 uint32_t num_specs = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000901
Kate Stoneb9c1b512016-09-06 20:57:50 +0000902 for (unsigned i = 0; i < num_modules; ++i) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +0000903 if (files.AppendIfUnique(m_filespec_up->GetFileSpecAtIndex(i)))
Kate Stoneb9c1b512016-09-06 20:57:50 +0000904 num_specs++;
905 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000906
Kate Stoneb9c1b512016-09-06 20:57:50 +0000907 return num_specs;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000908}
909
Kate Stoneb9c1b512016-09-06 20:57:50 +0000910Address ObjectFileELF::GetImageInfoAddress(Target *target) {
911 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000912 return Address();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000913
914 SectionList *section_list = GetSectionList();
915 if (!section_list)
916 return Address();
917
918 // Find the SHT_DYNAMIC (.dynamic) section.
919 SectionSP dynsym_section_sp(
920 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
921 if (!dynsym_section_sp)
922 return Address();
923 assert(dynsym_section_sp->GetObjectFile() == this);
924
925 user_id_t dynsym_id = dynsym_section_sp->GetID();
926 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
927 if (!dynsym_hdr)
928 return Address();
929
930 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
931 ELFDynamic &symbol = m_dynamic_symbols[i];
932
933 if (symbol.d_tag == DT_DEBUG) {
Adrian Prantl05097242018-04-30 16:49:04 +0000934 // Compute the offset as the number of previous entries plus the size of
935 // d_tag.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000936 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
937 return Address(dynsym_section_sp, offset);
938 }
939 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
940 // exists in non-PIE.
941 else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
942 symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
943 target) {
944 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
945 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
946 if (dyn_base == LLDB_INVALID_ADDRESS)
947 return Address();
948
Zachary Turner97206d52017-05-12 04:51:55 +0000949 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000950 if (symbol.d_tag == DT_MIPS_RLD_MAP) {
951 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
952 Address addr;
953 if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
954 addr))
955 return addr;
956 }
957 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) {
958 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer,
959 // relative to the address of the tag.
960 uint64_t rel_offset;
961 rel_offset = target->ReadUnsignedIntegerFromMemory(
962 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error);
963 if (error.Success() && rel_offset != UINT64_MAX) {
964 Address addr;
965 addr_t debug_ptr_address =
966 dyn_base + (offset - GetAddressByteSize()) + rel_offset;
967 addr.SetOffset(debug_ptr_address);
968 return addr;
969 }
970 }
971 }
972 }
973
974 return Address();
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000975}
976
Kate Stoneb9c1b512016-09-06 20:57:50 +0000977lldb_private::Address ObjectFileELF::GetEntryPointAddress() {
978 if (m_entry_point_address.IsValid())
Stephen Wilsond126c8c2011-03-08 04:12:15 +0000979 return m_entry_point_address;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000980
981 if (!ParseHeader() || !IsExecutable())
982 return m_entry_point_address;
983
984 SectionList *section_list = GetSectionList();
985 addr_t offset = m_header.e_entry;
986
987 if (!section_list)
988 m_entry_point_address.SetOffset(offset);
989 else
990 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
991 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +0000992}
993
Pavel Labath976af432019-01-10 09:32:31 +0000994Address ObjectFileELF::GetBaseAddress() {
995 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) {
996 const ELFProgramHeader &H = EnumPHdr.value();
Pavel Labath43ddbc02019-01-11 10:18:40 +0000997 if (H.p_type != PT_LOAD)
Pavel Labath976af432019-01-10 09:32:31 +0000998 continue;
999
1000 return Address(
1001 GetSectionList()->FindSectionByID(SegmentID(EnumPHdr.index())), 0);
1002 }
1003 return LLDB_INVALID_ADDRESS;
1004}
1005
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001006// ParseDependentModules
Kate Stoneb9c1b512016-09-06 20:57:50 +00001007size_t ObjectFileELF::ParseDependentModules() {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001008 if (m_filespec_up)
1009 return m_filespec_up->GetSize();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001010
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001011 m_filespec_up.reset(new FileSpecList());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001012
1013 if (!ParseSectionHeaders())
1014 return 0;
1015
1016 SectionList *section_list = GetSectionList();
1017 if (!section_list)
1018 return 0;
1019
1020 // Find the SHT_DYNAMIC section.
1021 Section *dynsym =
1022 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
1023 .get();
1024 if (!dynsym)
1025 return 0;
1026 assert(dynsym->GetObjectFile() == this);
1027
1028 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID());
1029 if (!header)
1030 return 0;
1031 // sh_link: section header index of string table used by entries in the
1032 // section.
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001033 Section *dynstr = section_list->FindSectionByID(header->sh_link).get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001034 if (!dynstr)
1035 return 0;
1036
1037 DataExtractor dynsym_data;
1038 DataExtractor dynstr_data;
1039 if (ReadSectionData(dynsym, dynsym_data) &&
1040 ReadSectionData(dynstr, dynstr_data)) {
1041 ELFDynamic symbol;
1042 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1043 lldb::offset_t offset = 0;
1044
1045 // The only type of entries we are concerned with are tagged DT_NEEDED,
1046 // yielding the name of a required library.
1047 while (offset < section_size) {
1048 if (!symbol.Parse(dynsym_data, &offset))
1049 break;
1050
1051 if (symbol.d_tag != DT_NEEDED)
1052 continue;
1053
1054 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1055 const char *lib_name = dynstr_data.PeekCStr(str_index);
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +00001056 FileSpec file_spec(lib_name);
1057 FileSystem::Instance().Resolve(file_spec);
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001058 m_filespec_up->Append(file_spec);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001059 }
1060 }
1061
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001062 return m_filespec_up->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001063}
1064
Todd Fiala4339f3a2014-03-25 19:29:09 +00001065// GetProgramHeaderInfo
Kate Stoneb9c1b512016-09-06 20:57:50 +00001066size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001067 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001068 const ELFHeader &header) {
1069 // We have already parsed the program headers
1070 if (!program_headers.empty())
Todd Fiala4339f3a2014-03-25 19:29:09 +00001071 return program_headers.size();
1072
Kate Stoneb9c1b512016-09-06 20:57:50 +00001073 // If there are no program headers to read we are done.
1074 if (header.e_phnum == 0)
1075 return 0;
1076
1077 program_headers.resize(header.e_phnum);
1078 if (program_headers.size() != header.e_phnum)
1079 return 0;
1080
1081 const size_t ph_size = header.e_phnum * header.e_phentsize;
1082 const elf_off ph_offset = header.e_phoff;
1083 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001084 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001085 return 0;
1086
1087 uint32_t idx;
1088 lldb::offset_t offset;
1089 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001090 if (!program_headers[idx].Parse(data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001091 break;
1092 }
1093
1094 if (idx < program_headers.size())
1095 program_headers.resize(idx);
1096
1097 return program_headers.size();
Todd Fiala4339f3a2014-03-25 19:29:09 +00001098}
1099
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001100// ParseProgramHeaders
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00001101bool ObjectFileELF::ParseProgramHeaders() {
1102 return GetProgramHeaderInfo(m_program_headers, m_data, m_header) != 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001103}
1104
Zachary Turner97206d52017-05-12 04:51:55 +00001105lldb_private::Status
Kate Stoneb9c1b512016-09-06 20:57:50 +00001106ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
1107 lldb_private::ArchSpec &arch_spec,
1108 lldb_private::UUID &uuid) {
1109 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Zachary Turner97206d52017-05-12 04:51:55 +00001110 Status error;
Todd Fialab91de782014-06-27 16:52:49 +00001111
Kate Stoneb9c1b512016-09-06 20:57:50 +00001112 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001113
Kate Stoneb9c1b512016-09-06 20:57:50 +00001114 while (true) {
1115 // Parse the note header. If this fails, bail out.
1116 const lldb::offset_t note_offset = offset;
1117 ELFNote note = ELFNote();
1118 if (!note.Parse(data, &offset)) {
1119 // We're done.
1120 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001121 }
Todd Fialab91de782014-06-27 16:52:49 +00001122
Kate Stoneb9c1b512016-09-06 20:57:50 +00001123 if (log)
1124 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32,
1125 __FUNCTION__, note.n_name.c_str(), note.n_type);
1126
1127 // Process FreeBSD ELF notes.
1128 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1129 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1130 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) {
1131 // Pull out the min version info.
1132 uint32_t version_info;
1133 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1134 error.SetErrorString("failed to read FreeBSD ABI note payload");
1135 return error;
1136 }
1137
1138 // Convert the version info into a major/minor number.
1139 const uint32_t version_major = version_info / 100000;
1140 const uint32_t version_minor = (version_info / 1000) % 100;
1141
1142 char os_name[32];
1143 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32,
1144 version_major, version_minor);
1145
1146 // Set the elf OS version to FreeBSD. Also clear the vendor.
1147 arch_spec.GetTriple().setOSName(os_name);
1148 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1149
1150 if (log)
1151 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32
1152 ".%" PRIu32,
1153 __FUNCTION__, version_major, version_minor,
1154 static_cast<uint32_t>(version_info % 1000));
1155 }
1156 // Process GNU ELF notes.
1157 else if (note.n_name == LLDB_NT_OWNER_GNU) {
1158 switch (note.n_type) {
1159 case LLDB_NT_GNU_ABI_TAG:
1160 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) {
1161 // Pull out the min OS version supporting the ABI.
1162 uint32_t version_info[4];
1163 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) ==
1164 nullptr) {
1165 error.SetErrorString("failed to read GNU ABI note payload");
1166 return error;
1167 }
1168
1169 // Set the OS per the OS field.
1170 switch (version_info[0]) {
1171 case LLDB_NT_GNU_ABI_OS_LINUX:
1172 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1173 arch_spec.GetTriple().setVendor(
1174 llvm::Triple::VendorType::UnknownVendor);
1175 if (log)
1176 log->Printf(
1177 "ObjectFileELF::%s detected Linux, min version %" PRIu32
1178 ".%" PRIu32 ".%" PRIu32,
1179 __FUNCTION__, version_info[1], version_info[2],
1180 version_info[3]);
1181 // FIXME we have the minimal version number, we could be propagating
1182 // that. version_info[1] = OS Major, version_info[2] = OS Minor,
1183 // version_info[3] = Revision.
1184 break;
1185 case LLDB_NT_GNU_ABI_OS_HURD:
1186 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1187 arch_spec.GetTriple().setVendor(
1188 llvm::Triple::VendorType::UnknownVendor);
1189 if (log)
1190 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min "
1191 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1192 __FUNCTION__, version_info[1], version_info[2],
1193 version_info[3]);
1194 break;
1195 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1196 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris);
1197 arch_spec.GetTriple().setVendor(
1198 llvm::Triple::VendorType::UnknownVendor);
1199 if (log)
1200 log->Printf(
1201 "ObjectFileELF::%s detected Solaris, min version %" PRIu32
1202 ".%" PRIu32 ".%" PRIu32,
1203 __FUNCTION__, version_info[1], version_info[2],
1204 version_info[3]);
1205 break;
1206 default:
1207 if (log)
1208 log->Printf(
1209 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32
1210 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1211 __FUNCTION__, version_info[0], version_info[1],
1212 version_info[2], version_info[3]);
1213 break;
1214 }
1215 }
1216 break;
1217
1218 case LLDB_NT_GNU_BUILD_ID_TAG:
1219 // Only bother processing this if we don't already have the uuid set.
1220 if (!uuid.IsValid()) {
1221 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a
Pavel Labath77c397f2018-06-29 11:20:29 +00001222 // build-id of a different length. Accept it as long as it's at least
1223 // 4 bytes as it will be better than our own crc32.
1224 if (note.n_descsz >= 4) {
1225 if (const uint8_t *buf = data.PeekData(offset, note.n_descsz)) {
1226 // Save the build id as the UUID for the module.
1227 uuid = UUID::fromData(buf, note.n_descsz);
1228 } else {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001229 error.SetErrorString("failed to read GNU_BUILD_ID note payload");
1230 return error;
1231 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001232 }
1233 }
1234 break;
1235 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001236 if (arch_spec.IsMIPS() &&
1237 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1238 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform
1239 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001240 }
Michal Gorny4f134fb2019-02-20 14:31:06 +00001241 // Process NetBSD ELF executables and shared libraries
Kate Stoneb9c1b512016-09-06 20:57:50 +00001242 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
Michal Gorny4f134fb2019-02-20 14:31:06 +00001243 (note.n_type == LLDB_NT_NETBSD_IDENT_TAG) &&
1244 (note.n_descsz == LLDB_NT_NETBSD_IDENT_DESCSZ) &&
1245 (note.n_namesz == LLDB_NT_NETBSD_IDENT_NAMESZ)) {
1246 // Pull out the version info.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001247 uint32_t version_info;
1248 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1249 error.SetErrorString("failed to read NetBSD ABI note payload");
1250 return error;
1251 }
Michal Gorny4f134fb2019-02-20 14:31:06 +00001252 // Convert the version info into a major/minor/patch number.
1253 // #define __NetBSD_Version__ MMmmrrpp00
1254 //
1255 // M = major version
1256 // m = minor version; a minor number of 99 indicates current.
1257 // r = 0 (since NetBSD 3.0 not used)
1258 // p = patchlevel
1259 const uint32_t version_major = version_info / 100000000;
1260 const uint32_t version_minor = (version_info % 100000000) / 1000000;
1261 const uint32_t version_patch = (version_info % 10000) / 100;
1262 // Set the elf OS version to NetBSD. Also clear the vendor.
1263 arch_spec.GetTriple().setOSName(
1264 llvm::formatv("netbsd{0}.{1}.{2}", version_major, version_minor,
1265 version_patch).str());
1266 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1267 }
1268 // Process NetBSD ELF core(5) notes
1269 else if ((note.n_name == LLDB_NT_OWNER_NETBSDCORE) &&
1270 (note.n_type == LLDB_NT_NETBSD_PROCINFO)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001271 // Set the elf OS version to NetBSD. Also clear the vendor.
1272 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD);
1273 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001274 }
Kamil Rytarowski12801f12017-03-26 15:34:57 +00001275 // Process OpenBSD ELF notes.
1276 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) {
1277 // Set the elf OS version to OpenBSD. Also clear the vendor.
1278 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD);
1279 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001280 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) {
1281 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1282 arch_spec.GetTriple().setEnvironment(
1283 llvm::Triple::EnvironmentType::Android);
1284 } else if (note.n_name == LLDB_NT_OWNER_LINUX) {
1285 // This is sometimes found in core files and usually contains extended
1286 // register info
1287 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1288 } else if (note.n_name == LLDB_NT_OWNER_CORE) {
Adrian Prantl05097242018-04-30 16:49:04 +00001289 // Parse the NT_FILE to look for stuff in paths to shared libraries As
1290 // the contents look like this in a 64 bit ELF core file: count =
1291 // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index
1292 // start end file_ofs path =====
Adrian Prantl05097242018-04-30 16:49:04 +00001293 // 0x0000000000401000 0x0000000000000000 /tmp/a.out [ 1]
1294 // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [
1295 // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out
Kate Stoneb9c1b512016-09-06 20:57:50 +00001296 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
Adrian Prantl05097242018-04-30 16:49:04 +00001297 // /lib/x86_64-linux-gnu/libc-2.19.so [ 4] 0x00007fa79cba8000
1298 // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-
1299 // gnu/libc-2.19.so [ 5] 0x00007fa79cda7000 0x00007fa79cdab000
1300 // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [ 6]
1301 // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64
1302 // -linux-gnu/libc-2.19.so [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000
1303 // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [ 8]
1304 // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64
1305 // -linux-gnu/ld-2.19.so [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000
1306 // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs
1307 // the count, page_size, start, end, file_ofs are uint32_t For reference:
1308 // see readelf source code (in binutils).
Kate Stoneb9c1b512016-09-06 20:57:50 +00001309 if (note.n_type == NT_FILE) {
1310 uint64_t count = data.GetAddress(&offset);
1311 const char *cstr;
1312 data.GetAddress(&offset); // Skip page size
1313 offset += count * 3 *
1314 data.GetAddressByteSize(); // Skip all start/end/file_ofs
1315 for (size_t i = 0; i < count; ++i) {
1316 cstr = data.GetCStr(&offset);
1317 if (cstr == nullptr) {
1318 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read "
1319 "at an offset after the end "
1320 "(GetCStr returned nullptr)",
1321 __FUNCTION__);
1322 return error;
1323 }
1324 llvm::StringRef path(cstr);
Richard Chamberlaina0c82e12016-10-13 12:11:00 +00001325 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001326 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1327 break;
1328 }
1329 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001330 if (arch_spec.IsMIPS() &&
1331 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
Adrian Prantl05097242018-04-30 16:49:04 +00001332 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some
1333 // cases (e.g. compile with -nostdlib) Hence set OS to Linux
Leonard Mosescu9ba51572018-08-07 18:00:30 +00001334 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001335 }
1336 }
1337
Adrian Prantl05097242018-04-30 16:49:04 +00001338 // Calculate the offset of the next note just in case "offset" has been
1339 // used to poke at the contents of the note data
Kate Stoneb9c1b512016-09-06 20:57:50 +00001340 offset = note_offset + note.GetByteSize();
1341 }
1342
1343 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001344}
Michael Sartaina7499c92013-07-01 19:45:50 +00001345
Kate Stoneb9c1b512016-09-06 20:57:50 +00001346void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length,
1347 ArchSpec &arch_spec) {
1348 lldb::offset_t Offset = 0;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001349
Kate Stoneb9c1b512016-09-06 20:57:50 +00001350 uint8_t FormatVersion = data.GetU8(&Offset);
1351 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version)
1352 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001353
Kate Stoneb9c1b512016-09-06 20:57:50 +00001354 Offset = Offset + sizeof(uint32_t); // Section Length
1355 llvm::StringRef VendorName = data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001356
Kate Stoneb9c1b512016-09-06 20:57:50 +00001357 if (VendorName != "aeabi")
1358 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001359
Kate Stoneb9c1b512016-09-06 20:57:50 +00001360 if (arch_spec.GetTriple().getEnvironment() ==
1361 llvm::Triple::UnknownEnvironment)
1362 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001363
Kate Stoneb9c1b512016-09-06 20:57:50 +00001364 while (Offset < length) {
1365 uint8_t Tag = data.GetU8(&Offset);
1366 uint32_t Size = data.GetU32(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001367
Kate Stoneb9c1b512016-09-06 20:57:50 +00001368 if (Tag != llvm::ARMBuildAttrs::File || Size == 0)
1369 continue;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001370
Kate Stoneb9c1b512016-09-06 20:57:50 +00001371 while (Offset < length) {
1372 uint64_t Tag = data.GetULEB128(&Offset);
1373 switch (Tag) {
1374 default:
1375 if (Tag < 32)
1376 data.GetULEB128(&Offset);
1377 else if (Tag % 2 == 0)
1378 data.GetULEB128(&Offset);
1379 else
1380 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001381
Kate Stoneb9c1b512016-09-06 20:57:50 +00001382 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001383
Kate Stoneb9c1b512016-09-06 20:57:50 +00001384 case llvm::ARMBuildAttrs::CPU_raw_name:
1385 case llvm::ARMBuildAttrs::CPU_name:
1386 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001387
Kate Stoneb9c1b512016-09-06 20:57:50 +00001388 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001389
Kate Stoneb9c1b512016-09-06 20:57:50 +00001390 case llvm::ARMBuildAttrs::ABI_VFP_args: {
1391 uint64_t VFPArgs = data.GetULEB128(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001392
Kate Stoneb9c1b512016-09-06 20:57:50 +00001393 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) {
1394 if (arch_spec.GetTriple().getEnvironment() ==
1395 llvm::Triple::UnknownEnvironment ||
1396 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF)
1397 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001398
Kate Stoneb9c1b512016-09-06 20:57:50 +00001399 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1400 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) {
1401 if (arch_spec.GetTriple().getEnvironment() ==
1402 llvm::Triple::UnknownEnvironment ||
1403 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI)
1404 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001405
Kate Stoneb9c1b512016-09-06 20:57:50 +00001406 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001407 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001408
1409 break;
1410 }
1411 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001412 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001413 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001414}
Todd Fialab91de782014-06-27 16:52:49 +00001415
Michael Sartaina7499c92013-07-01 19:45:50 +00001416// GetSectionHeaderInfo
Kate Stoneb9c1b512016-09-06 20:57:50 +00001417size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001418 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001419 const elf::ELFHeader &header,
1420 lldb_private::UUID &uuid,
1421 std::string &gnu_debuglink_file,
1422 uint32_t &gnu_debuglink_crc,
1423 ArchSpec &arch_spec) {
1424 // Don't reparse the section headers if we already did that.
1425 if (!section_headers.empty())
1426 return section_headers.size();
Todd Fiala6477ea82014-07-11 15:13:33 +00001427
Kate Stoneb9c1b512016-09-06 20:57:50 +00001428 // Only initialize the arch_spec to okay defaults if they're not already set.
1429 // We'll refine this with note data as we parse the notes.
1430 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) {
1431 llvm::Triple::OSType ostype;
1432 llvm::Triple::OSType spec_ostype;
1433 const uint32_t sub_type = subTypeFromElfHeader(header);
1434 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
1435 header.e_ident[EI_OSABI]);
Leonard Mosescu9ba51572018-08-07 18:00:30 +00001436
Adrian Prantl05097242018-04-30 16:49:04 +00001437 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is
1438 // determined based on EI_OSABI flag and the info extracted from ELF notes
1439 // (see RefineModuleDetailsFromNote). However in some cases that still
1440 // might be not enough: for example a shared library might not have any
1441 // notes at all and have EI_OSABI flag set to System V, as result the OS
1442 // will be set to UnknownOS.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001443 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
1444 spec_ostype = arch_spec.GetTriple().getOS();
1445 assert(spec_ostype == ostype);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +00001446 UNUSED_IF_ASSERT_DISABLED(spec_ostype);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001447 }
1448
1449 if (arch_spec.GetMachine() == llvm::Triple::mips ||
1450 arch_spec.GetMachine() == llvm::Triple::mipsel ||
1451 arch_spec.GetMachine() == llvm::Triple::mips64 ||
1452 arch_spec.GetMachine() == llvm::Triple::mips64el) {
1453 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) {
1454 case llvm::ELF::EF_MIPS_MICROMIPS:
1455 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips);
1456 break;
1457 case llvm::ELF::EF_MIPS_ARCH_ASE_M16:
1458 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16);
1459 break;
1460 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX:
1461 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx);
1462 break;
1463 default:
1464 break;
Todd Fialab91de782014-06-27 16:52:49 +00001465 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001466 }
Todd Fialab91de782014-06-27 16:52:49 +00001467
Kate Stoneb9c1b512016-09-06 20:57:50 +00001468 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1469 arch_spec.GetMachine() == llvm::Triple::thumb) {
1470 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT)
1471 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1472 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT)
1473 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1474 }
Jaydeep Patil501a7812015-07-16 03:51:55 +00001475
Kate Stoneb9c1b512016-09-06 20:57:50 +00001476 // If there are no section headers we are done.
1477 if (header.e_shnum == 0)
Michael Sartaina7499c92013-07-01 19:45:50 +00001478 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001479
1480 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1481
1482 section_headers.resize(header.e_shnum);
1483 if (section_headers.size() != header.e_shnum)
1484 return 0;
1485
1486 const size_t sh_size = header.e_shnum * header.e_shentsize;
1487 const elf_off sh_offset = header.e_shoff;
1488 DataExtractor sh_data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001489 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001490 return 0;
1491
1492 uint32_t idx;
1493 lldb::offset_t offset;
1494 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001495 if (!section_headers[idx].Parse(sh_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001496 break;
1497 }
1498 if (idx < section_headers.size())
1499 section_headers.resize(idx);
1500
1501 const unsigned strtab_idx = header.e_shstrndx;
1502 if (strtab_idx && strtab_idx < section_headers.size()) {
1503 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1504 const size_t byte_size = sheader.sh_size;
1505 const Elf64_Off offset = sheader.sh_offset;
1506 lldb_private::DataExtractor shstr_data;
1507
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001508 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001509 for (SectionHeaderCollIter I = section_headers.begin();
1510 I != section_headers.end(); ++I) {
1511 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink");
1512 const ELFSectionHeaderInfo &sheader = *I;
1513 const uint64_t section_size =
1514 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1515 ConstString name(shstr_data.PeekCStr(I->sh_name));
1516
1517 I->section_name = name;
1518
1519 if (arch_spec.IsMIPS()) {
1520 uint32_t arch_flags = arch_spec.GetFlags();
1521 DataExtractor data;
1522 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) {
1523
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001524 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1525 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001526 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1527 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1528 arch_flags |= data.GetU32(&offset);
1529
1530 // The floating point ABI is at offset 7
1531 offset = 7;
1532 switch (data.GetU8(&offset)) {
1533 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY:
1534 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1535 break;
1536 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
1537 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1538 break;
1539 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE:
1540 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1541 break;
1542 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT:
1543 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1544 break;
1545 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64:
1546 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1547 break;
1548 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX:
1549 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1550 break;
1551 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64:
1552 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1553 break;
1554 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A:
1555 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1556 break;
1557 }
1558 }
1559 }
1560 // Settings appropriate ArchSpec ABI Flags
1561 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) {
1562 case llvm::ELF::EF_MIPS_ABI_O32:
1563 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1564 break;
1565 case EF_MIPS_ABI_O64:
1566 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1567 break;
1568 case EF_MIPS_ABI_EABI32:
1569 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1570 break;
1571 case EF_MIPS_ABI_EABI64:
1572 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1573 break;
1574 default:
1575 // ABI Mask doesn't cover N32 and N64 ABI.
1576 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1577 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
Mehdi Aminid16a6e32017-06-23 18:20:13 +00001578 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001579 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1580 break;
1581 }
1582 arch_spec.SetFlags(arch_flags);
1583 }
1584
1585 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1586 arch_spec.GetMachine() == llvm::Triple::thumb) {
1587 DataExtractor data;
1588
1589 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001590 data.SetData(object_data, sheader.sh_offset, section_size) == section_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001591 ParseARMAttributes(data, section_size, arch_spec);
1592 }
1593
1594 if (name == g_sect_name_gnu_debuglink) {
1595 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001596 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1597 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001598 lldb::offset_t gnu_debuglink_offset = 0;
1599 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset);
1600 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
1601 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1602 }
1603 }
1604
1605 // Process ELF note section entries.
1606 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1607
1608 // The section header ".note.android.ident" is stored as a
1609 // PROGBITS type header but it is actually a note header.
1610 static ConstString g_sect_name_android_ident(".note.android.ident");
1611 if (!is_note_header && name == g_sect_name_android_ident)
1612 is_note_header = true;
1613
1614 if (is_note_header) {
1615 // Allow notes to refine module info.
1616 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001617 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1618 section_size) == section_size)) {
Zachary Turner97206d52017-05-12 04:51:55 +00001619 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001620 if (error.Fail()) {
1621 if (log)
1622 log->Printf("ObjectFileELF::%s ELF note processing failed: %s",
1623 __FUNCTION__, error.AsCString());
1624 }
1625 }
1626 }
1627 }
1628
1629 // Make any unknown triple components to be unspecified unknowns.
1630 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1631 arch_spec.GetTriple().setVendorName(llvm::StringRef());
1632 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1633 arch_spec.GetTriple().setOSName(llvm::StringRef());
1634
1635 return section_headers.size();
1636 }
1637 }
1638
1639 section_headers.clear();
1640 return 0;
Michael Sartaina7499c92013-07-01 19:45:50 +00001641}
1642
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001643llvm::StringRef
Kate Stoneb9c1b512016-09-06 20:57:50 +00001644ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1645 size_t pos = symbol_name.find('@');
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001646 return symbol_name.substr(0, pos);
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001647}
1648
Michael Sartaina7499c92013-07-01 19:45:50 +00001649// ParseSectionHeaders
Kate Stoneb9c1b512016-09-06 20:57:50 +00001650size_t ObjectFileELF::ParseSectionHeaders() {
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001651 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid,
1652 m_gnu_debuglink_file, m_gnu_debuglink_crc,
1653 m_arch_spec);
Michael Sartaina7499c92013-07-01 19:45:50 +00001654}
1655
Michael Sartaina7499c92013-07-01 19:45:50 +00001656const ObjectFileELF::ELFSectionHeaderInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001657ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001658 if (!ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001659 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001660
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001661 if (id < m_section_headers.size())
Kate Stoneb9c1b512016-09-06 20:57:50 +00001662 return &m_section_headers[id];
1663
1664 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00001665}
1666
Kate Stoneb9c1b512016-09-06 20:57:50 +00001667lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) {
1668 if (!name || !name[0] || !ParseSectionHeaders())
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001669 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001670 for (size_t i = 1; i < m_section_headers.size(); ++i)
1671 if (m_section_headers[i].section_name == ConstString(name))
1672 return i;
1673 return 0;
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001674}
1675
Pavel Labath62a82542018-12-15 13:45:38 +00001676static SectionType GetSectionTypeFromName(llvm::StringRef Name) {
Pavel Labathef8683a2018-12-12 15:46:18 +00001677 return llvm::StringSwitch<SectionType>(Name)
1678 .Case(".ARM.exidx", eSectionTypeARMexidx)
1679 .Case(".ARM.extab", eSectionTypeARMextab)
1680 .Cases(".bss", ".tbss", eSectionTypeZeroFill)
1681 .Cases(".data", ".tdata", eSectionTypeData)
1682 .Case(".debug_abbrev", eSectionTypeDWARFDebugAbbrev)
1683 .Case(".debug_abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo)
1684 .Case(".debug_addr", eSectionTypeDWARFDebugAddr)
1685 .Case(".debug_aranges", eSectionTypeDWARFDebugAranges)
1686 .Case(".debug_cu_index", eSectionTypeDWARFDebugCuIndex)
1687 .Case(".debug_frame", eSectionTypeDWARFDebugFrame)
1688 .Case(".debug_info", eSectionTypeDWARFDebugInfo)
1689 .Case(".debug_info.dwo", eSectionTypeDWARFDebugInfoDwo)
1690 .Cases(".debug_line", ".debug_line.dwo", eSectionTypeDWARFDebugLine)
1691 .Cases(".debug_line_str", ".debug_line_str.dwo",
1692 eSectionTypeDWARFDebugLineStr)
1693 .Cases(".debug_loc", ".debug_loc.dwo", eSectionTypeDWARFDebugLoc)
1694 .Cases(".debug_loclists", ".debug_loclists.dwo",
1695 eSectionTypeDWARFDebugLocLists)
1696 .Case(".debug_macinfo", eSectionTypeDWARFDebugMacInfo)
1697 .Cases(".debug_macro", ".debug_macro.dwo", eSectionTypeDWARFDebugMacro)
1698 .Case(".debug_names", eSectionTypeDWARFDebugNames)
1699 .Case(".debug_pubnames", eSectionTypeDWARFDebugPubNames)
1700 .Case(".debug_pubtypes", eSectionTypeDWARFDebugPubTypes)
1701 .Case(".debug_ranges", eSectionTypeDWARFDebugRanges)
1702 .Case(".debug_rnglists", eSectionTypeDWARFDebugRngLists)
1703 .Case(".debug_str", eSectionTypeDWARFDebugStr)
1704 .Case(".debug_str.dwo", eSectionTypeDWARFDebugStrDwo)
1705 .Case(".debug_str_offsets", eSectionTypeDWARFDebugStrOffsets)
1706 .Case(".debug_str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo)
1707 .Case(".debug_types", eSectionTypeDWARFDebugTypes)
1708 .Case(".eh_frame", eSectionTypeEHFrame)
1709 .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink)
1710 .Case(".gosymtab", eSectionTypeGoSymtab)
1711 .Case(".text", eSectionTypeCode)
1712 .Default(eSectionTypeOther);
1713}
1714
Pavel Labath62a82542018-12-15 13:45:38 +00001715SectionType ObjectFileELF::GetSectionType(const ELFSectionHeaderInfo &H) const {
1716 switch (H.sh_type) {
1717 case SHT_PROGBITS:
1718 if (H.sh_flags & SHF_EXECINSTR)
1719 return eSectionTypeCode;
1720 break;
1721 case SHT_SYMTAB:
1722 return eSectionTypeELFSymbolTable;
1723 case SHT_DYNSYM:
1724 return eSectionTypeELFDynamicSymbols;
1725 case SHT_RELA:
1726 case SHT_REL:
1727 return eSectionTypeELFRelocationEntries;
1728 case SHT_DYNAMIC:
1729 return eSectionTypeELFDynamicLinkInfo;
1730 }
Jonas Devliegheref8819bd2019-03-27 16:23:50 +00001731 return GetSectionTypeFromName(H.section_name.GetStringRef());
Pavel Labath62a82542018-12-15 13:45:38 +00001732}
1733
1734static uint32_t GetTargetByteSize(SectionType Type, const ArchSpec &arch) {
1735 switch (Type) {
1736 case eSectionTypeData:
1737 case eSectionTypeZeroFill:
1738 return arch.GetDataByteSize();
1739 case eSectionTypeCode:
1740 return arch.GetCodeByteSize();
1741 default:
1742 return 1;
1743 }
1744}
1745
1746static Permissions GetPermissions(const ELFSectionHeader &H) {
1747 Permissions Perm = Permissions(0);
1748 if (H.sh_flags & SHF_ALLOC)
1749 Perm |= ePermissionsReadable;
1750 if (H.sh_flags & SHF_WRITE)
1751 Perm |= ePermissionsWritable;
1752 if (H.sh_flags & SHF_EXECINSTR)
1753 Perm |= ePermissionsExecutable;
1754 return Perm;
1755}
1756
Pavel Labathf55aea72019-01-09 16:50:45 +00001757static Permissions GetPermissions(const ELFProgramHeader &H) {
1758 Permissions Perm = Permissions(0);
1759 if (H.p_flags & PF_R)
1760 Perm |= ePermissionsReadable;
1761 if (H.p_flags & PF_W)
1762 Perm |= ePermissionsWritable;
1763 if (H.p_flags & PF_X)
1764 Perm |= ePermissionsExecutable;
1765 return Perm;
1766}
1767
Pavel Labath62a82542018-12-15 13:45:38 +00001768namespace {
Pavel Labathf55aea72019-01-09 16:50:45 +00001769
1770using VMRange = lldb_private::Range<addr_t, addr_t>;
1771
1772struct SectionAddressInfo {
1773 SectionSP Segment;
1774 VMRange Range;
1775};
1776
Pavel Labath62a82542018-12-15 13:45:38 +00001777// (Unlinked) ELF object files usually have 0 for every section address, meaning
1778// we need to compute synthetic addresses in order for "file addresses" from
1779// different sections to not overlap. This class handles that logic.
1780class VMAddressProvider {
Pavel Labathf55aea72019-01-09 16:50:45 +00001781 using VMMap = llvm::IntervalMap<addr_t, SectionSP, 4,
1782 llvm::IntervalMapHalfOpenInfo<addr_t>>;
1783
1784 ObjectFile::Type ObjectType;
1785 addr_t NextVMAddress = 0;
1786 VMMap::Allocator Alloc;
1787 VMMap Segments = VMMap(Alloc);
1788 VMMap Sections = VMMap(Alloc);
1789 lldb_private::Log *Log = GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
1790
1791 VMRange GetVMRange(const ELFSectionHeader &H) {
1792 addr_t Address = H.sh_addr;
1793 addr_t Size = H.sh_flags & SHF_ALLOC ? H.sh_size : 0;
1794 if (ObjectType == ObjectFile::Type::eTypeObjectFile && Segments.empty() && (H.sh_flags & SHF_ALLOC)) {
1795 NextVMAddress =
1796 llvm::alignTo(NextVMAddress, std::max<addr_t>(H.sh_addralign, 1));
1797 Address = NextVMAddress;
1798 NextVMAddress += Size;
1799 }
1800 return VMRange(Address, Size);
1801 }
Pavel Labath62a82542018-12-15 13:45:38 +00001802
1803public:
Pavel Labathf55aea72019-01-09 16:50:45 +00001804 VMAddressProvider(ObjectFile::Type Type) : ObjectType(Type) {}
Pavel Labath62a82542018-12-15 13:45:38 +00001805
Pavel Labathf55aea72019-01-09 16:50:45 +00001806 llvm::Optional<VMRange> GetAddressInfo(const ELFProgramHeader &H) {
1807 if (H.p_memsz == 0) {
1808 LLDB_LOG(Log,
1809 "Ignoring zero-sized PT_LOAD segment. Corrupt object file?");
1810 return llvm::None;
Pavel Labath62a82542018-12-15 13:45:38 +00001811 }
Pavel Labathf55aea72019-01-09 16:50:45 +00001812
1813 if (Segments.overlaps(H.p_vaddr, H.p_vaddr + H.p_memsz)) {
1814 LLDB_LOG(Log,
1815 "Ignoring overlapping PT_LOAD segment. Corrupt object file?");
1816 return llvm::None;
1817 }
1818 return VMRange(H.p_vaddr, H.p_memsz);
1819 }
1820
1821 llvm::Optional<SectionAddressInfo> GetAddressInfo(const ELFSectionHeader &H) {
1822 VMRange Range = GetVMRange(H);
1823 SectionSP Segment;
1824 auto It = Segments.find(Range.GetRangeBase());
1825 if ((H.sh_flags & SHF_ALLOC) && It.valid()) {
1826 addr_t MaxSize;
1827 if (It.start() <= Range.GetRangeBase()) {
1828 MaxSize = It.stop() - Range.GetRangeBase();
1829 Segment = *It;
1830 } else
1831 MaxSize = It.start() - Range.GetRangeBase();
1832 if (Range.GetByteSize() > MaxSize) {
1833 LLDB_LOG(Log, "Shortening section crossing segment boundaries. "
1834 "Corrupt object file?");
1835 Range.SetByteSize(MaxSize);
1836 }
1837 }
1838 if (Range.GetByteSize() > 0 &&
1839 Sections.overlaps(Range.GetRangeBase(), Range.GetRangeEnd())) {
1840 LLDB_LOG(Log, "Ignoring overlapping section. Corrupt object file?");
1841 return llvm::None;
1842 }
1843 if (Segment)
1844 Range.Slide(-Segment->GetFileAddress());
1845 return SectionAddressInfo{Segment, Range};
1846 }
1847
1848 void AddSegment(const VMRange &Range, SectionSP Seg) {
1849 Segments.insert(Range.GetRangeBase(), Range.GetRangeEnd(), std::move(Seg));
1850 }
1851
1852 void AddSection(SectionAddressInfo Info, SectionSP Sect) {
1853 if (Info.Range.GetByteSize() == 0)
1854 return;
1855 if (Info.Segment)
1856 Info.Range.Slide(Info.Segment->GetFileAddress());
1857 Sections.insert(Info.Range.GetRangeBase(), Info.Range.GetRangeEnd(),
1858 std::move(Sect));
Pavel Labath62a82542018-12-15 13:45:38 +00001859 }
1860};
1861}
1862
Kate Stoneb9c1b512016-09-06 20:57:50 +00001863void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001864 if (m_sections_up)
Pavel Labathf55aea72019-01-09 16:50:45 +00001865 return;
Andrew MacPherson17220c12014-03-05 10:12:43 +00001866
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001867 m_sections_up = llvm::make_unique<SectionList>();
Pavel Labathf55aea72019-01-09 16:50:45 +00001868 VMAddressProvider address_provider(CalculateType());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001869
Pavel Labathf55aea72019-01-09 16:50:45 +00001870 size_t LoadID = 0;
1871 for (const auto &EnumPHdr : llvm::enumerate(ProgramHeaders())) {
1872 const ELFProgramHeader &PHdr = EnumPHdr.value();
1873 if (PHdr.p_type != PT_LOAD)
1874 continue;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001875
Pavel Labathf55aea72019-01-09 16:50:45 +00001876 auto InfoOr = address_provider.GetAddressInfo(PHdr);
1877 if (!InfoOr)
1878 continue;
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001879
Pavel Labathf55aea72019-01-09 16:50:45 +00001880 ConstString Name(("PT_LOAD[" + llvm::Twine(LoadID++) + "]").str());
1881 uint32_t Log2Align = llvm::Log2_64(std::max<elf_xword>(PHdr.p_align, 1));
1882 SectionSP Segment = std::make_shared<Section>(
1883 GetModule(), this, SegmentID(EnumPHdr.index()), Name,
1884 eSectionTypeContainer, InfoOr->GetRangeBase(), InfoOr->GetByteSize(),
1885 PHdr.p_offset, PHdr.p_filesz, Log2Align, /*flags*/ 0);
1886 Segment->SetPermissions(GetPermissions(PHdr));
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001887 m_sections_up->AddSection(Segment);
Pavel Labathedb01272018-04-30 13:23:47 +00001888
Pavel Labathf55aea72019-01-09 16:50:45 +00001889 address_provider.AddSegment(*InfoOr, std::move(Segment));
1890 }
Pavel Labath62a82542018-12-15 13:45:38 +00001891
Pavel Labathf55aea72019-01-09 16:50:45 +00001892 ParseSectionHeaders();
1893 if (m_section_headers.empty())
1894 return;
Ed Masted13f6912017-10-02 14:35:07 +00001895
Pavel Labathf55aea72019-01-09 16:50:45 +00001896 for (SectionHeaderCollIter I = std::next(m_section_headers.begin());
1897 I != m_section_headers.end(); ++I) {
1898 const ELFSectionHeaderInfo &header = *I;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001899
Pavel Labathf55aea72019-01-09 16:50:45 +00001900 ConstString &name = I->section_name;
1901 const uint64_t file_size =
1902 header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1903
1904 auto InfoOr = address_provider.GetAddressInfo(header);
1905 if (!InfoOr)
1906 continue;
1907
1908 SectionType sect_type = GetSectionType(header);
1909
1910 const uint32_t target_bytes_size =
1911 GetTargetByteSize(sect_type, m_arch_spec);
1912
1913 elf::elf_xword log2align =
1914 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign);
1915
1916 SectionSP section_sp(new Section(
1917 InfoOr->Segment, GetModule(), // Module to which this section belongs.
1918 this, // ObjectFile to which this section belongs and should
1919 // read section data from.
1920 SectionIndex(I), // Section ID.
1921 name, // Section name.
1922 sect_type, // Section type.
1923 InfoOr->Range.GetRangeBase(), // VM address.
1924 InfoOr->Range.GetByteSize(), // VM size in bytes of this section.
1925 header.sh_offset, // Offset of this section in the file.
1926 file_size, // Size of the section as found in the file.
1927 log2align, // Alignment of the section
1928 header.sh_flags, // Flags for this section.
1929 target_bytes_size)); // Number of host bytes per target byte
1930
1931 section_sp->SetPermissions(GetPermissions(header));
1932 section_sp->SetIsThreadSpecific(header.sh_flags & SHF_TLS);
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001933 (InfoOr->Segment ? InfoOr->Segment->GetChildren() : *m_sections_up)
Pavel Labathf55aea72019-01-09 16:50:45 +00001934 .AddSection(section_sp);
1935 address_provider.AddSection(std::move(*InfoOr), std::move(section_sp));
Kate Stoneb9c1b512016-09-06 20:57:50 +00001936 }
1937
Pavel Labath3ef4eeb2018-03-09 12:30:09 +00001938 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the
1939 // unified section list.
1940 if (GetType() != eTypeDebugInfo)
Jonas Devlieghered5b44032019-02-13 06:25:41 +00001941 unified_section_list = *m_sections_up;
Greg Clayton3046e662013-07-10 01:23:25 +00001942}
1943
Kate Stoneb9c1b512016-09-06 20:57:50 +00001944// Find the arm/aarch64 mapping symbol character in the given symbol name.
Adrian Prantl05097242018-04-30 16:49:04 +00001945// Mapping symbols have the form of "$<char>[.<any>]*". Additionally we
1946// recognize cases when the mapping symbol prefixed by an arbitrary string
1947// because if a symbol prefix added to each symbol in the object file with
Kate Stoneb9c1b512016-09-06 20:57:50 +00001948// objcopy then the mapping symbols are also prefixed.
1949static char FindArmAarch64MappingSymbol(const char *symbol_name) {
1950 if (!symbol_name)
1951 return '\0';
1952
1953 const char *dollar_pos = ::strchr(symbol_name, '$');
1954 if (!dollar_pos || dollar_pos[1] == '\0')
1955 return '\0';
1956
1957 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
1958 return dollar_pos[1];
1959 return '\0';
1960}
1961
1962#define STO_MIPS_ISA (3 << 6)
1963#define STO_MICROMIPS (2 << 6)
1964#define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
1965
1966// private
1967unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
1968 SectionList *section_list,
1969 const size_t num_symbols,
1970 const DataExtractor &symtab_data,
1971 const DataExtractor &strtab_data) {
1972 ELFSymbol symbol;
1973 lldb::offset_t offset = 0;
1974
1975 static ConstString text_section_name(".text");
1976 static ConstString init_section_name(".init");
1977 static ConstString fini_section_name(".fini");
1978 static ConstString ctors_section_name(".ctors");
1979 static ConstString dtors_section_name(".dtors");
1980
1981 static ConstString data_section_name(".data");
1982 static ConstString rodata_section_name(".rodata");
1983 static ConstString rodata1_section_name(".rodata1");
1984 static ConstString data2_section_name(".data1");
1985 static ConstString bss_section_name(".bss");
1986 static ConstString opd_section_name(".opd"); // For ppc64
1987
1988 // On Android the oatdata and the oatexec symbols in the oat and odex files
Adrian Prantl05097242018-04-30 16:49:04 +00001989 // covers the full .text section what causes issues with displaying unusable
1990 // symbol name to the user and very slow unwinding speed because the
1991 // instruction emulation based unwind plans try to emulate all instructions
1992 // in these symbols. Don't add these symbols to the symbol list as they have
1993 // no use for the debugger and they are causing a lot of trouble. Filtering
1994 // can't be restricted to Android because this special object file don't
1995 // contain the note section specifying the environment to Android but the
1996 // custom extension and file name makes it highly unlikely that this will
1997 // collide with anything else.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001998 ConstString file_extension = m_file.GetFileNameExtension();
Jonas Devliegheread8d48f2018-06-13 16:23:21 +00001999 bool skip_oatdata_oatexec = file_extension == ConstString(".oat") ||
2000 file_extension == ConstString(".odex");
Kate Stoneb9c1b512016-09-06 20:57:50 +00002001
Pavel Labathf760f5a2019-01-03 10:37:19 +00002002 ArchSpec arch = GetArchitecture();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002003 ModuleSP module_sp(GetModule());
2004 SectionList *module_section_list =
2005 module_sp ? module_sp->GetSectionList() : nullptr;
2006
2007 // Local cache to avoid doing a FindSectionByName for each symbol. The "const
Adrian Prantl05097242018-04-30 16:49:04 +00002008 // char*" key must came from a ConstString object so they can be compared by
2009 // pointer
Kate Stoneb9c1b512016-09-06 20:57:50 +00002010 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
2011
2012 unsigned i;
2013 for (i = 0; i < num_symbols; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00002014 if (!symbol.Parse(symtab_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002015 break;
2016
2017 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2018 if (!symbol_name)
2019 symbol_name = "";
2020
2021 // No need to add non-section symbols that have no names
2022 if (symbol.getType() != STT_SECTION &&
2023 (symbol_name == nullptr || symbol_name[0] == '\0'))
2024 continue;
2025
2026 // Skipping oatdata and oatexec sections if it is requested. See details
Adrian Prantl05097242018-04-30 16:49:04 +00002027 // above the definition of skip_oatdata_oatexec for the reasons.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002028 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
2029 ::strcmp(symbol_name, "oatexec") == 0))
2030 continue;
2031
2032 SectionSP symbol_section_sp;
2033 SymbolType symbol_type = eSymbolTypeInvalid;
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002034 Elf64_Half shndx = symbol.st_shndx;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002035
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002036 switch (shndx) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002037 case SHN_ABS:
2038 symbol_type = eSymbolTypeAbsolute;
2039 break;
2040 case SHN_UNDEF:
2041 symbol_type = eSymbolTypeUndefined;
2042 break;
2043 default:
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002044 symbol_section_sp = section_list->FindSectionByID(shndx);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002045 break;
2046 }
2047
2048 // If a symbol is undefined do not process it further even if it has a STT
2049 // type
2050 if (symbol_type != eSymbolTypeUndefined) {
2051 switch (symbol.getType()) {
2052 default:
2053 case STT_NOTYPE:
2054 // The symbol's type is not specified.
2055 break;
2056
2057 case STT_OBJECT:
Adrian Prantl05097242018-04-30 16:49:04 +00002058 // The symbol is associated with a data object, such as a variable, an
2059 // array, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002060 symbol_type = eSymbolTypeData;
2061 break;
2062
2063 case STT_FUNC:
2064 // The symbol is associated with a function or other executable code.
2065 symbol_type = eSymbolTypeCode;
2066 break;
2067
2068 case STT_SECTION:
2069 // The symbol is associated with a section. Symbol table entries of
Adrian Prantl05097242018-04-30 16:49:04 +00002070 // this type exist primarily for relocation and normally have STB_LOCAL
2071 // binding.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002072 break;
2073
2074 case STT_FILE:
Adrian Prantl05097242018-04-30 16:49:04 +00002075 // Conventionally, the symbol's name gives the name of the source file
2076 // associated with the object file. A file symbol has STB_LOCAL
Kate Stoneb9c1b512016-09-06 20:57:50 +00002077 // binding, its section index is SHN_ABS, and it precedes the other
2078 // STB_LOCAL symbols for the file, if it is present.
2079 symbol_type = eSymbolTypeSourceFile;
2080 break;
2081
2082 case STT_GNU_IFUNC:
2083 // The symbol is associated with an indirect function. The actual
2084 // function will be resolved if it is referenced.
2085 symbol_type = eSymbolTypeResolver;
2086 break;
2087 }
2088 }
2089
2090 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) {
2091 if (symbol_section_sp) {
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002092 ConstString sect_name = symbol_section_sp->GetName();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002093 if (sect_name == text_section_name || sect_name == init_section_name ||
2094 sect_name == fini_section_name || sect_name == ctors_section_name ||
2095 sect_name == dtors_section_name) {
2096 symbol_type = eSymbolTypeCode;
2097 } else if (sect_name == data_section_name ||
2098 sect_name == data2_section_name ||
2099 sect_name == rodata_section_name ||
2100 sect_name == rodata1_section_name ||
2101 sect_name == bss_section_name) {
2102 symbol_type = eSymbolTypeData;
2103 }
2104 }
2105 }
2106
2107 int64_t symbol_value_offset = 0;
2108 uint32_t additional_flags = 0;
2109
2110 if (arch.IsValid()) {
2111 if (arch.GetMachine() == llvm::Triple::arm) {
2112 if (symbol.getBinding() == STB_LOCAL) {
2113 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2114 if (symbol_type == eSymbolTypeCode) {
2115 switch (mapping_symbol) {
2116 case 'a':
2117 // $a[.<any>]* - marks an ARM instruction sequence
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002118 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002119 break;
2120 case 'b':
2121 case 't':
2122 // $b[.<any>]* - marks a THUMB BL instruction sequence
2123 // $t[.<any>]* - marks a THUMB instruction sequence
2124 m_address_class_map[symbol.st_value] =
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002125 AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002126 break;
2127 case 'd':
2128 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002129 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002130 break;
2131 }
2132 }
2133 if (mapping_symbol)
2134 continue;
2135 }
2136 } else if (arch.GetMachine() == llvm::Triple::aarch64) {
2137 if (symbol.getBinding() == STB_LOCAL) {
2138 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2139 if (symbol_type == eSymbolTypeCode) {
2140 switch (mapping_symbol) {
2141 case 'x':
2142 // $x[.<any>]* - marks an A64 instruction sequence
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002143 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002144 break;
2145 case 'd':
2146 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002147 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002148 break;
2149 }
2150 }
2151 if (mapping_symbol)
2152 continue;
2153 }
2154 }
2155
2156 if (arch.GetMachine() == llvm::Triple::arm) {
2157 if (symbol_type == eSymbolTypeCode) {
2158 if (symbol.st_value & 1) {
Adrian Prantl05097242018-04-30 16:49:04 +00002159 // Subtracting 1 from the address effectively unsets the low order
2160 // bit, which results in the address actually pointing to the
2161 // beginning of the symbol. This delta will be used below in
2162 // conjunction with symbol.st_value to produce the final
2163 // symbol_value that we store in the symtab.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002164 symbol_value_offset = -1;
2165 m_address_class_map[symbol.st_value ^ 1] =
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002166 AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002167 } else {
2168 // This address is ARM
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002169 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002170 }
2171 }
2172 }
2173
2174 /*
2175 * MIPS:
2176 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for
2177 * MIPS).
2178 * This allows processor to switch between microMIPS and MIPS without any
2179 * need
2180 * for special mode-control register. However, apart from .debug_line,
2181 * none of
2182 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use
2183 * st_other
2184 * flag to check whether the symbol is microMIPS and then set the address
2185 * class
2186 * accordingly.
2187 */
2188 const llvm::Triple::ArchType llvm_arch = arch.GetMachine();
2189 if (llvm_arch == llvm::Triple::mips ||
2190 llvm_arch == llvm::Triple::mipsel ||
2191 llvm_arch == llvm::Triple::mips64 ||
2192 llvm_arch == llvm::Triple::mips64el) {
2193 if (IS_MICROMIPS(symbol.st_other))
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002194 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002195 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
2196 symbol.st_value = symbol.st_value & (~1ull);
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002197 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002198 } else {
2199 if (symbol_type == eSymbolTypeCode)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002200 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002201 else if (symbol_type == eSymbolTypeData)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002202 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002203 else
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002204 m_address_class_map[symbol.st_value] = AddressClass::eUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002205 }
2206 }
2207 }
2208
2209 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
Adrian Prantl05097242018-04-30 16:49:04 +00002210 // symbols. See above for more details.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002211 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2212
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002213 if (symbol_section_sp == nullptr && shndx == SHN_ABS &&
Kate Stoneb9c1b512016-09-06 20:57:50 +00002214 symbol.st_size != 0) {
2215 // We don't have a section for a symbol with non-zero size. Create a new
Adrian Prantl05097242018-04-30 16:49:04 +00002216 // section for it so the address range covered by the symbol is also
2217 // covered by the module (represented through the section list). It is
2218 // needed so module lookup for the addresses covered by this symbol will
2219 // be successfull. This case happens for absolute symbols.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002220 ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2221 symbol_section_sp =
2222 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
2223 eSectionTypeAbsoluteAddress, symbol_value,
2224 symbol.st_size, 0, 0, 0, SHF_ALLOC);
2225
2226 module_section_list->AddSection(symbol_section_sp);
2227 section_list->AddSection(symbol_section_sp);
2228 }
2229
2230 if (symbol_section_sp &&
2231 CalculateType() != ObjectFile::Type::eTypeObjectFile)
2232 symbol_value -= symbol_section_sp->GetFileAddress();
2233
2234 if (symbol_section_sp && module_section_list &&
2235 module_section_list != section_list) {
Adrian Prantl0e4c4822019-03-06 21:22:25 +00002236 ConstString sect_name = symbol_section_sp->GetName();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002237 auto section_it = section_name_to_section.find(sect_name.GetCString());
2238 if (section_it == section_name_to_section.end())
2239 section_it =
2240 section_name_to_section
2241 .emplace(sect_name.GetCString(),
2242 module_section_list->FindSectionByName(sect_name))
2243 .first;
Pavel Labathefddda3d2017-05-02 12:40:31 +00002244 if (section_it->second)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002245 symbol_section_sp = section_it->second;
2246 }
2247
2248 bool is_global = symbol.getBinding() == STB_GLOBAL;
2249 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2250 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z');
2251
2252 llvm::StringRef symbol_ref(symbol_name);
2253
2254 // Symbol names may contain @VERSION suffixes. Find those and strip them
2255 // temporarily.
2256 size_t version_pos = symbol_ref.find('@');
2257 bool has_suffix = version_pos != llvm::StringRef::npos;
2258 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2259 Mangled mangled(ConstString(symbol_bare), is_mangled);
2260
2261 // Now append the suffix back to mangled and unmangled names. Only do it if
Adrian Prantl05097242018-04-30 16:49:04 +00002262 // the demangling was successful (string is not empty).
Kate Stoneb9c1b512016-09-06 20:57:50 +00002263 if (has_suffix) {
2264 llvm::StringRef suffix = symbol_ref.substr(version_pos);
2265
2266 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2267 if (!mangled_name.empty())
2268 mangled.SetMangledName(ConstString((mangled_name + suffix).str()));
2269
2270 ConstString demangled =
2271 mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2272 llvm::StringRef demangled_name = demangled.GetStringRef();
2273 if (!demangled_name.empty())
2274 mangled.SetDemangledName(ConstString((demangled_name + suffix).str()));
2275 }
2276
2277 // In ELF all symbol should have a valid size but it is not true for some
Adrian Prantl05097242018-04-30 16:49:04 +00002278 // function symbols coming from hand written assembly. As none of the
2279 // function symbol should have 0 size we try to calculate the size for
2280 // these symbols in the symtab with saying that their original size is not
2281 // valid.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002282 bool symbol_size_valid =
2283 symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2284
2285 Symbol dc_symbol(
2286 i + start_id, // ID is the original symbol table index.
2287 mangled,
2288 symbol_type, // Type of this symbol
2289 is_global, // Is this globally visible?
2290 false, // Is this symbol debug info?
2291 false, // Is this symbol a trampoline?
2292 false, // Is this symbol artificial?
2293 AddressRange(symbol_section_sp, // Section in which this symbol is
2294 // defined or null.
2295 symbol_value, // Offset in section or symbol value.
2296 symbol.st_size), // Size in bytes of this symbol.
2297 symbol_size_valid, // Symbol size is valid
2298 has_suffix, // Contains linker annotations?
2299 flags); // Symbol flags.
2300 symtab->AddSymbol(dc_symbol);
2301 }
2302 return i;
2303}
2304
2305unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2306 user_id_t start_id,
2307 lldb_private::Section *symtab) {
2308 if (symtab->GetObjectFile() != this) {
2309 // If the symbol table section is owned by a different object file, have it
Adrian Prantl05097242018-04-30 16:49:04 +00002310 // do the parsing.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002311 ObjectFileELF *obj_file_elf =
2312 static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2313 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
2314 }
2315
2316 // Get section list for this object file.
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002317 SectionList *section_list = m_sections_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002318 if (!section_list)
2319 return 0;
2320
2321 user_id_t symtab_id = symtab->GetID();
2322 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2323 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2324 symtab_hdr->sh_type == SHT_DYNSYM);
2325
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002326 // sh_link: section header index of associated string table.
2327 user_id_t strtab_id = symtab_hdr->sh_link;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002328 Section *strtab = section_list->FindSectionByID(strtab_id).get();
2329
2330 if (symtab && strtab) {
2331 assert(symtab->GetObjectFile() == this);
2332 assert(strtab->GetObjectFile() == this);
2333
2334 DataExtractor symtab_data;
2335 DataExtractor strtab_data;
2336 if (ReadSectionData(symtab, symtab_data) &&
2337 ReadSectionData(strtab, strtab_data)) {
2338 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2339
2340 return ParseSymbols(symbol_table, start_id, section_list, num_symbols,
2341 symtab_data, strtab_data);
2342 }
2343 }
2344
2345 return 0;
2346}
2347
2348size_t ObjectFileELF::ParseDynamicSymbols() {
2349 if (m_dynamic_symbols.size())
2350 return m_dynamic_symbols.size();
2351
2352 SectionList *section_list = GetSectionList();
2353 if (!section_list)
2354 return 0;
2355
2356 // Find the SHT_DYNAMIC section.
2357 Section *dynsym =
2358 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
2359 .get();
2360 if (!dynsym)
2361 return 0;
2362 assert(dynsym->GetObjectFile() == this);
2363
2364 ELFDynamic symbol;
2365 DataExtractor dynsym_data;
2366 if (ReadSectionData(dynsym, dynsym_data)) {
2367 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2368 lldb::offset_t cursor = 0;
2369
2370 while (cursor < section_size) {
2371 if (!symbol.Parse(dynsym_data, &cursor))
2372 break;
2373
2374 m_dynamic_symbols.push_back(symbol);
2375 }
2376 }
2377
2378 return m_dynamic_symbols.size();
2379}
2380
2381const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) {
2382 if (!ParseDynamicSymbols())
2383 return NULL;
2384
2385 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2386 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2387 for (; I != E; ++I) {
2388 ELFDynamic *symbol = &*I;
2389
2390 if (symbol->d_tag == tag)
2391 return symbol;
2392 }
2393
2394 return NULL;
2395}
2396
2397unsigned ObjectFileELF::PLTRelocationType() {
2398 // DT_PLTREL
2399 // This member specifies the type of relocation entry to which the
2400 // procedure linkage table refers. The d_val member holds DT_REL or
2401 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2402 // must use the same relocation.
2403 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2404
2405 if (symbol)
2406 return symbol->d_val;
2407
2408 return 0;
2409}
2410
Adrian Prantl05097242018-04-30 16:49:04 +00002411// Returns the size of the normal plt entries and the offset of the first
2412// normal plt entry. The 0th entry in the plt table is usually a resolution
2413// entry which have different size in some architectures then the rest of the
2414// plt entries.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002415static std::pair<uint64_t, uint64_t>
2416GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
2417 const ELFSectionHeader *plt_hdr) {
2418 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2419
Adrian Prantl05097242018-04-30 16:49:04 +00002420 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are
2421 // 16 bytes. So round the entsize up by the alignment if addralign is set.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002422 elf_xword plt_entsize =
2423 plt_hdr->sh_addralign
2424 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
2425 : plt_hdr->sh_entsize;
2426
2427 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2428 // PLT entries relocation code in general requires multiple instruction and
2429 // should be greater than 4 bytes in most cases. Try to guess correct size
2430 // just in case.
2431 if (plt_entsize <= 4) {
2432 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
Adrian Prantl05097242018-04-30 16:49:04 +00002433 // size of the plt entries based on the number of entries and the size of
2434 // the plt section with the assumption that the size of the 0th entry is at
2435 // least as big as the size of the normal entries and it isn't much bigger
2436 // then that.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002437 if (plt_hdr->sh_addralign)
2438 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
2439 (num_relocations + 1) * plt_hdr->sh_addralign;
2440 else
2441 plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2442 }
2443
2444 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2445
2446 return std::make_pair(plt_entsize, plt_offset);
2447}
2448
2449static unsigned ParsePLTRelocations(
2450 Symtab *symbol_table, user_id_t start_id, unsigned rel_type,
2451 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2452 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr,
2453 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data,
2454 DataExtractor &symtab_data, DataExtractor &strtab_data) {
2455 ELFRelocation rel(rel_type);
2456 ELFSymbol symbol;
2457 lldb::offset_t offset = 0;
2458
2459 uint64_t plt_offset, plt_entsize;
2460 std::tie(plt_entsize, plt_offset) =
2461 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2462 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2463
2464 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2465 reloc_info_fn reloc_type;
2466 reloc_info_fn reloc_symbol;
2467
2468 if (hdr->Is32Bit()) {
2469 reloc_type = ELFRelocation::RelocType32;
2470 reloc_symbol = ELFRelocation::RelocSymbol32;
2471 } else {
2472 reloc_type = ELFRelocation::RelocType64;
2473 reloc_symbol = ELFRelocation::RelocSymbol64;
2474 }
2475
2476 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2477 unsigned i;
2478 for (i = 0; i < num_relocations; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00002479 if (!rel.Parse(rel_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002480 break;
2481
2482 if (reloc_type(rel) != slot_type)
2483 continue;
2484
2485 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2486 if (!symbol.Parse(symtab_data, &symbol_offset))
2487 break;
2488
2489 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2490 bool is_mangled =
2491 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2492 uint64_t plt_index = plt_offset + i * plt_entsize;
2493
2494 Symbol jump_symbol(
2495 i + start_id, // Symbol table index
2496 symbol_name, // symbol name.
2497 is_mangled, // is the symbol name mangled?
2498 eSymbolTypeTrampoline, // Type of this symbol
2499 false, // Is this globally visible?
2500 false, // Is this symbol debug info?
2501 true, // Is this symbol a trampoline?
2502 true, // Is this symbol artificial?
2503 plt_section_sp, // Section in which this symbol is defined or null.
2504 plt_index, // Offset in section or symbol value.
2505 plt_entsize, // Size in bytes of this symbol.
2506 true, // Size is valid
2507 false, // Contains linker annotations?
2508 0); // Symbol flags.
2509
2510 symbol_table->AddSymbol(jump_symbol);
2511 }
2512
2513 return i;
2514}
2515
2516unsigned
2517ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id,
2518 const ELFSectionHeaderInfo *rel_hdr,
2519 user_id_t rel_id) {
2520 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2521
2522 // The link field points to the associated symbol table.
2523 user_id_t symtab_id = rel_hdr->sh_link;
2524
2525 // If the link field doesn't point to the appropriate symbol name table then
2526 // try to find it by name as some compiler don't fill in the link fields.
2527 if (!symtab_id)
2528 symtab_id = GetSectionIndexByName(".dynsym");
2529
2530 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers
2531 // point that to the .got.plt or .got section instead of .plt.
2532 user_id_t plt_id = GetSectionIndexByName(".plt");
2533
2534 if (!symtab_id || !plt_id)
2535 return 0;
2536
Kate Stoneb9c1b512016-09-06 20:57:50 +00002537 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2538 if (!plt_hdr)
2539 return 0;
2540
2541 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2542 if (!sym_hdr)
2543 return 0;
2544
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002545 SectionList *section_list = m_sections_up.get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002546 if (!section_list)
2547 return 0;
2548
2549 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2550 if (!rel_section)
2551 return 0;
2552
2553 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id));
2554 if (!plt_section_sp)
2555 return 0;
2556
2557 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2558 if (!symtab)
2559 return 0;
2560
2561 // sh_link points to associated string table.
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002562 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002563 if (!strtab)
2564 return 0;
2565
2566 DataExtractor rel_data;
2567 if (!ReadSectionData(rel_section, rel_data))
2568 return 0;
2569
2570 DataExtractor symtab_data;
2571 if (!ReadSectionData(symtab, symtab_data))
2572 return 0;
2573
2574 DataExtractor strtab_data;
2575 if (!ReadSectionData(strtab, strtab_data))
2576 return 0;
2577
2578 unsigned rel_type = PLTRelocationType();
2579 if (!rel_type)
2580 return 0;
2581
2582 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header,
2583 rel_hdr, plt_hdr, sym_hdr, plt_section_sp,
2584 rel_data, symtab_data, strtab_data);
2585}
2586
Ed Masted13f6912017-10-02 14:35:07 +00002587unsigned ObjectFileELF::ApplyRelocations(
Kate Stoneb9c1b512016-09-06 20:57:50 +00002588 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2589 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2590 DataExtractor &rel_data, DataExtractor &symtab_data,
2591 DataExtractor &debug_data, Section *rel_section) {
2592 ELFRelocation rel(rel_hdr->sh_type);
2593 lldb::addr_t offset = 0;
2594 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2595 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2596 reloc_info_fn reloc_type;
2597 reloc_info_fn reloc_symbol;
2598
2599 if (hdr->Is32Bit()) {
2600 reloc_type = ELFRelocation::RelocType32;
2601 reloc_symbol = ELFRelocation::RelocSymbol32;
2602 } else {
2603 reloc_type = ELFRelocation::RelocType64;
2604 reloc_symbol = ELFRelocation::RelocSymbol64;
2605 }
2606
2607 for (unsigned i = 0; i < num_relocations; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00002608 if (!rel.Parse(rel_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002609 break;
2610
2611 Symbol *symbol = NULL;
2612
2613 if (hdr->Is32Bit()) {
2614 switch (reloc_type(rel)) {
2615 case R_386_32:
2616 case R_386_PC32:
2617 default:
Zachary Turnera6d54642017-12-02 00:15:29 +00002618 // FIXME: This asserts with this input:
2619 //
2620 // foo.cpp
2621 // int main(int argc, char **argv) { return 0; }
2622 //
2623 // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o
2624 //
2625 // and running this on the foo.o module.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002626 assert(false && "unexpected relocation type");
2627 }
2628 } else {
2629 switch (reloc_type(rel)) {
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002630 case R_AARCH64_ABS64:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002631 case R_X86_64_64: {
2632 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2633 if (symbol) {
2634 addr_t value = symbol->GetAddressRef().GetFileAddress();
2635 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2636 uint64_t *dst = reinterpret_cast<uint64_t *>(
2637 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2638 ELFRelocation::RelocOffset64(rel));
Davide Italianob37f1ec2018-11-06 17:11:34 +00002639 uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);
2640 memcpy(dst, &val_offset, sizeof(uint64_t));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002641 }
2642 break;
2643 }
2644 case R_X86_64_32:
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002645 case R_X86_64_32S:
2646 case R_AARCH64_ABS32: {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002647 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2648 if (symbol) {
2649 addr_t value = symbol->GetAddressRef().GetFileAddress();
2650 value += ELFRelocation::RelocAddend32(rel);
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002651 if ((reloc_type(rel) == R_X86_64_32 && (value > UINT32_MAX)) ||
Stephane Sezer0c679b72018-08-06 22:21:28 +00002652 (reloc_type(rel) == R_X86_64_32S &&
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002653 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN)) ||
2654 (reloc_type(rel) == R_AARCH64_ABS32 &&
2655 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN))) {
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002656 Log *log =
2657 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
2658 log->Printf("Failed to apply debug info relocations");
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002659 break;
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002660 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002661 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2662 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2663 uint32_t *dst = reinterpret_cast<uint32_t *>(
2664 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2665 ELFRelocation::RelocOffset32(rel));
Davide Italianob37f1ec2018-11-06 17:11:34 +00002666 memcpy(dst, &truncated_addr, sizeof(uint32_t));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002667 }
2668 break;
2669 }
2670 case R_X86_64_PC32:
2671 default:
2672 assert(false && "unexpected relocation type");
2673 }
2674 }
2675 }
2676
2677 return 0;
2678}
2679
2680unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
Ed Masted13f6912017-10-02 14:35:07 +00002681 user_id_t rel_id,
2682 lldb_private::Symtab *thetab) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002683 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2684
2685 // Parse in the section list if needed.
2686 SectionList *section_list = GetSectionList();
2687 if (!section_list)
2688 return 0;
2689
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002690 user_id_t symtab_id = rel_hdr->sh_link;
2691 user_id_t debug_id = rel_hdr->sh_info;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002692
2693 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2694 if (!symtab_hdr)
2695 return 0;
2696
2697 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2698 if (!debug_hdr)
2699 return 0;
2700
2701 Section *rel = section_list->FindSectionByID(rel_id).get();
2702 if (!rel)
2703 return 0;
2704
2705 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2706 if (!symtab)
2707 return 0;
2708
2709 Section *debug = section_list->FindSectionByID(debug_id).get();
2710 if (!debug)
2711 return 0;
2712
2713 DataExtractor rel_data;
2714 DataExtractor symtab_data;
2715 DataExtractor debug_data;
2716
Ed Masted13f6912017-10-02 14:35:07 +00002717 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) &&
2718 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) &&
2719 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) {
2720 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr,
2721 rel_data, symtab_data, debug_data, debug);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002722 }
2723
2724 return 0;
2725}
2726
2727Symtab *ObjectFileELF::GetSymtab() {
2728 ModuleSP module_sp(GetModule());
2729 if (!module_sp)
2730 return NULL;
2731
2732 // We always want to use the main object file so we (hopefully) only have one
Adrian Prantl05097242018-04-30 16:49:04 +00002733 // cached copy of our symtab, dynamic sections, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002734 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2735 if (module_obj_file && module_obj_file != this)
2736 return module_obj_file->GetSymtab();
2737
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002738 if (m_symtab_up == NULL) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002739 SectionList *section_list = module_sp->GetSectionList();
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002740 if (!section_list)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002741 return NULL;
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002742
Kate Stoneb9c1b512016-09-06 20:57:50 +00002743 uint64_t symbol_id = 0;
2744 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002745
Kate Stoneb9c1b512016-09-06 20:57:50 +00002746 // Sharable objects and dynamic executables usually have 2 distinct symbol
2747 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
Adrian Prantl05097242018-04-30 16:49:04 +00002748 // smaller version of the symtab that only contains global symbols. The
2749 // information found in the dynsym is therefore also found in the symtab,
2750 // while the reverse is not necessarily true.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002751 Section *symtab =
2752 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2753 if (!symtab) {
2754 // The symtab section is non-allocable and can be stripped, so if it
Adrian Prantl05097242018-04-30 16:49:04 +00002755 // doesn't exist then use the dynsym section which should always be
2756 // there.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002757 symtab =
2758 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
2759 .get();
2760 }
2761 if (symtab) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002762 m_symtab_up.reset(new Symtab(symtab->GetObjectFile()));
2763 symbol_id += ParseSymbolTable(m_symtab_up.get(), symbol_id, symtab);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002764 }
2765
2766 // DT_JMPREL
2767 // If present, this entry's d_ptr member holds the address of
2768 // relocation
2769 // entries associated solely with the procedure linkage table.
2770 // Separating
2771 // these relocation entries lets the dynamic linker ignore them during
2772 // process initialization, if lazy binding is enabled. If this entry is
2773 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2774 // also be present.
2775 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2776 if (symbol) {
2777 // Synthesize trampoline symbols to help navigate the PLT.
2778 addr_t addr = symbol->d_ptr;
2779 Section *reloc_section =
2780 section_list->FindSectionContainingFileAddress(addr).get();
2781 if (reloc_section) {
2782 user_id_t reloc_id = reloc_section->GetID();
2783 const ELFSectionHeaderInfo *reloc_header =
2784 GetSectionHeaderByIndex(reloc_id);
2785 assert(reloc_header);
2786
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002787 if (m_symtab_up == nullptr)
2788 m_symtab_up.reset(new Symtab(reloc_section->GetObjectFile()));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002789
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002790 ParseTrampolineSymbols(m_symtab_up.get(), symbol_id, reloc_header,
Kate Stoneb9c1b512016-09-06 20:57:50 +00002791 reloc_id);
2792 }
2793 }
2794
Pavel Labath66d88322019-02-14 14:40:10 +00002795 if (DWARFCallFrameInfo *eh_frame =
2796 GetModule()->GetUnwindTable().GetEHFrameInfo()) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002797 if (m_symtab_up == nullptr)
2798 m_symtab_up.reset(new Symtab(this));
2799 ParseUnwindSymbols(m_symtab_up.get(), eh_frame);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002800 }
2801
2802 // If we still don't have any symtab then create an empty instance to avoid
Adrian Prantl05097242018-04-30 16:49:04 +00002803 // do the section lookup next time.
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002804 if (m_symtab_up == nullptr)
2805 m_symtab_up.reset(new Symtab(this));
Davide Italiano407c6912018-11-02 21:59:14 +00002806
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002807 m_symtab_up->CalculateSymbolSizes();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002808 }
2809
Jonas Devlieghered5b44032019-02-13 06:25:41 +00002810 return m_symtab_up.get();
Ed Masted13f6912017-10-02 14:35:07 +00002811}
2812
2813void ObjectFileELF::RelocateSection(lldb_private::Section *section)
2814{
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002815 static const char *debug_prefix = ".debug";
Ed Masted13f6912017-10-02 14:35:07 +00002816
Adrian Prantl05097242018-04-30 16:49:04 +00002817 // Set relocated bit so we stop getting called, regardless of whether we
2818 // actually relocate.
Ed Masted13f6912017-10-02 14:35:07 +00002819 section->SetIsRelocated(true);
2820
2821 // We only relocate in ELF relocatable files
2822 if (CalculateType() != eTypeObjectFile)
2823 return;
2824
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002825 const char *section_name = section->GetName().GetCString();
Ed Masted13f6912017-10-02 14:35:07 +00002826 // Can't relocate that which can't be named
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002827 if (section_name == nullptr)
Ed Masted13f6912017-10-02 14:35:07 +00002828 return;
2829
2830 // We don't relocate non-debug sections at the moment
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002831 if (strncmp(section_name, debug_prefix, strlen(debug_prefix)))
Ed Masted13f6912017-10-02 14:35:07 +00002832 return;
2833
2834 // Relocation section names to look for
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002835 std::string needle = std::string(".rel") + section_name;
2836 std::string needlea = std::string(".rela") + section_name;
Ed Masted13f6912017-10-02 14:35:07 +00002837
Kate Stoneb9c1b512016-09-06 20:57:50 +00002838 for (SectionHeaderCollIter I = m_section_headers.begin();
2839 I != m_section_headers.end(); ++I) {
2840 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
Ed Masted13f6912017-10-02 14:35:07 +00002841 const char *hay_name = I->section_name.GetCString();
2842 if (hay_name == nullptr)
2843 continue;
2844 if (needle == hay_name || needlea == hay_name) {
2845 const ELFSectionHeader &reloc_header = *I;
2846 user_id_t reloc_id = SectionIndex(I);
2847 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab());
2848 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002849 }
2850 }
2851 }
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002852}
Tamas Berghammer5bfd4d02016-02-10 12:10:58 +00002853
Kate Stoneb9c1b512016-09-06 20:57:50 +00002854void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
2855 DWARFCallFrameInfo *eh_frame) {
2856 SectionList *section_list = GetSectionList();
2857 if (!section_list)
2858 return;
2859
2860 // First we save the new symbols into a separate list and add them to the
Adrian Prantl05097242018-04-30 16:49:04 +00002861 // symbol table after we colleced all symbols we want to add. This is
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002862 // neccessary because adding a new symbol invalidates the internal index of
Adrian Prantl05097242018-04-30 16:49:04 +00002863 // the symtab what causing the next lookup to be slow because it have to
2864 // recalculate the index first.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002865 std::vector<Symbol> new_symbols;
2866
2867 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
2868 lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
2869 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
2870 if (symbol) {
2871 if (!symbol->GetByteSizeIsValid()) {
2872 symbol->SetByteSize(size);
2873 symbol->SetSizeIsSynthesized(true);
2874 }
2875 } else {
2876 SectionSP section_sp =
2877 section_list->FindSectionContainingFileAddress(file_addr);
2878 if (section_sp) {
2879 addr_t offset = file_addr - section_sp->GetFileAddress();
2880 const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
2881 uint64_t symbol_id = symbol_table->GetNumSymbols();
2882 Symbol eh_symbol(
2883 symbol_id, // Symbol table index.
2884 symbol_name, // Symbol name.
2885 false, // Is the symbol name mangled?
2886 eSymbolTypeCode, // Type of this symbol.
2887 true, // Is this globally visible?
2888 false, // Is this symbol debug info?
2889 false, // Is this symbol a trampoline?
2890 true, // Is this symbol artificial?
2891 section_sp, // Section in which this symbol is defined or null.
2892 offset, // Offset in section or symbol value.
2893 0, // Size: Don't specify the size as an FDE can
2894 false, // Size is valid: cover multiple symbols.
2895 false, // Contains linker annotations?
2896 0); // Symbol flags.
2897 new_symbols.push_back(eh_symbol);
2898 }
2899 }
2900 return true;
2901 });
2902
2903 for (const Symbol &s : new_symbols)
2904 symbol_table->AddSymbol(s);
2905}
2906
2907bool ObjectFileELF::IsStripped() {
2908 // TODO: determine this for ELF
2909 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002910}
2911
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002912//===----------------------------------------------------------------------===//
2913// Dump
2914//
2915// Dump the specifics of the runtime file container (such as any headers
2916// segments, sections, etc).
Kate Stoneb9c1b512016-09-06 20:57:50 +00002917void ObjectFileELF::Dump(Stream *s) {
2918 ModuleSP module_sp(GetModule());
2919 if (!module_sp) {
2920 return;
2921 }
Adrian McCarthy543725c2016-04-04 21:21:49 +00002922
Kate Stoneb9c1b512016-09-06 20:57:50 +00002923 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2924 s->Printf("%p: ", static_cast<void *>(this));
2925 s->Indent();
2926 s->PutCString("ObjectFileELF");
Adrian McCarthy543725c2016-04-04 21:21:49 +00002927
Pavel Labathf760f5a2019-01-03 10:37:19 +00002928 ArchSpec header_arch = GetArchitecture();
Adrian McCarthy543725c2016-04-04 21:21:49 +00002929
Kate Stoneb9c1b512016-09-06 20:57:50 +00002930 *s << ", file = '" << m_file
2931 << "', arch = " << header_arch.GetArchitectureName() << "\n";
Adrian McCarthy543725c2016-04-04 21:21:49 +00002932
Kate Stoneb9c1b512016-09-06 20:57:50 +00002933 DumpELFHeader(s, m_header);
2934 s->EOL();
2935 DumpELFProgramHeaders(s);
2936 s->EOL();
2937 DumpELFSectionHeaders(s);
2938 s->EOL();
2939 SectionList *section_list = GetSectionList();
2940 if (section_list)
2941 section_list->Dump(s, NULL, true, UINT32_MAX);
2942 Symtab *symtab = GetSymtab();
2943 if (symtab)
2944 symtab->Dump(s, NULL, eSortOrderNone);
2945 s->EOL();
2946 DumpDependentModules(s);
2947 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002948}
2949
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002950// DumpELFHeader
2951//
2952// Dump the ELF header to the specified output stream
Kate Stoneb9c1b512016-09-06 20:57:50 +00002953void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
2954 s->PutCString("ELF Header\n");
2955 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2956 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
2957 header.e_ident[EI_MAG1]);
2958 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
2959 header.e_ident[EI_MAG2]);
2960 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
2961 header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002962
Kate Stoneb9c1b512016-09-06 20:57:50 +00002963 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2964 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2965 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2966 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2967 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002968
Kate Stoneb9c1b512016-09-06 20:57:50 +00002969 s->Printf("e_type = 0x%4.4x ", header.e_type);
2970 DumpELFHeader_e_type(s, header.e_type);
2971 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2972 s->Printf("e_version = 0x%8.8x\n", header.e_version);
2973 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2974 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2975 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
2976 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2977 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2978 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00002979 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002980 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00002981 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum);
2982 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002983}
2984
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002985// DumpELFHeader_e_type
2986//
2987// Dump an token value for the ELF header member e_type
Kate Stoneb9c1b512016-09-06 20:57:50 +00002988void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
2989 switch (e_type) {
2990 case ET_NONE:
2991 *s << "ET_NONE";
2992 break;
2993 case ET_REL:
2994 *s << "ET_REL";
2995 break;
2996 case ET_EXEC:
2997 *s << "ET_EXEC";
2998 break;
2999 case ET_DYN:
3000 *s << "ET_DYN";
3001 break;
3002 case ET_CORE:
3003 *s << "ET_CORE";
3004 break;
3005 default:
3006 break;
3007 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003008}
3009
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003010// DumpELFHeader_e_ident_EI_DATA
3011//
3012// Dump an token value for the ELF header member e_ident[EI_DATA]
Kate Stoneb9c1b512016-09-06 20:57:50 +00003013void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
3014 unsigned char ei_data) {
3015 switch (ei_data) {
3016 case ELFDATANONE:
3017 *s << "ELFDATANONE";
3018 break;
3019 case ELFDATA2LSB:
3020 *s << "ELFDATA2LSB - Little Endian";
3021 break;
3022 case ELFDATA2MSB:
3023 *s << "ELFDATA2MSB - Big Endian";
3024 break;
3025 default:
3026 break;
3027 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003028}
3029
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003030// DumpELFProgramHeader
3031//
3032// Dump a single ELF program header to the specified output stream
Kate Stoneb9c1b512016-09-06 20:57:50 +00003033void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3034 const ELFProgramHeader &ph) {
3035 DumpELFProgramHeader_p_type(s, ph.p_type);
3036 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3037 ph.p_vaddr, ph.p_paddr);
3038 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3039 ph.p_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003040
Kate Stoneb9c1b512016-09-06 20:57:50 +00003041 DumpELFProgramHeader_p_flags(s, ph.p_flags);
3042 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003043}
3044
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003045// DumpELFProgramHeader_p_type
3046//
Adrian Prantl05097242018-04-30 16:49:04 +00003047// Dump an token value for the ELF program header member p_type which describes
3048// the type of the program header
Kate Stoneb9c1b512016-09-06 20:57:50 +00003049void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3050 const int kStrWidth = 15;
3051 switch (p_type) {
3052 CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3053 CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3054 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3055 CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3056 CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3057 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3058 CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3059 CASE_AND_STREAM(s, PT_TLS, kStrWidth);
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00003060 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003061 default:
3062 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3063 break;
3064 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003065}
3066
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003067// DumpELFProgramHeader_p_flags
3068//
3069// Dump an token value for the ELF program header member p_flags
Kate Stoneb9c1b512016-09-06 20:57:50 +00003070void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3071 *s << ((p_flags & PF_X) ? "PF_X" : " ")
3072 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3073 << ((p_flags & PF_W) ? "PF_W" : " ")
3074 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3075 << ((p_flags & PF_R) ? "PF_R" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003076}
3077
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003078// DumpELFProgramHeaders
3079//
3080// Dump all of the ELF program header to the specified output stream
Kate Stoneb9c1b512016-09-06 20:57:50 +00003081void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3082 if (!ParseProgramHeaders())
3083 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003084
Kate Stoneb9c1b512016-09-06 20:57:50 +00003085 s->PutCString("Program Headers\n");
3086 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
3087 "p_filesz p_memsz p_flags p_align\n");
3088 s->PutCString("==== --------------- -------- -------- -------- "
3089 "-------- -------- ------------------------- --------\n");
Ed Maste3a8ab6e2015-02-23 15:33:11 +00003090
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003091 for (const auto &H : llvm::enumerate(m_program_headers)) {
3092 s->Format("[{0,2}] ", H.index());
3093 ObjectFileELF::DumpELFProgramHeader(s, H.value());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003094 s->EOL();
3095 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003096}
3097
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003098// DumpELFSectionHeader
3099//
3100// Dump a single ELF section header to the specified output stream
Kate Stoneb9c1b512016-09-06 20:57:50 +00003101void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3102 const ELFSectionHeaderInfo &sh) {
3103 s->Printf("%8.8x ", sh.sh_name);
3104 DumpELFSectionHeader_sh_type(s, sh.sh_type);
3105 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3106 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3107 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3108 sh.sh_offset, sh.sh_size);
3109 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3110 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003111}
3112
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003113// DumpELFSectionHeader_sh_type
3114//
3115// Dump an token value for the ELF section header member sh_type which
3116// describes the type of the section
Kate Stoneb9c1b512016-09-06 20:57:50 +00003117void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3118 const int kStrWidth = 12;
3119 switch (sh_type) {
3120 CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3121 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3122 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3123 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3124 CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3125 CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3126 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3127 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3128 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3129 CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3130 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3131 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3132 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3133 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3134 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3135 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3136 default:
3137 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3138 break;
3139 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003140}
3141
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003142// DumpELFSectionHeader_sh_flags
3143//
3144// Dump an token value for the ELF section header member sh_flags
Kate Stoneb9c1b512016-09-06 20:57:50 +00003145void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3146 elf_xword sh_flags) {
3147 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
3148 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3149 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
3150 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3151 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003152}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003153
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003154// DumpELFSectionHeaders
3155//
3156// Dump all of the ELF section header to the specified output stream
Kate Stoneb9c1b512016-09-06 20:57:50 +00003157void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3158 if (!ParseSectionHeaders())
3159 return;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003160
Kate Stoneb9c1b512016-09-06 20:57:50 +00003161 s->PutCString("Section Headers\n");
3162 s->PutCString("IDX name type flags "
3163 "addr offset size link info addralgn "
3164 "entsize Name\n");
3165 s->PutCString("==== -------- ------------ -------------------------------- "
3166 "-------- -------- -------- -------- -------- -------- "
3167 "-------- ====================\n");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003168
Kate Stoneb9c1b512016-09-06 20:57:50 +00003169 uint32_t idx = 0;
3170 for (SectionHeaderCollConstIter I = m_section_headers.begin();
3171 I != m_section_headers.end(); ++I, ++idx) {
3172 s->Printf("[%2u] ", idx);
3173 ObjectFileELF::DumpELFSectionHeader(s, *I);
3174 const char *section_name = I->section_name.AsCString("");
3175 if (section_name)
3176 *s << ' ' << section_name << "\n";
3177 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003178}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003179
Kate Stoneb9c1b512016-09-06 20:57:50 +00003180void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3181 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003182
Kate Stoneb9c1b512016-09-06 20:57:50 +00003183 if (num_modules > 0) {
3184 s->PutCString("Dependent Modules:\n");
3185 for (unsigned i = 0; i < num_modules; ++i) {
Jonas Devlieghered5b44032019-02-13 06:25:41 +00003186 const FileSpec &spec = m_filespec_up->GetFileSpecAtIndex(i);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003187 s->Printf(" %s\n", spec.GetFilename().GetCString());
3188 }
3189 }
3190}
3191
Pavel Labathf760f5a2019-01-03 10:37:19 +00003192ArchSpec ObjectFileELF::GetArchitecture() {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003193 if (!ParseHeader())
Pavel Labathf760f5a2019-01-03 10:37:19 +00003194 return ArchSpec();
Kate Stoneb9c1b512016-09-06 20:57:50 +00003195
3196 if (m_section_headers.empty()) {
3197 // Allow elf notes to be parsed which may affect the detected architecture.
3198 ParseSectionHeaders();
3199 }
3200
3201 if (CalculateType() == eTypeCoreFile &&
Alex Langfordbee015e2019-02-26 23:50:19 +00003202 !m_arch_spec.TripleOSWasSpecified()) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003203 // Core files don't have section headers yet they have PT_NOTE program
Adrian Prantl05097242018-04-30 16:49:04 +00003204 // headers that might shed more light on the architecture
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003205 for (const elf::ELFProgramHeader &H : ProgramHeaders()) {
3206 if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0)
3207 continue;
3208 DataExtractor data;
3209 if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) {
3210 UUID uuid;
3211 RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003212 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003213 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003214 }
Pavel Labathf760f5a2019-01-03 10:37:19 +00003215 return m_arch_spec;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003216}
3217
Kate Stoneb9c1b512016-09-06 20:57:50 +00003218ObjectFile::Type ObjectFileELF::CalculateType() {
3219 switch (m_header.e_type) {
3220 case llvm::ELF::ET_NONE:
3221 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003222 return eTypeUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003223
3224 case llvm::ELF::ET_REL:
3225 // 1 - Relocatable file
3226 return eTypeObjectFile;
3227
3228 case llvm::ELF::ET_EXEC:
3229 // 2 - Executable file
3230 return eTypeExecutable;
3231
3232 case llvm::ELF::ET_DYN:
3233 // 3 - Shared object file
3234 return eTypeSharedLibrary;
3235
3236 case ET_CORE:
3237 // 4 - Core file
3238 return eTypeCoreFile;
3239
3240 default:
3241 break;
3242 }
3243 return eTypeUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003244}
3245
Kate Stoneb9c1b512016-09-06 20:57:50 +00003246ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3247 switch (m_header.e_type) {
3248 case llvm::ELF::ET_NONE:
3249 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003250 return eStrataUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003251
Kate Stoneb9c1b512016-09-06 20:57:50 +00003252 case llvm::ELF::ET_REL:
3253 // 1 - Relocatable file
3254 return eStrataUnknown;
3255
3256 case llvm::ELF::ET_EXEC:
3257 // 2 - Executable file
3258 // TODO: is there any way to detect that an executable is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003259 // related executable by inspecting the program headers, section headers,
3260 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003261 return eStrataUser;
3262
3263 case llvm::ELF::ET_DYN:
3264 // 3 - Shared object file
3265 // TODO: is there any way to detect that an shared library is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003266 // related executable by inspecting the program headers, section headers,
3267 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003268 return eStrataUnknown;
3269
3270 case ET_CORE:
3271 // 4 - Core file
3272 // TODO: is there any way to detect that an core file is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003273 // related executable by inspecting the program headers, section headers,
3274 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003275 return eStrataUnknown;
3276
3277 default:
3278 break;
3279 }
3280 return eStrataUnknown;
3281}
Pavel Labathe2867bc2017-12-15 14:23:58 +00003282
3283size_t ObjectFileELF::ReadSectionData(Section *section,
3284 lldb::offset_t section_offset, void *dst,
3285 size_t dst_len) {
3286 // If some other objectfile owns this data, pass this to them.
3287 if (section->GetObjectFile() != this)
3288 return section->GetObjectFile()->ReadSectionData(section, section_offset,
3289 dst, dst_len);
3290
3291 if (!section->Test(SHF_COMPRESSED))
3292 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
3293
3294 // For compressed sections we need to read to full data to be able to
3295 // decompress.
3296 DataExtractor data;
3297 ReadSectionData(section, data);
3298 return data.CopyData(section_offset, dst_len, dst);
3299}
3300
3301size_t ObjectFileELF::ReadSectionData(Section *section,
3302 DataExtractor &section_data) {
3303 // If some other objectfile owns this data, pass this to them.
3304 if (section->GetObjectFile() != this)
3305 return section->GetObjectFile()->ReadSectionData(section, section_data);
3306
Pavel Labathe2867bc2017-12-15 14:23:58 +00003307 size_t result = ObjectFile::ReadSectionData(section, section_data);
3308 if (result == 0 || !section->Test(SHF_COMPRESSED))
3309 return result;
3310
3311 auto Decompressor = llvm::object::Decompressor::create(
3312 section->GetName().GetStringRef(),
3313 {reinterpret_cast<const char *>(section_data.GetDataStart()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003314 size_t(section_data.GetByteSize())},
Pavel Labathe2867bc2017-12-15 14:23:58 +00003315 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8);
3316 if (!Decompressor) {
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003317 GetModule()->ReportWarning(
3318 "Unable to initialize decompressor for section '%s': %s",
3319 section->GetName().GetCString(),
3320 llvm::toString(Decompressor.takeError()).c_str());
3321 section_data.Clear();
3322 return 0;
Pavel Labathe2867bc2017-12-15 14:23:58 +00003323 }
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003324
Pavel Labathe2867bc2017-12-15 14:23:58 +00003325 auto buffer_sp =
3326 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0);
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003327 if (auto error = Decompressor->decompress(
Pavel Labathe2867bc2017-12-15 14:23:58 +00003328 {reinterpret_cast<char *>(buffer_sp->GetBytes()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003329 size_t(buffer_sp->GetByteSize())})) {
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003330 GetModule()->ReportWarning(
3331 "Decompression of section '%s' failed: %s",
3332 section->GetName().GetCString(),
3333 llvm::toString(std::move(error)).c_str());
3334 section_data.Clear();
3335 return 0;
Pavel Labathe2867bc2017-12-15 14:23:58 +00003336 }
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003337
Pavel Labathe2867bc2017-12-15 14:23:58 +00003338 section_data.SetData(buffer_sp);
3339 return buffer_sp->GetByteSize();
3340}
Pavel Labath16064d32018-03-20 11:56:24 +00003341
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003342llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() {
3343 ParseProgramHeaders();
3344 return m_program_headers;
3345}
3346
3347DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) {
3348 return DataExtractor(m_data, H.p_offset, H.p_filesz);
3349}
3350
Pavel Labath16064d32018-03-20 11:56:24 +00003351bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003352 for (const ELFProgramHeader &H : ProgramHeaders()) {
3353 if (H.p_paddr != 0)
Pavel Labath16064d32018-03-20 11:56:24 +00003354 return true;
3355 }
3356 return false;
3357}
3358
3359std::vector<ObjectFile::LoadableData>
3360ObjectFileELF::GetLoadableData(Target &target) {
Adrian Prantl05097242018-04-30 16:49:04 +00003361 // Create a list of loadable data from loadable segments, using physical
3362 // addresses if they aren't all null
Pavel Labath16064d32018-03-20 11:56:24 +00003363 std::vector<LoadableData> loadables;
Pavel Labath16064d32018-03-20 11:56:24 +00003364 bool should_use_paddr = AnySegmentHasPhysicalAddress();
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003365 for (const ELFProgramHeader &H : ProgramHeaders()) {
Pavel Labath16064d32018-03-20 11:56:24 +00003366 LoadableData loadable;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003367 if (H.p_type != llvm::ELF::PT_LOAD)
Pavel Labath16064d32018-03-20 11:56:24 +00003368 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003369 loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr;
Pavel Labath16064d32018-03-20 11:56:24 +00003370 if (loadable.Dest == LLDB_INVALID_ADDRESS)
3371 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003372 if (H.p_filesz == 0)
Pavel Labath16064d32018-03-20 11:56:24 +00003373 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003374 auto segment_data = GetSegmentData(H);
Pavel Labath16064d32018-03-20 11:56:24 +00003375 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(),
3376 segment_data.GetByteSize());
3377 loadables.push_back(loadable);
3378 }
3379 return loadables;
3380}