blob: 0720cca27341078f3837719683b19377aba72849 [file] [log] [blame]
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001//===-- ObjectFileELF.cpp ------------------------------------- -*- C++ -*-===//
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "ObjectFileELF.h"
11
Chris Lattner30fdc8d2010-06-08 16:52:24 +000012#include <algorithm>
Kate Stoneb9c1b512016-09-06 20:57:50 +000013#include <cassert>
Tamas Berghammer9fa11472015-10-27 10:43:27 +000014#include <unordered_map>
Chris Lattner30fdc8d2010-06-08 16:52:24 +000015
Stephen Wilson2ab0a582011-01-15 00:08:44 +000016#include "lldb/Core/ArchSpec.h"
Stephen Wilsonf325ba92010-07-13 23:07:23 +000017#include "lldb/Core/FileSpecList.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000018#include "lldb/Core/Module.h"
Greg Claytonf4d6de62013-04-24 22:29:28 +000019#include "lldb/Core/ModuleSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000020#include "lldb/Core/PluginManager.h"
21#include "lldb/Core/Section.h"
Todd Fiala4339f3a2014-03-25 19:29:09 +000022#include "lldb/Core/Timer.h"
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +000023#include "lldb/Symbol/DWARFCallFrameInfo.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000024#include "lldb/Symbol/SymbolContext.h"
Steve Pucci9e02dac2014-02-06 19:02:19 +000025#include "lldb/Target/SectionLoadList.h"
Ed Maste54803652013-10-11 17:39:07 +000026#include "lldb/Target/Target.h"
Zachary Turner666cc0b2017-03-04 01:30:05 +000027#include "lldb/Utility/DataBufferLLVM.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000028#include "lldb/Utility/Error.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000029#include "lldb/Utility/Log.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000030#include "lldb/Utility/Stream.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
Stephen Wilson499b40e2011-03-30 16:07:05 +000032#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000033#include "llvm/ADT/StringRef.h"
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +000034#include "llvm/Support/ARMBuildAttributes.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000035#include "llvm/Support/MathExtras.h"
Zachary Turner3f4a4b32017-02-24 18:56:49 +000036#include "llvm/Support/MemoryBuffer.h"
Sagar Thakurad5b55a2016-05-24 14:52:50 +000037#include "llvm/Support/MipsABIFlags.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000038
Kate Stoneb9c1b512016-09-06 20:57:50 +000039#define CASE_AND_STREAM(s, def, width) \
40 case def: \
41 s->Printf("%-*s", width, #def); \
42 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000043
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044using namespace lldb;
45using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000046using namespace elf;
47using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000048
Stephen Wilson499b40e2011-03-30 16:07:05 +000049namespace {
Todd Fialab91de782014-06-27 16:52:49 +000050
51// ELF note owner definitions
52const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000053const char *const LLDB_NT_OWNER_GNU = "GNU";
54const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Kamil Rytarowski12801f12017-03-26 15:34:57 +000055const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000056const char *const LLDB_NT_OWNER_CSR = "csr";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000057const char *const LLDB_NT_OWNER_ANDROID = "Android";
Kate Stoneb9c1b512016-09-06 20:57:50 +000058const char *const LLDB_NT_OWNER_CORE = "CORE";
59const char *const LLDB_NT_OWNER_LINUX = "LINUX";
Todd Fialab91de782014-06-27 16:52:49 +000060
61// ELF note type definitions
Kate Stoneb9c1b512016-09-06 20:57:50 +000062const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000063const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
64
Kate Stoneb9c1b512016-09-06 20:57:50 +000065const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
66const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
Todd Fialab91de782014-06-27 16:52:49 +000067
68const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
69
Kate Stoneb9c1b512016-09-06 20:57:50 +000070const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
71const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
Todd Fialab91de782014-06-27 16:52:49 +000072
73// GNU ABI note OS constants
Kate Stoneb9c1b512016-09-06 20:57:50 +000074const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
75const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000076const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
77
Greg Claytonb704b692015-10-28 18:04:38 +000078// LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants
Kate Stoneb9c1b512016-09-06 20:57:50 +000079#define NT_PRSTATUS 1
80#define NT_PRFPREG 2
81#define NT_PRPSINFO 3
82#define NT_TASKSTRUCT 4
83#define NT_AUXV 6
84#define NT_SIGINFO 0x53494749
85#define NT_FILE 0x46494c45
86#define NT_PRXFPREG 0x46e62b7f
87#define NT_PPC_VMX 0x100
88#define NT_PPC_SPE 0x101
89#define NT_PPC_VSX 0x102
90#define NT_386_TLS 0x200
91#define NT_386_IOPERM 0x201
92#define NT_X86_XSTATE 0x202
93#define NT_S390_HIGH_GPRS 0x300
94#define NT_S390_TIMER 0x301
95#define NT_S390_TODCMP 0x302
96#define NT_S390_TODPREG 0x303
97#define NT_S390_CTRS 0x304
98#define NT_S390_PREFIX 0x305
99#define NT_S390_LAST_BREAK 0x306
100#define NT_S390_SYSTEM_CALL 0x307
101#define NT_S390_TDB 0x308
102#define NT_S390_VXRS_LOW 0x309
103#define NT_S390_VXRS_HIGH 0x30a
104#define NT_ARM_VFP 0x400
105#define NT_ARM_TLS 0x401
106#define NT_ARM_HW_BREAK 0x402
107#define NT_ARM_HW_WATCH 0x403
108#define NT_ARM_SYSTEM_CALL 0x404
109#define NT_METAG_CBUF 0x500
110#define NT_METAG_RPIPE 0x501
111#define NT_METAG_TLS 0x502
Greg Claytonb704b692015-10-28 18:04:38 +0000112
Stephen Wilson499b40e2011-03-30 16:07:05 +0000113//===----------------------------------------------------------------------===//
114/// @class ELFRelocation
115/// @brief Generic wrapper for ELFRel and ELFRela.
116///
117/// This helper class allows us to parse both ELFRel and ELFRela relocation
118/// entries in a generic manner.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000119class ELFRelocation {
Stephen Wilson499b40e2011-03-30 16:07:05 +0000120public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121 /// Constructs an ELFRelocation entry with a personality as given by @p
122 /// type.
123 ///
124 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
125 ELFRelocation(unsigned type);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000126
Kate Stoneb9c1b512016-09-06 20:57:50 +0000127 ~ELFRelocation();
Ed Maste81b4c5f2016-01-04 01:43:47 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 static unsigned RelocType32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 static unsigned RelocType64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 static unsigned RelocSymbol32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 static unsigned RelocSymbol64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000138
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 static unsigned RelocOffset32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141 static unsigned RelocOffset64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 static unsigned RelocAddend32(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 static unsigned RelocAddend64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000146
Stephen Wilson499b40e2011-03-30 16:07:05 +0000147private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000148 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000149
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 RelocUnion reloc;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000151};
152
Kate Stoneb9c1b512016-09-06 20:57:50 +0000153ELFRelocation::ELFRelocation(unsigned type) {
154 if (type == DT_REL || type == SHT_REL)
155 reloc = new ELFRel();
156 else if (type == DT_RELA || type == SHT_RELA)
157 reloc = new ELFRela();
158 else {
159 assert(false && "unexpected relocation type");
160 reloc = static_cast<ELFRel *>(NULL);
161 }
Stephen Wilson499b40e2011-03-30 16:07:05 +0000162}
163
Kate Stoneb9c1b512016-09-06 20:57:50 +0000164ELFRelocation::~ELFRelocation() {
165 if (reloc.is<ELFRel *>())
166 delete reloc.get<ELFRel *>();
167 else
168 delete reloc.get<ELFRela *>();
Stephen Wilson499b40e2011-03-30 16:07:05 +0000169}
170
Kate Stoneb9c1b512016-09-06 20:57:50 +0000171bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
172 lldb::offset_t *offset) {
173 if (reloc.is<ELFRel *>())
174 return reloc.get<ELFRel *>()->Parse(data, offset);
175 else
176 return reloc.get<ELFRela *>()->Parse(data, offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000177}
178
Kate Stoneb9c1b512016-09-06 20:57:50 +0000179unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
180 if (rel.reloc.is<ELFRel *>())
181 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
182 else
183 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000184}
185
Kate Stoneb9c1b512016-09-06 20:57:50 +0000186unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
187 if (rel.reloc.is<ELFRel *>())
188 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
189 else
190 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000191}
192
Kate Stoneb9c1b512016-09-06 20:57:50 +0000193unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
194 if (rel.reloc.is<ELFRel *>())
195 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
196 else
197 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000198}
199
Kate Stoneb9c1b512016-09-06 20:57:50 +0000200unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
201 if (rel.reloc.is<ELFRel *>())
202 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
203 else
204 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000205}
206
Kate Stoneb9c1b512016-09-06 20:57:50 +0000207unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
208 if (rel.reloc.is<ELFRel *>())
209 return rel.reloc.get<ELFRel *>()->r_offset;
210 else
211 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000212}
213
Kate Stoneb9c1b512016-09-06 20:57:50 +0000214unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
215 if (rel.reloc.is<ELFRel *>())
216 return rel.reloc.get<ELFRel *>()->r_offset;
217 else
218 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000219}
220
Kate Stoneb9c1b512016-09-06 20:57:50 +0000221unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
222 if (rel.reloc.is<ELFRel *>())
223 return 0;
224 else
225 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000226}
227
Kate Stoneb9c1b512016-09-06 20:57:50 +0000228unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
229 if (rel.reloc.is<ELFRel *>())
230 return 0;
231 else
232 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000233}
234
Stephen Wilson499b40e2011-03-30 16:07:05 +0000235} // end anonymous namespace
236
Kate Stoneb9c1b512016-09-06 20:57:50 +0000237bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
238 // Read all fields.
239 if (data.GetU32(offset, &n_namesz, 3) == NULL)
240 return false;
Ed Mastec113ff82013-12-02 17:49:13 +0000241
Kate Stoneb9c1b512016-09-06 20:57:50 +0000242 // The name field is required to be nul-terminated, and n_namesz
243 // includes the terminating nul in observed implementations (contrary
244 // to the ELF-64 spec). A special case is needed for cores generated
245 // by some older Linux versions, which write a note named "CORE"
246 // without a nul terminator and n_namesz = 4.
247 if (n_namesz == 4) {
248 char buf[4];
249 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
250 return false;
251 if (strncmp(buf, "CORE", 4) == 0) {
252 n_name = "CORE";
253 *offset += 4;
254 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000255 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000256 }
Ed Mastec113ff82013-12-02 17:49:13 +0000257
Kate Stoneb9c1b512016-09-06 20:57:50 +0000258 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
259 if (cstr == NULL) {
260 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
261 if (log)
262 log->Printf("Failed to parse note name lacking nul terminator");
Ed Mastec113ff82013-12-02 17:49:13 +0000263
Kate Stoneb9c1b512016-09-06 20:57:50 +0000264 return false;
265 }
266 n_name = cstr;
267 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000268}
269
Kate Stoneb9c1b512016-09-06 20:57:50 +0000270static uint32_t kalimbaVariantFromElfFlags(const elf::elf_word e_flags) {
271 const uint32_t dsp_rev = e_flags & 0xFF;
272 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE;
273 switch (dsp_rev) {
274 // TODO(mg11) Support more variants
275 case 10:
276 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3;
277 break;
278 case 14:
279 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4;
280 break;
281 case 17:
282 case 20:
283 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5;
284 break;
285 default:
286 break;
287 }
288 return kal_arch_variant;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000289}
290
Nitesh Jain706c5202017-03-31 11:06:25 +0000291static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
292 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
293 uint32_t endian = header.e_ident[EI_DATA];
Kate Stoneb9c1b512016-09-06 20:57:50 +0000294 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
Nitesh Jain706c5202017-03-31 11:06:25 +0000295 uint32_t fileclass = header.e_ident[EI_CLASS];
296
297 // If there aren't any elf flags available (e.g core elf file) then return default
298 // 32 or 64 bit arch (without any architecture revision) based on object file's class.
299 if (header.e_type == ET_CORE) {
300 switch (fileclass) {
301 case llvm::ELF::ELFCLASS32:
302 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
303 : ArchSpec::eMIPSSubType_mips32;
304 case llvm::ELF::ELFCLASS64:
305 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
306 : ArchSpec::eMIPSSubType_mips64;
307 default:
308 return arch_variant;
309 }
310 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000311
Kate Stoneb9c1b512016-09-06 20:57:50 +0000312 switch (mips_arch) {
313 case llvm::ELF::EF_MIPS_ARCH_1:
314 case llvm::ELF::EF_MIPS_ARCH_2:
315 case llvm::ELF::EF_MIPS_ARCH_32:
316 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
317 : ArchSpec::eMIPSSubType_mips32;
318 case llvm::ELF::EF_MIPS_ARCH_32R2:
319 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
320 : ArchSpec::eMIPSSubType_mips32r2;
321 case llvm::ELF::EF_MIPS_ARCH_32R6:
322 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
323 : ArchSpec::eMIPSSubType_mips32r6;
324 case llvm::ELF::EF_MIPS_ARCH_3:
325 case llvm::ELF::EF_MIPS_ARCH_4:
326 case llvm::ELF::EF_MIPS_ARCH_5:
327 case llvm::ELF::EF_MIPS_ARCH_64:
328 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
329 : ArchSpec::eMIPSSubType_mips64;
330 case llvm::ELF::EF_MIPS_ARCH_64R2:
331 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
332 : ArchSpec::eMIPSSubType_mips64r2;
333 case llvm::ELF::EF_MIPS_ARCH_64R6:
334 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
335 : ArchSpec::eMIPSSubType_mips64r6;
336 default:
337 break;
338 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000339
Kate Stoneb9c1b512016-09-06 20:57:50 +0000340 return arch_variant;
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000341}
342
Kate Stoneb9c1b512016-09-06 20:57:50 +0000343static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
344 if (header.e_machine == llvm::ELF::EM_MIPS)
Nitesh Jain706c5202017-03-31 11:06:25 +0000345 return mipsVariantFromElfFlags(header);
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000346
Kate Stoneb9c1b512016-09-06 20:57:50 +0000347 return llvm::ELF::EM_CSR_KALIMBA == header.e_machine
348 ? kalimbaVariantFromElfFlags(header.e_flags)
349 : LLDB_INVALID_CPUTYPE;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000350}
351
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000352//! The kalimba toolchain identifies a code section as being
353//! one with the SHT_PROGBITS set in the section sh_type and the top
354//! bit in the 32-bit address field set.
355static lldb::SectionType
Kate Stoneb9c1b512016-09-06 20:57:50 +0000356kalimbaSectionType(const elf::ELFHeader &header,
357 const elf::ELFSectionHeader &sect_hdr) {
358 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine) {
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000359 return eSectionTypeOther;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000360 }
361
362 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type) {
363 return eSectionTypeZeroFill;
364 }
365
366 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type) {
367 const lldb::addr_t KAL_CODE_BIT = 1 << 31;
368 return KAL_CODE_BIT & sect_hdr.sh_addr ? eSectionTypeCode
369 : eSectionTypeData;
370 }
371
372 return eSectionTypeOther;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000373}
374
Todd Fiala4339f3a2014-03-25 19:29:09 +0000375// Arbitrary constant used as UUID prefix for core files.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000376const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000377
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000378//------------------------------------------------------------------
379// Static methods.
380//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000381void ObjectFileELF::Initialize() {
382 PluginManager::RegisterPlugin(GetPluginNameStatic(),
383 GetPluginDescriptionStatic(), CreateInstance,
384 CreateMemoryInstance, GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000385}
386
Kate Stoneb9c1b512016-09-06 20:57:50 +0000387void ObjectFileELF::Terminate() {
388 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000389}
390
Kate Stoneb9c1b512016-09-06 20:57:50 +0000391lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
392 static ConstString g_name("elf");
393 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000394}
395
Kate Stoneb9c1b512016-09-06 20:57:50 +0000396const char *ObjectFileELF::GetPluginDescriptionStatic() {
397 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000398}
399
Kate Stoneb9c1b512016-09-06 20:57:50 +0000400ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
401 DataBufferSP &data_sp,
402 lldb::offset_t data_offset,
403 const lldb_private::FileSpec *file,
404 lldb::offset_t file_offset,
405 lldb::offset_t length) {
406 if (!data_sp) {
Zachary Turner666cc0b2017-03-04 01:30:05 +0000407 data_sp =
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000408 DataBufferLLVM::CreateSliceFromPath(file->GetPath(), length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000409 if (!data_sp)
410 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000411 data_offset = 0;
412 }
413
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000414 assert(data_sp);
415
416 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
417 return nullptr;
418
419 const uint8_t *magic = data_sp->GetBytes() + data_offset;
420 if (!ELFHeader::MagicBytesMatch(magic))
421 return nullptr;
422
423 // Update the data to contain the entire file if it doesn't already
424 if (data_sp->GetByteSize() < length) {
Zachary Turner666cc0b2017-03-04 01:30:05 +0000425 data_sp =
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000426 DataBufferLLVM::CreateSliceFromPath(file->GetPath(), length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000427 if (!data_sp)
428 return nullptr;
429 data_offset = 0;
430 magic = data_sp->GetBytes();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000431 }
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000432
433 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
434 if (address_size == 4 || address_size == 8) {
435 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(
436 module_sp, data_sp, data_offset, file, file_offset, length));
437 ArchSpec spec;
438 if (objfile_ap->GetArchitecture(spec) &&
439 objfile_ap->SetModulesArchitecture(spec))
440 return objfile_ap.release();
441 }
442
Kate Stoneb9c1b512016-09-06 20:57:50 +0000443 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000444}
445
Kate Stoneb9c1b512016-09-06 20:57:50 +0000446ObjectFile *ObjectFileELF::CreateMemoryInstance(
447 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
448 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
449 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) {
450 const uint8_t *magic = data_sp->GetBytes();
451 if (ELFHeader::MagicBytesMatch(magic)) {
452 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
453 if (address_size == 4 || address_size == 8) {
454 std::auto_ptr<ObjectFileELF> objfile_ap(
455 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
456 ArchSpec spec;
457 if (objfile_ap->GetArchitecture(spec) &&
458 objfile_ap->SetModulesArchitecture(spec))
459 return objfile_ap.release();
460 }
Andrew MacPherson17220c12014-03-05 10:12:43 +0000461 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000462 }
463 return NULL;
Greg Claytonc9660542012-02-05 02:38:54 +0000464}
465
Kate Stoneb9c1b512016-09-06 20:57:50 +0000466bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp,
467 lldb::addr_t data_offset,
468 lldb::addr_t data_length) {
469 if (data_sp &&
470 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) {
471 const uint8_t *magic = data_sp->GetBytes() + data_offset;
472 return ELFHeader::MagicBytesMatch(magic);
473 }
474 return false;
Michael Sartain9f0013d2013-05-17 00:20:21 +0000475}
Greg Claytonc9660542012-02-05 02:38:54 +0000476
Michael Sartain9f4517a2013-07-03 01:52:14 +0000477/*
478 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
479 *
480 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
481 * code or tables extracted from it, as desired without restriction.
482 */
Kate Stoneb9c1b512016-09-06 20:57:50 +0000483static uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size) {
484 static const uint32_t g_crc32_tab[] = {
485 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
486 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
487 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
488 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
489 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
490 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
491 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
492 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
493 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
494 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
495 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
496 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
497 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
498 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
499 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
500 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
501 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
502 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
503 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
504 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
505 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
506 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
507 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
508 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
509 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
510 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
511 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
512 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
513 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
514 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
515 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
516 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
517 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
518 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
519 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
520 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
521 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
522 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
523 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
524 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
525 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
526 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
527 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
528 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000529
Kate Stoneb9c1b512016-09-06 20:57:50 +0000530 crc = crc ^ ~0U;
531 while (size--)
532 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
533 return crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000534}
535
Kate Stoneb9c1b512016-09-06 20:57:50 +0000536static uint32_t calc_gnu_debuglink_crc32(const void *buf, size_t size) {
537 return calc_crc32(0U, buf, size);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000538}
539
Kate Stoneb9c1b512016-09-06 20:57:50 +0000540uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32(
541 const ProgramHeaderColl &program_headers, DataExtractor &object_data) {
542 typedef ProgramHeaderCollConstIter Iter;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000543
Kate Stoneb9c1b512016-09-06 20:57:50 +0000544 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000545
Kate Stoneb9c1b512016-09-06 20:57:50 +0000546 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I) {
547 if (I->p_type == llvm::ELF::PT_NOTE) {
548 const elf_off ph_offset = I->p_offset;
549 const size_t ph_size = I->p_filesz;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000550
Kate Stoneb9c1b512016-09-06 20:57:50 +0000551 DataExtractor segment_data;
552 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
553 // The ELF program header contained incorrect data,
554 // probably corefile is incomplete or corrupted.
555 break;
556 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000557
Kate Stoneb9c1b512016-09-06 20:57:50 +0000558 core_notes_crc = calc_crc32(core_notes_crc, segment_data.GetDataStart(),
559 segment_data.GetByteSize());
Todd Fiala4339f3a2014-03-25 19:29:09 +0000560 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000561 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000562
Kate Stoneb9c1b512016-09-06 20:57:50 +0000563 return core_notes_crc;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000564}
565
Kate Stoneb9c1b512016-09-06 20:57:50 +0000566static const char *OSABIAsCString(unsigned char osabi_byte) {
567#define _MAKE_OSABI_CASE(x) \
568 case x: \
569 return #x
570 switch (osabi_byte) {
571 _MAKE_OSABI_CASE(ELFOSABI_NONE);
572 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
573 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
574 _MAKE_OSABI_CASE(ELFOSABI_GNU);
575 _MAKE_OSABI_CASE(ELFOSABI_HURD);
576 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
577 _MAKE_OSABI_CASE(ELFOSABI_AIX);
578 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
579 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
580 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
581 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
582 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
583 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
584 _MAKE_OSABI_CASE(ELFOSABI_NSK);
585 _MAKE_OSABI_CASE(ELFOSABI_AROS);
586 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
587 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
588 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
589 _MAKE_OSABI_CASE(ELFOSABI_ARM);
590 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
591 default:
592 return "<unknown-osabi>";
593 }
Todd Fialab91de782014-06-27 16:52:49 +0000594#undef _MAKE_OSABI_CASE
595}
596
Ed Mastef6a13122015-06-05 13:03:08 +0000597//
598// WARNING : This function is being deprecated
599// It's functionality has moved to ArchSpec::SetArchitecture
600// This function is only being kept to validate the move.
601//
602// TODO : Remove this function
Kate Stoneb9c1b512016-09-06 20:57:50 +0000603static bool GetOsFromOSABI(unsigned char osabi_byte,
604 llvm::Triple::OSType &ostype) {
605 switch (osabi_byte) {
606 case ELFOSABI_AIX:
607 ostype = llvm::Triple::OSType::AIX;
608 break;
609 case ELFOSABI_FREEBSD:
610 ostype = llvm::Triple::OSType::FreeBSD;
611 break;
612 case ELFOSABI_GNU:
613 ostype = llvm::Triple::OSType::Linux;
614 break;
615 case ELFOSABI_NETBSD:
616 ostype = llvm::Triple::OSType::NetBSD;
617 break;
618 case ELFOSABI_OPENBSD:
619 ostype = llvm::Triple::OSType::OpenBSD;
620 break;
621 case ELFOSABI_SOLARIS:
622 ostype = llvm::Triple::OSType::Solaris;
623 break;
624 default:
625 ostype = llvm::Triple::OSType::UnknownOS;
626 }
627 return ostype != llvm::Triple::OSType::UnknownOS;
Todd Fialab91de782014-06-27 16:52:49 +0000628}
629
Kate Stoneb9c1b512016-09-06 20:57:50 +0000630size_t ObjectFileELF::GetModuleSpecifications(
631 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
632 lldb::offset_t data_offset, lldb::offset_t file_offset,
633 lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
634 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Todd Fialab91de782014-06-27 16:52:49 +0000635
Kate Stoneb9c1b512016-09-06 20:57:50 +0000636 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000637
Kate Stoneb9c1b512016-09-06 20:57:50 +0000638 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
639 DataExtractor data;
640 data.SetData(data_sp);
641 elf::ELFHeader header;
Pavel Labath23ccc292017-01-31 23:09:46 +0000642 lldb::offset_t header_offset = data_offset;
643 if (header.Parse(data, &header_offset)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000644 if (data_sp) {
645 ModuleSpec spec(file);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000646
Kate Stoneb9c1b512016-09-06 20:57:50 +0000647 const uint32_t sub_type = subTypeFromElfHeader(header);
648 spec.GetArchitecture().SetArchitecture(
649 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000650
Kate Stoneb9c1b512016-09-06 20:57:50 +0000651 if (spec.GetArchitecture().IsValid()) {
652 llvm::Triple::OSType ostype;
653 llvm::Triple::VendorType vendor;
654 llvm::Triple::OSType spec_ostype =
655 spec.GetArchitecture().GetTriple().getOS();
Todd Fialab91de782014-06-27 16:52:49 +0000656
Kate Stoneb9c1b512016-09-06 20:57:50 +0000657 if (log)
658 log->Printf("ObjectFileELF::%s file '%s' module OSABI: %s",
659 __FUNCTION__, file.GetPath().c_str(),
660 OSABIAsCString(header.e_ident[EI_OSABI]));
Ed Mastef6a13122015-06-05 13:03:08 +0000661
Kate Stoneb9c1b512016-09-06 20:57:50 +0000662 // SetArchitecture should have set the vendor to unknown
663 vendor = spec.GetArchitecture().GetTriple().getVendor();
664 assert(vendor == llvm::Triple::UnknownVendor);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +0000665 UNUSED_IF_ASSERT_DISABLED(vendor);
Ed Mastef6a13122015-06-05 13:03:08 +0000666
Kate Stoneb9c1b512016-09-06 20:57:50 +0000667 //
668 // Validate it is ok to remove GetOsFromOSABI
669 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
670 assert(spec_ostype == ostype);
671 if (spec_ostype != llvm::Triple::OSType::UnknownOS) {
672 if (log)
673 log->Printf("ObjectFileELF::%s file '%s' set ELF module OS type "
674 "from ELF header OSABI.",
675 __FUNCTION__, file.GetPath().c_str());
676 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000677
Pavel Labath23ccc292017-01-31 23:09:46 +0000678 // In case there is header extension in the section #0, the header
679 // we parsed above could have sentinel values for e_phnum, e_shnum,
680 // and e_shstrndx. In this case we need to reparse the header
681 // with a bigger data source to get the actual values.
682 size_t section_header_end = header.e_shoff + header.e_shentsize;
683 if (header.HasHeaderExtension() &&
684 section_header_end > data_sp->GetByteSize()) {
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000685 data_sp = DataBufferLLVM::CreateSliceFromPath(
Zachary Turner666cc0b2017-03-04 01:30:05 +0000686 file.GetPath(), section_header_end, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000687 if (data_sp) {
688 data.SetData(data_sp);
689 lldb::offset_t header_offset = data_offset;
690 header.Parse(data, &header_offset);
691 }
Pavel Labath23ccc292017-01-31 23:09:46 +0000692 }
693
Kate Stoneb9c1b512016-09-06 20:57:50 +0000694 // Try to get the UUID from the section list. Usually that's at the
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000695 // end, so map the file in if we don't have it already.
Pavel Labath23ccc292017-01-31 23:09:46 +0000696 section_header_end =
Kate Stoneb9c1b512016-09-06 20:57:50 +0000697 header.e_shoff + header.e_shnum * header.e_shentsize;
698 if (section_header_end > data_sp->GetByteSize()) {
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000699 data_sp = DataBufferLLVM::CreateSliceFromPath(
Zachary Turner666cc0b2017-03-04 01:30:05 +0000700 file.GetPath(), section_header_end, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000701 if (data_sp)
702 data.SetData(data_sp);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000703 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000704
Kate Stoneb9c1b512016-09-06 20:57:50 +0000705 uint32_t gnu_debuglink_crc = 0;
706 std::string gnu_debuglink_file;
707 SectionHeaderColl section_headers;
708 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000709
Kate Stoneb9c1b512016-09-06 20:57:50 +0000710 using namespace std::placeholders;
711 const SetDataFunction set_data =
712 std::bind(&ObjectFileELF::SetData, std::cref(data), _1, _2, _3);
713 GetSectionHeaderInfo(section_headers, set_data, header, uuid,
714 gnu_debuglink_file, gnu_debuglink_crc,
715 spec.GetArchitecture());
Ravitheja Addepally15f89c42016-01-19 12:55:21 +0000716
Kate Stoneb9c1b512016-09-06 20:57:50 +0000717 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple();
Todd Fialab91de782014-06-27 16:52:49 +0000718
Kate Stoneb9c1b512016-09-06 20:57:50 +0000719 if (log)
720 log->Printf("ObjectFileELF::%s file '%s' module set to triple: %s "
721 "(architecture %s)",
722 __FUNCTION__, file.GetPath().c_str(),
723 spec_triple.getTriple().c_str(),
724 spec.GetArchitecture().GetArchitectureName());
Todd Fialab91de782014-06-27 16:52:49 +0000725
Kate Stoneb9c1b512016-09-06 20:57:50 +0000726 if (!uuid.IsValid()) {
727 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000728
Kate Stoneb9c1b512016-09-06 20:57:50 +0000729 if (!gnu_debuglink_crc) {
730 lldb_private::Timer scoped_timer(
731 LLVM_PRETTY_FUNCTION,
732 "Calculating module crc32 %s with size %" PRIu64 " KiB",
733 file.GetLastPathComponent().AsCString(),
734 (file.GetByteSize() - file_offset) / 1024);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000735
Kate Stoneb9c1b512016-09-06 20:57:50 +0000736 // For core files - which usually don't happen to have a
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000737 // gnu_debuglink, and are pretty bulky - calculating whole
738 // contents crc32 would be too much of luxury. Thus we will need
739 // to fallback to something simpler.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000740 if (header.e_type == llvm::ELF::ET_CORE) {
741 size_t program_headers_end =
742 header.e_phoff + header.e_phnum * header.e_phentsize;
743 if (program_headers_end > data_sp->GetByteSize()) {
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000744 data_sp = DataBufferLLVM::CreateSliceFromPath(
Zachary Turner666cc0b2017-03-04 01:30:05 +0000745 file.GetPath(), program_headers_end, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000746 if (data_sp)
747 data.SetData(data_sp);
Michael Sartain9f0013d2013-05-17 00:20:21 +0000748 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000749 ProgramHeaderColl program_headers;
750 GetProgramHeaderInfo(program_headers, set_data, header);
Michael Sartainc836ae72013-05-23 20:57:03 +0000751
Kate Stoneb9c1b512016-09-06 20:57:50 +0000752 size_t segment_data_end = 0;
753 for (ProgramHeaderCollConstIter I = program_headers.begin();
754 I != program_headers.end(); ++I) {
755 segment_data_end = std::max<unsigned long long>(
756 I->p_offset + I->p_filesz, segment_data_end);
757 }
758
759 if (segment_data_end > data_sp->GetByteSize()) {
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000760 data_sp = DataBufferLLVM::CreateSliceFromPath(
Zachary Turner666cc0b2017-03-04 01:30:05 +0000761 file.GetPath(), segment_data_end, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000762 if (data_sp)
763 data.SetData(data_sp);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000764 }
765
766 core_notes_crc =
767 CalculateELFNotesSegmentsCRC32(program_headers, data);
768 } else {
769 // Need to map entire file into memory to calculate the crc.
Zachary Turner7f6a7a32017-03-06 23:42:14 +0000770 data_sp = DataBufferLLVM::CreateSliceFromPath(file.GetPath(), -1,
Zachary Turner666cc0b2017-03-04 01:30:05 +0000771 file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000772 if (data_sp) {
773 data.SetData(data_sp);
774 gnu_debuglink_crc = calc_gnu_debuglink_crc32(
775 data.GetDataStart(), data.GetByteSize());
776 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000777 }
778 }
779 if (gnu_debuglink_crc) {
780 // Use 4 bytes of crc from the .gnu_debuglink section.
781 uint32_t uuidt[4] = {gnu_debuglink_crc, 0, 0, 0};
782 uuid.SetBytes(uuidt, sizeof(uuidt));
783 } else if (core_notes_crc) {
784 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
785 // it look different form
786 // .gnu_debuglink crc followed by 4 bytes of note segments crc.
787 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
788 uuid.SetBytes(uuidt, sizeof(uuidt));
789 }
790 }
791
792 specs.Append(spec);
793 }
794 }
795 }
796 }
797
798 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000799}
800
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000801//------------------------------------------------------------------
802// PluginInterface protocol
803//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000804lldb_private::ConstString ObjectFileELF::GetPluginName() {
805 return GetPluginNameStatic();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000806}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000807
Kate Stoneb9c1b512016-09-06 20:57:50 +0000808uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000809//------------------------------------------------------------------
810// ObjectFile protocol
811//------------------------------------------------------------------
812
Kate Stoneb9c1b512016-09-06 20:57:50 +0000813ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
814 DataBufferSP &data_sp, lldb::offset_t data_offset,
815 const FileSpec *file, lldb::offset_t file_offset,
816 lldb::offset_t length)
817 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
818 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
819 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
820 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
821 if (file)
822 m_file = *file;
823 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000824}
825
Kate Stoneb9c1b512016-09-06 20:57:50 +0000826ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
827 DataBufferSP &header_data_sp,
828 const lldb::ProcessSP &process_sp,
829 addr_t header_addr)
830 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
831 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
832 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
833 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
834 ::memset(&m_header, 0, sizeof(m_header));
Andrew MacPherson17220c12014-03-05 10:12:43 +0000835}
836
Kate Stoneb9c1b512016-09-06 20:57:50 +0000837ObjectFileELF::~ObjectFileELF() {}
838
839bool ObjectFileELF::IsExecutable() const {
840 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000841}
842
Kate Stoneb9c1b512016-09-06 20:57:50 +0000843bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
844 bool value_is_offset) {
845 ModuleSP module_sp = GetModule();
846 if (module_sp) {
847 size_t num_loaded_sections = 0;
848 SectionList *section_list = GetSectionList();
849 if (section_list) {
850 if (!value_is_offset) {
851 bool found_offset = false;
Kamil Rytarowski12801f12017-03-26 15:34:57 +0000852 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000853 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i);
854 if (header == nullptr)
855 continue;
Jim Ingham5aee1622010-08-09 23:31:02 +0000856
Kate Stoneb9c1b512016-09-06 20:57:50 +0000857 if (header->p_type != PT_LOAD || header->p_offset != 0)
858 continue;
Tamas Berghammerf2561842015-06-30 10:41:23 +0000859
Kate Stoneb9c1b512016-09-06 20:57:50 +0000860 value = value - header->p_vaddr;
861 found_offset = true;
862 break;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000863 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000864 if (!found_offset)
865 return false;
866 }
867
868 const size_t num_sections = section_list->GetSize();
869 size_t sect_idx = 0;
870
871 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
872 // Iterate through the object file sections to find all
873 // of the sections that have SHF_ALLOC in their flag bits.
874 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
875 if (section_sp && section_sp->Test(SHF_ALLOC)) {
876 lldb::addr_t load_addr = section_sp->GetFileAddress();
877 // We don't want to update the load address of a section with type
878 // eSectionTypeAbsoluteAddress as they already have the absolute load
879 // address
880 // already specified
881 if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
882 load_addr += value;
883
884 // On 32-bit systems the load address have to fit into 4 bytes. The
885 // rest of
886 // the bytes are the overflow from the addition.
887 if (GetAddressByteSize() == 4)
888 load_addr &= 0xFFFFFFFF;
889
890 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
891 load_addr))
892 ++num_loaded_sections;
893 }
894 }
895 return num_loaded_sections > 0;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000896 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000897 }
898 return false;
899}
900
901ByteOrder ObjectFileELF::GetByteOrder() const {
902 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
903 return eByteOrderBig;
904 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
905 return eByteOrderLittle;
906 return eByteOrderInvalid;
907}
908
909uint32_t ObjectFileELF::GetAddressByteSize() const {
910 return m_data.GetAddressByteSize();
911}
912
913AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
914 Symtab *symtab = GetSymtab();
915 if (!symtab)
916 return eAddressClassUnknown;
917
918 // The address class is determined based on the symtab. Ask it from the object
919 // file what
920 // contains the symtab information.
921 ObjectFile *symtab_objfile = symtab->GetObjectFile();
922 if (symtab_objfile != nullptr && symtab_objfile != this)
923 return symtab_objfile->GetAddressClass(file_addr);
924
925 auto res = ObjectFile::GetAddressClass(file_addr);
926 if (res != eAddressClassCode)
927 return res;
928
929 auto ub = m_address_class_map.upper_bound(file_addr);
930 if (ub == m_address_class_map.begin()) {
931 // No entry in the address class map before the address. Return
932 // default address class for an address in a code section.
933 return eAddressClassCode;
934 }
935
936 // Move iterator to the address class entry preceding address
937 --ub;
938
939 return ub->second;
940}
941
942size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
943 return std::distance(m_section_headers.begin(), I) + 1u;
944}
945
946size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
947 return std::distance(m_section_headers.begin(), I) + 1u;
948}
949
950bool ObjectFileELF::ParseHeader() {
951 lldb::offset_t offset = 0;
952 if (!m_header.Parse(m_data, &offset))
Tamas Berghammer42ecef32015-08-24 10:21:55 +0000953 return false;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000954
Kate Stoneb9c1b512016-09-06 20:57:50 +0000955 if (!IsInMemory())
Tamas Berghammerf2561842015-06-30 10:41:23 +0000956 return true;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000957
958 // For in memory object files m_data might not contain the full object file.
959 // Try to load it
960 // until the end of the "Section header table" what is at the end of the ELF
961 // file.
962 addr_t file_size = m_header.e_shoff + m_header.e_shnum * m_header.e_shentsize;
963 if (m_data.GetByteSize() < file_size) {
964 ProcessSP process_sp(m_process_wp.lock());
965 if (!process_sp)
966 return false;
967
968 DataBufferSP data_sp = ReadMemory(process_sp, m_memory_addr, file_size);
969 if (!data_sp)
970 return false;
971 m_data.SetData(data_sp, 0, file_size);
972 }
973
974 return true;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000975}
976
Kate Stoneb9c1b512016-09-06 20:57:50 +0000977bool ObjectFileELF::GetUUID(lldb_private::UUID *uuid) {
978 // Need to parse the section list to get the UUIDs, so make sure that's been
979 // done.
980 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000981 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000982
983 if (m_uuid.IsValid()) {
984 // We have the full build id uuid.
985 *uuid = m_uuid;
986 return true;
987 } else if (GetType() == ObjectFile::eTypeCoreFile) {
988 uint32_t core_notes_crc = 0;
989
990 if (!ParseProgramHeaders())
991 return false;
992
993 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
994
995 if (core_notes_crc) {
996 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it
997 // look different form .gnu_debuglink crc - followed by 4 bytes of note
998 // segments crc.
999 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
1000 m_uuid.SetBytes(uuidt, sizeof(uuidt));
1001 }
1002 } else {
1003 if (!m_gnu_debuglink_crc)
1004 m_gnu_debuglink_crc =
1005 calc_gnu_debuglink_crc32(m_data.GetDataStart(), m_data.GetByteSize());
1006 if (m_gnu_debuglink_crc) {
1007 // Use 4 bytes of crc from the .gnu_debuglink section.
1008 uint32_t uuidt[4] = {m_gnu_debuglink_crc, 0, 0, 0};
1009 m_uuid.SetBytes(uuidt, sizeof(uuidt));
1010 }
1011 }
1012
1013 if (m_uuid.IsValid()) {
1014 *uuid = m_uuid;
1015 return true;
1016 }
1017
1018 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001019}
1020
Kate Stoneb9c1b512016-09-06 20:57:50 +00001021lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() {
1022 FileSpecList file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +00001023
Kate Stoneb9c1b512016-09-06 20:57:50 +00001024 if (!m_gnu_debuglink_file.empty()) {
Malcolm Parsons771ef6d2016-11-02 20:34:10 +00001025 FileSpec file_spec(m_gnu_debuglink_file, false);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001026 file_spec_list.Append(file_spec);
1027 }
1028 return file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +00001029}
1030
Kate Stoneb9c1b512016-09-06 20:57:50 +00001031uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
1032 size_t num_modules = ParseDependentModules();
1033 uint32_t num_specs = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001034
Kate Stoneb9c1b512016-09-06 20:57:50 +00001035 for (unsigned i = 0; i < num_modules; ++i) {
1036 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
1037 num_specs++;
1038 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001039
Kate Stoneb9c1b512016-09-06 20:57:50 +00001040 return num_specs;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001041}
1042
Kate Stoneb9c1b512016-09-06 20:57:50 +00001043Address ObjectFileELF::GetImageInfoAddress(Target *target) {
1044 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001045 return Address();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001046
1047 SectionList *section_list = GetSectionList();
1048 if (!section_list)
1049 return Address();
1050
1051 // Find the SHT_DYNAMIC (.dynamic) section.
1052 SectionSP dynsym_section_sp(
1053 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
1054 if (!dynsym_section_sp)
1055 return Address();
1056 assert(dynsym_section_sp->GetObjectFile() == this);
1057
1058 user_id_t dynsym_id = dynsym_section_sp->GetID();
1059 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
1060 if (!dynsym_hdr)
1061 return Address();
1062
1063 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
1064 ELFDynamic &symbol = m_dynamic_symbols[i];
1065
1066 if (symbol.d_tag == DT_DEBUG) {
1067 // Compute the offset as the number of previous entries plus the
1068 // size of d_tag.
1069 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1070 return Address(dynsym_section_sp, offset);
1071 }
1072 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
1073 // exists in non-PIE.
1074 else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
1075 symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
1076 target) {
1077 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1078 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
1079 if (dyn_base == LLDB_INVALID_ADDRESS)
1080 return Address();
1081
1082 Error error;
1083 if (symbol.d_tag == DT_MIPS_RLD_MAP) {
1084 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
1085 Address addr;
1086 if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
1087 addr))
1088 return addr;
1089 }
1090 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) {
1091 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer,
1092 // relative to the address of the tag.
1093 uint64_t rel_offset;
1094 rel_offset = target->ReadUnsignedIntegerFromMemory(
1095 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error);
1096 if (error.Success() && rel_offset != UINT64_MAX) {
1097 Address addr;
1098 addr_t debug_ptr_address =
1099 dyn_base + (offset - GetAddressByteSize()) + rel_offset;
1100 addr.SetOffset(debug_ptr_address);
1101 return addr;
1102 }
1103 }
1104 }
1105 }
1106
1107 return Address();
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001108}
1109
Kate Stoneb9c1b512016-09-06 20:57:50 +00001110lldb_private::Address ObjectFileELF::GetEntryPointAddress() {
1111 if (m_entry_point_address.IsValid())
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001112 return m_entry_point_address;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001113
1114 if (!ParseHeader() || !IsExecutable())
1115 return m_entry_point_address;
1116
1117 SectionList *section_list = GetSectionList();
1118 addr_t offset = m_header.e_entry;
1119
1120 if (!section_list)
1121 m_entry_point_address.SetOffset(offset);
1122 else
1123 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
1124 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +00001125}
1126
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001127//----------------------------------------------------------------------
1128// ParseDependentModules
1129//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001130size_t ObjectFileELF::ParseDependentModules() {
1131 if (m_filespec_ap.get())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001132 return m_filespec_ap->GetSize();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001133
1134 m_filespec_ap.reset(new FileSpecList());
1135
1136 if (!ParseSectionHeaders())
1137 return 0;
1138
1139 SectionList *section_list = GetSectionList();
1140 if (!section_list)
1141 return 0;
1142
1143 // Find the SHT_DYNAMIC section.
1144 Section *dynsym =
1145 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
1146 .get();
1147 if (!dynsym)
1148 return 0;
1149 assert(dynsym->GetObjectFile() == this);
1150
1151 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID());
1152 if (!header)
1153 return 0;
1154 // sh_link: section header index of string table used by entries in the
1155 // section.
1156 Section *dynstr = section_list->FindSectionByID(header->sh_link + 1).get();
1157 if (!dynstr)
1158 return 0;
1159
1160 DataExtractor dynsym_data;
1161 DataExtractor dynstr_data;
1162 if (ReadSectionData(dynsym, dynsym_data) &&
1163 ReadSectionData(dynstr, dynstr_data)) {
1164 ELFDynamic symbol;
1165 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1166 lldb::offset_t offset = 0;
1167
1168 // The only type of entries we are concerned with are tagged DT_NEEDED,
1169 // yielding the name of a required library.
1170 while (offset < section_size) {
1171 if (!symbol.Parse(dynsym_data, &offset))
1172 break;
1173
1174 if (symbol.d_tag != DT_NEEDED)
1175 continue;
1176
1177 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1178 const char *lib_name = dynstr_data.PeekCStr(str_index);
1179 m_filespec_ap->Append(FileSpec(lib_name, true));
1180 }
1181 }
1182
1183 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001184}
1185
1186//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001187// GetProgramHeaderInfo
1188//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001189size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
1190 const SetDataFunction &set_data,
1191 const ELFHeader &header) {
1192 // We have already parsed the program headers
1193 if (!program_headers.empty())
Todd Fiala4339f3a2014-03-25 19:29:09 +00001194 return program_headers.size();
1195
Kate Stoneb9c1b512016-09-06 20:57:50 +00001196 // If there are no program headers to read we are done.
1197 if (header.e_phnum == 0)
1198 return 0;
1199
1200 program_headers.resize(header.e_phnum);
1201 if (program_headers.size() != header.e_phnum)
1202 return 0;
1203
1204 const size_t ph_size = header.e_phnum * header.e_phentsize;
1205 const elf_off ph_offset = header.e_phoff;
1206 DataExtractor data;
1207 if (set_data(data, ph_offset, ph_size) != ph_size)
1208 return 0;
1209
1210 uint32_t idx;
1211 lldb::offset_t offset;
1212 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) {
1213 if (program_headers[idx].Parse(data, &offset) == false)
1214 break;
1215 }
1216
1217 if (idx < program_headers.size())
1218 program_headers.resize(idx);
1219
1220 return program_headers.size();
Todd Fiala4339f3a2014-03-25 19:29:09 +00001221}
1222
1223//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001224// ParseProgramHeaders
1225//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001226size_t ObjectFileELF::ParseProgramHeaders() {
1227 using namespace std::placeholders;
1228 return GetProgramHeaderInfo(
1229 m_program_headers,
1230 std::bind(&ObjectFileELF::SetDataWithReadMemoryFallback, this, _1, _2,
1231 _3),
1232 m_header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001233}
1234
Todd Fialab91de782014-06-27 16:52:49 +00001235lldb_private::Error
Kate Stoneb9c1b512016-09-06 20:57:50 +00001236ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
1237 lldb_private::ArchSpec &arch_spec,
1238 lldb_private::UUID &uuid) {
1239 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1240 Error error;
Todd Fialab91de782014-06-27 16:52:49 +00001241
Kate Stoneb9c1b512016-09-06 20:57:50 +00001242 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001243
Kate Stoneb9c1b512016-09-06 20:57:50 +00001244 while (true) {
1245 // Parse the note header. If this fails, bail out.
1246 const lldb::offset_t note_offset = offset;
1247 ELFNote note = ELFNote();
1248 if (!note.Parse(data, &offset)) {
1249 // We're done.
1250 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001251 }
Todd Fialab91de782014-06-27 16:52:49 +00001252
Kate Stoneb9c1b512016-09-06 20:57:50 +00001253 if (log)
1254 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32,
1255 __FUNCTION__, note.n_name.c_str(), note.n_type);
1256
1257 // Process FreeBSD ELF notes.
1258 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1259 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1260 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) {
1261 // Pull out the min version info.
1262 uint32_t version_info;
1263 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1264 error.SetErrorString("failed to read FreeBSD ABI note payload");
1265 return error;
1266 }
1267
1268 // Convert the version info into a major/minor number.
1269 const uint32_t version_major = version_info / 100000;
1270 const uint32_t version_minor = (version_info / 1000) % 100;
1271
1272 char os_name[32];
1273 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32,
1274 version_major, version_minor);
1275
1276 // Set the elf OS version to FreeBSD. Also clear the vendor.
1277 arch_spec.GetTriple().setOSName(os_name);
1278 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1279
1280 if (log)
1281 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32
1282 ".%" PRIu32,
1283 __FUNCTION__, version_major, version_minor,
1284 static_cast<uint32_t>(version_info % 1000));
1285 }
1286 // Process GNU ELF notes.
1287 else if (note.n_name == LLDB_NT_OWNER_GNU) {
1288 switch (note.n_type) {
1289 case LLDB_NT_GNU_ABI_TAG:
1290 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) {
1291 // Pull out the min OS version supporting the ABI.
1292 uint32_t version_info[4];
1293 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) ==
1294 nullptr) {
1295 error.SetErrorString("failed to read GNU ABI note payload");
1296 return error;
1297 }
1298
1299 // Set the OS per the OS field.
1300 switch (version_info[0]) {
1301 case LLDB_NT_GNU_ABI_OS_LINUX:
1302 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1303 arch_spec.GetTriple().setVendor(
1304 llvm::Triple::VendorType::UnknownVendor);
1305 if (log)
1306 log->Printf(
1307 "ObjectFileELF::%s detected Linux, min version %" PRIu32
1308 ".%" PRIu32 ".%" PRIu32,
1309 __FUNCTION__, version_info[1], version_info[2],
1310 version_info[3]);
1311 // FIXME we have the minimal version number, we could be propagating
1312 // that. version_info[1] = OS Major, version_info[2] = OS Minor,
1313 // version_info[3] = Revision.
1314 break;
1315 case LLDB_NT_GNU_ABI_OS_HURD:
1316 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1317 arch_spec.GetTriple().setVendor(
1318 llvm::Triple::VendorType::UnknownVendor);
1319 if (log)
1320 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min "
1321 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1322 __FUNCTION__, version_info[1], version_info[2],
1323 version_info[3]);
1324 break;
1325 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1326 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris);
1327 arch_spec.GetTriple().setVendor(
1328 llvm::Triple::VendorType::UnknownVendor);
1329 if (log)
1330 log->Printf(
1331 "ObjectFileELF::%s detected Solaris, min version %" PRIu32
1332 ".%" PRIu32 ".%" PRIu32,
1333 __FUNCTION__, version_info[1], version_info[2],
1334 version_info[3]);
1335 break;
1336 default:
1337 if (log)
1338 log->Printf(
1339 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32
1340 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1341 __FUNCTION__, version_info[0], version_info[1],
1342 version_info[2], version_info[3]);
1343 break;
1344 }
1345 }
1346 break;
1347
1348 case LLDB_NT_GNU_BUILD_ID_TAG:
1349 // Only bother processing this if we don't already have the uuid set.
1350 if (!uuid.IsValid()) {
1351 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a
1352 // build-id of a different
1353 // length. Accept it as long as it's at least 4 bytes as it will be
1354 // better than our own crc32.
1355 if (note.n_descsz >= 4 && note.n_descsz <= 20) {
1356 uint8_t uuidbuf[20];
1357 if (data.GetU8(&offset, &uuidbuf, note.n_descsz) == nullptr) {
1358 error.SetErrorString("failed to read GNU_BUILD_ID note payload");
1359 return error;
1360 }
1361
1362 // Save the build id as the UUID for the module.
1363 uuid.SetBytes(uuidbuf, note.n_descsz);
1364 }
1365 }
1366 break;
1367 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001368 if (arch_spec.IsMIPS() &&
1369 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1370 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform
1371 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001372 }
1373 // Process NetBSD ELF notes.
1374 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1375 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1376 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE)) {
1377 // Pull out the min version info.
1378 uint32_t version_info;
1379 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1380 error.SetErrorString("failed to read NetBSD ABI note payload");
1381 return error;
1382 }
1383
1384 // Set the elf OS version to NetBSD. Also clear the vendor.
1385 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD);
1386 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1387
1388 if (log)
1389 log->Printf(
1390 "ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32,
1391 __FUNCTION__, version_info);
1392 }
Kamil Rytarowski12801f12017-03-26 15:34:57 +00001393 // Process OpenBSD ELF notes.
1394 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) {
1395 // Set the elf OS version to OpenBSD. Also clear the vendor.
1396 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD);
1397 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1398 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001399 // Process CSR kalimba notes
1400 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1401 (note.n_name == LLDB_NT_OWNER_CSR)) {
1402 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1403 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1404
1405 // TODO At some point the description string could be processed.
1406 // It could provide a steer towards the kalimba variant which
1407 // this ELF targets.
1408 if (note.n_descsz) {
1409 const char *cstr =
1410 data.GetCStr(&offset, llvm::alignTo(note.n_descsz, 4));
1411 (void)cstr;
1412 }
1413 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) {
1414 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1415 arch_spec.GetTriple().setEnvironment(
1416 llvm::Triple::EnvironmentType::Android);
1417 } else if (note.n_name == LLDB_NT_OWNER_LINUX) {
1418 // This is sometimes found in core files and usually contains extended
1419 // register info
1420 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1421 } else if (note.n_name == LLDB_NT_OWNER_CORE) {
1422 // Parse the NT_FILE to look for stuff in paths to shared libraries
1423 // As the contents look like this in a 64 bit ELF core file:
1424 // count = 0x000000000000000a (10)
1425 // page_size = 0x0000000000001000 (4096)
1426 // Index start end file_ofs path
1427 // ===== ------------------ ------------------ ------------------
1428 // -------------------------------------
1429 // [ 0] 0x0000000000400000 0x0000000000401000 0x0000000000000000
1430 // /tmp/a.out
1431 // [ 1] 0x0000000000600000 0x0000000000601000 0x0000000000000000
1432 // /tmp/a.out
1433 // [ 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001
1434 // /tmp/a.out
1435 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
1436 // /lib/x86_64-linux-gnu/libc-2.19.so
1437 // [ 4] 0x00007fa79cba8000 0x00007fa79cda7000 0x00000000000001bb
1438 // /lib/x86_64-linux-gnu/libc-2.19.so
1439 // [ 5] 0x00007fa79cda7000 0x00007fa79cdab000 0x00000000000001ba
1440 // /lib/x86_64-linux-gnu/libc-2.19.so
1441 // [ 6] 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be
1442 // /lib/x86_64-linux-gnu/libc-2.19.so
1443 // [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000 0x0000000000000000
1444 // /lib/x86_64-linux-gnu/ld-2.19.so
1445 // [ 8] 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022
1446 // /lib/x86_64-linux-gnu/ld-2.19.so
1447 // [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000 0x0000000000000023
1448 // /lib/x86_64-linux-gnu/ld-2.19.so
1449 // In the 32 bit ELFs the count, page_size, start, end, file_ofs are
1450 // uint32_t
1451 // For reference: see readelf source code (in binutils).
1452 if (note.n_type == NT_FILE) {
1453 uint64_t count = data.GetAddress(&offset);
1454 const char *cstr;
1455 data.GetAddress(&offset); // Skip page size
1456 offset += count * 3 *
1457 data.GetAddressByteSize(); // Skip all start/end/file_ofs
1458 for (size_t i = 0; i < count; ++i) {
1459 cstr = data.GetCStr(&offset);
1460 if (cstr == nullptr) {
1461 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read "
1462 "at an offset after the end "
1463 "(GetCStr returned nullptr)",
1464 __FUNCTION__);
1465 return error;
1466 }
1467 llvm::StringRef path(cstr);
Richard Chamberlaina0c82e12016-10-13 12:11:00 +00001468 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001469 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1470 break;
1471 }
1472 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001473 if (arch_spec.IsMIPS() &&
1474 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1475 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing
1476 // for some cases (e.g. compile with -nostdlib)
1477 // Hence set OS to Linux
1478 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001479 }
1480 }
1481
1482 // Calculate the offset of the next note just in case "offset" has been used
1483 // to poke at the contents of the note data
1484 offset = note_offset + note.GetByteSize();
1485 }
1486
1487 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001488}
Michael Sartaina7499c92013-07-01 19:45:50 +00001489
Kate Stoneb9c1b512016-09-06 20:57:50 +00001490void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length,
1491 ArchSpec &arch_spec) {
1492 lldb::offset_t Offset = 0;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001493
Kate Stoneb9c1b512016-09-06 20:57:50 +00001494 uint8_t FormatVersion = data.GetU8(&Offset);
1495 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version)
1496 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001497
Kate Stoneb9c1b512016-09-06 20:57:50 +00001498 Offset = Offset + sizeof(uint32_t); // Section Length
1499 llvm::StringRef VendorName = data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001500
Kate Stoneb9c1b512016-09-06 20:57:50 +00001501 if (VendorName != "aeabi")
1502 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001503
Kate Stoneb9c1b512016-09-06 20:57:50 +00001504 if (arch_spec.GetTriple().getEnvironment() ==
1505 llvm::Triple::UnknownEnvironment)
1506 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001507
Kate Stoneb9c1b512016-09-06 20:57:50 +00001508 while (Offset < length) {
1509 uint8_t Tag = data.GetU8(&Offset);
1510 uint32_t Size = data.GetU32(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001511
Kate Stoneb9c1b512016-09-06 20:57:50 +00001512 if (Tag != llvm::ARMBuildAttrs::File || Size == 0)
1513 continue;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001514
Kate Stoneb9c1b512016-09-06 20:57:50 +00001515 while (Offset < length) {
1516 uint64_t Tag = data.GetULEB128(&Offset);
1517 switch (Tag) {
1518 default:
1519 if (Tag < 32)
1520 data.GetULEB128(&Offset);
1521 else if (Tag % 2 == 0)
1522 data.GetULEB128(&Offset);
1523 else
1524 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001525
Kate Stoneb9c1b512016-09-06 20:57:50 +00001526 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001527
Kate Stoneb9c1b512016-09-06 20:57:50 +00001528 case llvm::ARMBuildAttrs::CPU_raw_name:
1529 case llvm::ARMBuildAttrs::CPU_name:
1530 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001531
Kate Stoneb9c1b512016-09-06 20:57:50 +00001532 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001533
Kate Stoneb9c1b512016-09-06 20:57:50 +00001534 case llvm::ARMBuildAttrs::ABI_VFP_args: {
1535 uint64_t VFPArgs = data.GetULEB128(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001536
Kate Stoneb9c1b512016-09-06 20:57:50 +00001537 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) {
1538 if (arch_spec.GetTriple().getEnvironment() ==
1539 llvm::Triple::UnknownEnvironment ||
1540 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF)
1541 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001542
Kate Stoneb9c1b512016-09-06 20:57:50 +00001543 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1544 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) {
1545 if (arch_spec.GetTriple().getEnvironment() ==
1546 llvm::Triple::UnknownEnvironment ||
1547 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI)
1548 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001549
Kate Stoneb9c1b512016-09-06 20:57:50 +00001550 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001551 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001552
1553 break;
1554 }
1555 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001556 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001557 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001558}
Todd Fialab91de782014-06-27 16:52:49 +00001559
Michael Sartaina7499c92013-07-01 19:45:50 +00001560//----------------------------------------------------------------------
1561// GetSectionHeaderInfo
1562//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001563size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
1564 const SetDataFunction &set_data,
1565 const elf::ELFHeader &header,
1566 lldb_private::UUID &uuid,
1567 std::string &gnu_debuglink_file,
1568 uint32_t &gnu_debuglink_crc,
1569 ArchSpec &arch_spec) {
1570 // Don't reparse the section headers if we already did that.
1571 if (!section_headers.empty())
1572 return section_headers.size();
Todd Fiala6477ea82014-07-11 15:13:33 +00001573
Kate Stoneb9c1b512016-09-06 20:57:50 +00001574 // Only initialize the arch_spec to okay defaults if they're not already set.
1575 // We'll refine this with note data as we parse the notes.
1576 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) {
1577 llvm::Triple::OSType ostype;
1578 llvm::Triple::OSType spec_ostype;
1579 const uint32_t sub_type = subTypeFromElfHeader(header);
1580 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
1581 header.e_ident[EI_OSABI]);
Alexander Shaposhnikova08ba422016-12-05 18:42:21 +00001582
1583 // Validate if it is ok to remove GetOsFromOSABI.
1584 // Note, that now the OS is determined based on EI_OSABI flag and
1585 // the info extracted from ELF notes (see RefineModuleDetailsFromNote).
1586 // However in some cases that still might be not enough: for example
1587 // a shared library might not have any notes at all
1588 // and have EI_OSABI flag set to System V,
1589 // as result the OS will be set to UnknownOS.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001590 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
1591 spec_ostype = arch_spec.GetTriple().getOS();
1592 assert(spec_ostype == ostype);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +00001593 UNUSED_IF_ASSERT_DISABLED(spec_ostype);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001594 }
1595
1596 if (arch_spec.GetMachine() == llvm::Triple::mips ||
1597 arch_spec.GetMachine() == llvm::Triple::mipsel ||
1598 arch_spec.GetMachine() == llvm::Triple::mips64 ||
1599 arch_spec.GetMachine() == llvm::Triple::mips64el) {
1600 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) {
1601 case llvm::ELF::EF_MIPS_MICROMIPS:
1602 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips);
1603 break;
1604 case llvm::ELF::EF_MIPS_ARCH_ASE_M16:
1605 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16);
1606 break;
1607 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX:
1608 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx);
1609 break;
1610 default:
1611 break;
Todd Fialab91de782014-06-27 16:52:49 +00001612 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001613 }
Todd Fialab91de782014-06-27 16:52:49 +00001614
Kate Stoneb9c1b512016-09-06 20:57:50 +00001615 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1616 arch_spec.GetMachine() == llvm::Triple::thumb) {
1617 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT)
1618 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1619 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT)
1620 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1621 }
Jaydeep Patil501a7812015-07-16 03:51:55 +00001622
Kate Stoneb9c1b512016-09-06 20:57:50 +00001623 // If there are no section headers we are done.
1624 if (header.e_shnum == 0)
Michael Sartaina7499c92013-07-01 19:45:50 +00001625 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001626
1627 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1628
1629 section_headers.resize(header.e_shnum);
1630 if (section_headers.size() != header.e_shnum)
1631 return 0;
1632
1633 const size_t sh_size = header.e_shnum * header.e_shentsize;
1634 const elf_off sh_offset = header.e_shoff;
1635 DataExtractor sh_data;
1636 if (set_data(sh_data, sh_offset, sh_size) != sh_size)
1637 return 0;
1638
1639 uint32_t idx;
1640 lldb::offset_t offset;
1641 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) {
1642 if (section_headers[idx].Parse(sh_data, &offset) == false)
1643 break;
1644 }
1645 if (idx < section_headers.size())
1646 section_headers.resize(idx);
1647
1648 const unsigned strtab_idx = header.e_shstrndx;
1649 if (strtab_idx && strtab_idx < section_headers.size()) {
1650 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1651 const size_t byte_size = sheader.sh_size;
1652 const Elf64_Off offset = sheader.sh_offset;
1653 lldb_private::DataExtractor shstr_data;
1654
1655 if (set_data(shstr_data, offset, byte_size) == byte_size) {
1656 for (SectionHeaderCollIter I = section_headers.begin();
1657 I != section_headers.end(); ++I) {
1658 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink");
1659 const ELFSectionHeaderInfo &sheader = *I;
1660 const uint64_t section_size =
1661 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1662 ConstString name(shstr_data.PeekCStr(I->sh_name));
1663
1664 I->section_name = name;
1665
1666 if (arch_spec.IsMIPS()) {
1667 uint32_t arch_flags = arch_spec.GetFlags();
1668 DataExtractor data;
1669 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) {
1670
1671 if (section_size && (set_data(data, sheader.sh_offset,
1672 section_size) == section_size)) {
1673 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1674 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1675 arch_flags |= data.GetU32(&offset);
1676
1677 // The floating point ABI is at offset 7
1678 offset = 7;
1679 switch (data.GetU8(&offset)) {
1680 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY:
1681 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1682 break;
1683 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
1684 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1685 break;
1686 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE:
1687 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1688 break;
1689 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT:
1690 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1691 break;
1692 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64:
1693 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1694 break;
1695 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX:
1696 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1697 break;
1698 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64:
1699 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1700 break;
1701 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A:
1702 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1703 break;
1704 }
1705 }
1706 }
1707 // Settings appropriate ArchSpec ABI Flags
1708 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) {
1709 case llvm::ELF::EF_MIPS_ABI_O32:
1710 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1711 break;
1712 case EF_MIPS_ABI_O64:
1713 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1714 break;
1715 case EF_MIPS_ABI_EABI32:
1716 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1717 break;
1718 case EF_MIPS_ABI_EABI64:
1719 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1720 break;
1721 default:
1722 // ABI Mask doesn't cover N32 and N64 ABI.
1723 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1724 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
1725 else if (header.e_flags && llvm::ELF::EF_MIPS_ABI2)
1726 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1727 break;
1728 }
1729 arch_spec.SetFlags(arch_flags);
1730 }
1731
1732 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1733 arch_spec.GetMachine() == llvm::Triple::thumb) {
1734 DataExtractor data;
1735
1736 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
1737 set_data(data, sheader.sh_offset, section_size) == section_size)
1738 ParseARMAttributes(data, section_size, arch_spec);
1739 }
1740
1741 if (name == g_sect_name_gnu_debuglink) {
1742 DataExtractor data;
1743 if (section_size && (set_data(data, sheader.sh_offset,
1744 section_size) == section_size)) {
1745 lldb::offset_t gnu_debuglink_offset = 0;
1746 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset);
1747 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
1748 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1749 }
1750 }
1751
1752 // Process ELF note section entries.
1753 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1754
1755 // The section header ".note.android.ident" is stored as a
1756 // PROGBITS type header but it is actually a note header.
1757 static ConstString g_sect_name_android_ident(".note.android.ident");
1758 if (!is_note_header && name == g_sect_name_android_ident)
1759 is_note_header = true;
1760
1761 if (is_note_header) {
1762 // Allow notes to refine module info.
1763 DataExtractor data;
1764 if (section_size && (set_data(data, sheader.sh_offset,
1765 section_size) == section_size)) {
1766 Error error = RefineModuleDetailsFromNote(data, arch_spec, uuid);
1767 if (error.Fail()) {
1768 if (log)
1769 log->Printf("ObjectFileELF::%s ELF note processing failed: %s",
1770 __FUNCTION__, error.AsCString());
1771 }
1772 }
1773 }
1774 }
1775
1776 // Make any unknown triple components to be unspecified unknowns.
1777 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1778 arch_spec.GetTriple().setVendorName(llvm::StringRef());
1779 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1780 arch_spec.GetTriple().setOSName(llvm::StringRef());
1781
1782 return section_headers.size();
1783 }
1784 }
1785
1786 section_headers.clear();
1787 return 0;
Michael Sartaina7499c92013-07-01 19:45:50 +00001788}
1789
Kate Stoneb9c1b512016-09-06 20:57:50 +00001790size_t ObjectFileELF::GetProgramHeaderCount() { return ParseProgramHeaders(); }
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001791
1792const elf::ELFProgramHeader *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001793ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id) {
1794 if (!id || !ParseProgramHeaders())
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001795 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001796
1797 if (--id < m_program_headers.size())
1798 return &m_program_headers[id];
1799
1800 return NULL;
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001801}
1802
Kate Stoneb9c1b512016-09-06 20:57:50 +00001803DataExtractor ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) {
1804 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1805 if (segment_header == NULL)
1806 return DataExtractor();
1807 return DataExtractor(m_data, segment_header->p_offset,
1808 segment_header->p_filesz);
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001809}
1810
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001811llvm::StringRef
Kate Stoneb9c1b512016-09-06 20:57:50 +00001812ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1813 size_t pos = symbol_name.find('@');
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001814 return symbol_name.substr(0, pos);
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001815}
1816
Michael Sartaina7499c92013-07-01 19:45:50 +00001817//----------------------------------------------------------------------
1818// ParseSectionHeaders
1819//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001820size_t ObjectFileELF::ParseSectionHeaders() {
1821 using namespace std::placeholders;
Ravitheja Addepally15f89c42016-01-19 12:55:21 +00001822
Kate Stoneb9c1b512016-09-06 20:57:50 +00001823 return GetSectionHeaderInfo(
1824 m_section_headers,
1825 std::bind(&ObjectFileELF::SetDataWithReadMemoryFallback, this, _1, _2,
1826 _3),
1827 m_header, m_uuid, m_gnu_debuglink_file, m_gnu_debuglink_crc, m_arch_spec);
1828}
1829
1830lldb::offset_t ObjectFileELF::SetData(const lldb_private::DataExtractor &src,
1831 lldb_private::DataExtractor &dst,
1832 lldb::offset_t offset,
1833 lldb::offset_t length) {
1834 return dst.SetData(src, offset, length);
Ravitheja Addepally15f89c42016-01-19 12:55:21 +00001835}
1836
1837lldb::offset_t
Kate Stoneb9c1b512016-09-06 20:57:50 +00001838ObjectFileELF::SetDataWithReadMemoryFallback(lldb_private::DataExtractor &dst,
1839 lldb::offset_t offset,
1840 lldb::offset_t length) {
1841 if (offset + length <= m_data.GetByteSize())
Ravitheja Addepally15f89c42016-01-19 12:55:21 +00001842 return dst.SetData(m_data, offset, length);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001843
1844 const auto process_sp = m_process_wp.lock();
1845 if (process_sp != nullptr) {
1846 addr_t file_size = offset + length;
1847
1848 DataBufferSP data_sp = ReadMemory(process_sp, m_memory_addr, file_size);
1849 if (!data_sp)
1850 return false;
1851 m_data.SetData(data_sp, 0, file_size);
1852 }
1853
1854 return dst.SetData(m_data, offset, length);
Michael Sartaina7499c92013-07-01 19:45:50 +00001855}
1856
Michael Sartaina7499c92013-07-01 19:45:50 +00001857const ObjectFileELF::ELFSectionHeaderInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001858ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
1859 if (!id || !ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001860 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001861
1862 if (--id < m_section_headers.size())
1863 return &m_section_headers[id];
1864
1865 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00001866}
1867
Kate Stoneb9c1b512016-09-06 20:57:50 +00001868lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) {
1869 if (!name || !name[0] || !ParseSectionHeaders())
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001870 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001871 for (size_t i = 1; i < m_section_headers.size(); ++i)
1872 if (m_section_headers[i].section_name == ConstString(name))
1873 return i;
1874 return 0;
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001875}
1876
Kate Stoneb9c1b512016-09-06 20:57:50 +00001877void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
1878 if (!m_sections_ap.get() && ParseSectionHeaders()) {
1879 m_sections_ap.reset(new SectionList());
Andrew MacPherson17220c12014-03-05 10:12:43 +00001880
1881 for (SectionHeaderCollIter I = m_section_headers.begin();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001882 I != m_section_headers.end(); ++I) {
1883 const ELFSectionHeaderInfo &header = *I;
1884
1885 ConstString &name = I->section_name;
1886 const uint64_t file_size =
1887 header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1888 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
1889
1890 static ConstString g_sect_name_text(".text");
1891 static ConstString g_sect_name_data(".data");
1892 static ConstString g_sect_name_bss(".bss");
1893 static ConstString g_sect_name_tdata(".tdata");
1894 static ConstString g_sect_name_tbss(".tbss");
1895 static ConstString g_sect_name_dwarf_debug_abbrev(".debug_abbrev");
1896 static ConstString g_sect_name_dwarf_debug_addr(".debug_addr");
1897 static ConstString g_sect_name_dwarf_debug_aranges(".debug_aranges");
1898 static ConstString g_sect_name_dwarf_debug_frame(".debug_frame");
1899 static ConstString g_sect_name_dwarf_debug_info(".debug_info");
1900 static ConstString g_sect_name_dwarf_debug_line(".debug_line");
1901 static ConstString g_sect_name_dwarf_debug_loc(".debug_loc");
1902 static ConstString g_sect_name_dwarf_debug_macinfo(".debug_macinfo");
1903 static ConstString g_sect_name_dwarf_debug_macro(".debug_macro");
1904 static ConstString g_sect_name_dwarf_debug_pubnames(".debug_pubnames");
1905 static ConstString g_sect_name_dwarf_debug_pubtypes(".debug_pubtypes");
1906 static ConstString g_sect_name_dwarf_debug_ranges(".debug_ranges");
1907 static ConstString g_sect_name_dwarf_debug_str(".debug_str");
1908 static ConstString g_sect_name_dwarf_debug_str_offsets(
1909 ".debug_str_offsets");
1910 static ConstString g_sect_name_dwarf_debug_abbrev_dwo(
1911 ".debug_abbrev.dwo");
1912 static ConstString g_sect_name_dwarf_debug_info_dwo(".debug_info.dwo");
1913 static ConstString g_sect_name_dwarf_debug_line_dwo(".debug_line.dwo");
1914 static ConstString g_sect_name_dwarf_debug_macro_dwo(".debug_macro.dwo");
1915 static ConstString g_sect_name_dwarf_debug_loc_dwo(".debug_loc.dwo");
1916 static ConstString g_sect_name_dwarf_debug_str_dwo(".debug_str.dwo");
1917 static ConstString g_sect_name_dwarf_debug_str_offsets_dwo(
1918 ".debug_str_offsets.dwo");
1919 static ConstString g_sect_name_eh_frame(".eh_frame");
1920 static ConstString g_sect_name_arm_exidx(".ARM.exidx");
1921 static ConstString g_sect_name_arm_extab(".ARM.extab");
1922 static ConstString g_sect_name_go_symtab(".gosymtab");
1923
1924 SectionType sect_type = eSectionTypeOther;
1925
1926 bool is_thread_specific = false;
1927
1928 if (name == g_sect_name_text)
1929 sect_type = eSectionTypeCode;
1930 else if (name == g_sect_name_data)
1931 sect_type = eSectionTypeData;
1932 else if (name == g_sect_name_bss)
1933 sect_type = eSectionTypeZeroFill;
1934 else if (name == g_sect_name_tdata) {
1935 sect_type = eSectionTypeData;
1936 is_thread_specific = true;
1937 } else if (name == g_sect_name_tbss) {
1938 sect_type = eSectionTypeZeroFill;
1939 is_thread_specific = true;
1940 }
1941 // .debug_abbrev – Abbreviations used in the .debug_info section
1942 // .debug_aranges – Lookup table for mapping addresses to compilation
1943 // units
1944 // .debug_frame – Call frame information
1945 // .debug_info – The core DWARF information section
1946 // .debug_line – Line number information
1947 // .debug_loc – Location lists used in DW_AT_location attributes
1948 // .debug_macinfo – Macro information
1949 // .debug_pubnames – Lookup table for mapping object and function names to
1950 // compilation units
1951 // .debug_pubtypes – Lookup table for mapping type names to compilation
1952 // units
1953 // .debug_ranges – Address ranges used in DW_AT_ranges attributes
1954 // .debug_str – String table used in .debug_info
1955 // MISSING? .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section,
1956 // http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html
1957 // MISSING? .debug-index -
1958 // http://src.chromium.org/viewvc/chrome/trunk/src/build/gdb-add-index?pathrev=144644
1959 // MISSING? .debug_types - Type descriptions from DWARF 4? See
1960 // http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
1961 else if (name == g_sect_name_dwarf_debug_abbrev)
1962 sect_type = eSectionTypeDWARFDebugAbbrev;
1963 else if (name == g_sect_name_dwarf_debug_addr)
1964 sect_type = eSectionTypeDWARFDebugAddr;
1965 else if (name == g_sect_name_dwarf_debug_aranges)
1966 sect_type = eSectionTypeDWARFDebugAranges;
1967 else if (name == g_sect_name_dwarf_debug_frame)
1968 sect_type = eSectionTypeDWARFDebugFrame;
1969 else if (name == g_sect_name_dwarf_debug_info)
1970 sect_type = eSectionTypeDWARFDebugInfo;
1971 else if (name == g_sect_name_dwarf_debug_line)
1972 sect_type = eSectionTypeDWARFDebugLine;
1973 else if (name == g_sect_name_dwarf_debug_loc)
1974 sect_type = eSectionTypeDWARFDebugLoc;
1975 else if (name == g_sect_name_dwarf_debug_macinfo)
1976 sect_type = eSectionTypeDWARFDebugMacInfo;
1977 else if (name == g_sect_name_dwarf_debug_macro)
1978 sect_type = eSectionTypeDWARFDebugMacro;
1979 else if (name == g_sect_name_dwarf_debug_pubnames)
1980 sect_type = eSectionTypeDWARFDebugPubNames;
1981 else if (name == g_sect_name_dwarf_debug_pubtypes)
1982 sect_type = eSectionTypeDWARFDebugPubTypes;
1983 else if (name == g_sect_name_dwarf_debug_ranges)
1984 sect_type = eSectionTypeDWARFDebugRanges;
1985 else if (name == g_sect_name_dwarf_debug_str)
1986 sect_type = eSectionTypeDWARFDebugStr;
1987 else if (name == g_sect_name_dwarf_debug_str_offsets)
1988 sect_type = eSectionTypeDWARFDebugStrOffsets;
1989 else if (name == g_sect_name_dwarf_debug_abbrev_dwo)
1990 sect_type = eSectionTypeDWARFDebugAbbrev;
1991 else if (name == g_sect_name_dwarf_debug_info_dwo)
1992 sect_type = eSectionTypeDWARFDebugInfo;
1993 else if (name == g_sect_name_dwarf_debug_line_dwo)
1994 sect_type = eSectionTypeDWARFDebugLine;
1995 else if (name == g_sect_name_dwarf_debug_macro_dwo)
1996 sect_type = eSectionTypeDWARFDebugMacro;
1997 else if (name == g_sect_name_dwarf_debug_loc_dwo)
1998 sect_type = eSectionTypeDWARFDebugLoc;
1999 else if (name == g_sect_name_dwarf_debug_str_dwo)
2000 sect_type = eSectionTypeDWARFDebugStr;
2001 else if (name == g_sect_name_dwarf_debug_str_offsets_dwo)
2002 sect_type = eSectionTypeDWARFDebugStrOffsets;
2003 else if (name == g_sect_name_eh_frame)
2004 sect_type = eSectionTypeEHFrame;
2005 else if (name == g_sect_name_arm_exidx)
2006 sect_type = eSectionTypeARMexidx;
2007 else if (name == g_sect_name_arm_extab)
2008 sect_type = eSectionTypeARMextab;
2009 else if (name == g_sect_name_go_symtab)
2010 sect_type = eSectionTypeGoSymtab;
2011
2012 const uint32_t permissions =
Ilia K4f730dc2016-09-12 05:25:33 +00002013 ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0u) |
2014 ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0u) |
2015 ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0u);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002016 switch (header.sh_type) {
2017 case SHT_SYMTAB:
2018 assert(sect_type == eSectionTypeOther);
2019 sect_type = eSectionTypeELFSymbolTable;
2020 break;
2021 case SHT_DYNSYM:
2022 assert(sect_type == eSectionTypeOther);
2023 sect_type = eSectionTypeELFDynamicSymbols;
2024 break;
2025 case SHT_RELA:
2026 case SHT_REL:
2027 assert(sect_type == eSectionTypeOther);
2028 sect_type = eSectionTypeELFRelocationEntries;
2029 break;
2030 case SHT_DYNAMIC:
2031 assert(sect_type == eSectionTypeOther);
2032 sect_type = eSectionTypeELFDynamicLinkInfo;
2033 break;
2034 }
2035
2036 if (eSectionTypeOther == sect_type) {
2037 // the kalimba toolchain assumes that ELF section names are free-form.
2038 // It does
2039 // support linkscripts which (can) give rise to various arbitrarily
2040 // named
2041 // sections being "Code" or "Data".
2042 sect_type = kalimbaSectionType(m_header, header);
2043 }
2044
2045 const uint32_t target_bytes_size =
2046 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type)
2047 ? m_arch_spec.GetDataByteSize()
2048 : eSectionTypeCode == sect_type ? m_arch_spec.GetCodeByteSize()
2049 : 1;
2050
2051 elf::elf_xword log2align =
2052 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign);
2053 SectionSP section_sp(new Section(
2054 GetModule(), // Module to which this section belongs.
2055 this, // ObjectFile to which this section belongs and should read
2056 // section data from.
2057 SectionIndex(I), // Section ID.
2058 name, // Section name.
2059 sect_type, // Section type.
2060 header.sh_addr, // VM address.
2061 vm_size, // VM size in bytes of this section.
2062 header.sh_offset, // Offset of this section in the file.
2063 file_size, // Size of the section as found in the file.
2064 log2align, // Alignment of the section
2065 header.sh_flags, // Flags for this section.
2066 target_bytes_size)); // Number of host bytes per target byte
2067
2068 section_sp->SetPermissions(permissions);
2069 if (is_thread_specific)
2070 section_sp->SetIsThreadSpecific(is_thread_specific);
2071 m_sections_ap->AddSection(section_sp);
Andrew MacPherson17220c12014-03-05 10:12:43 +00002072 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002073 }
2074
2075 if (m_sections_ap.get()) {
2076 if (GetType() == eTypeDebugInfo) {
2077 static const SectionType g_sections[] = {
2078 eSectionTypeDWARFDebugAbbrev, eSectionTypeDWARFDebugAddr,
2079 eSectionTypeDWARFDebugAranges, eSectionTypeDWARFDebugFrame,
2080 eSectionTypeDWARFDebugInfo, eSectionTypeDWARFDebugLine,
2081 eSectionTypeDWARFDebugLoc, eSectionTypeDWARFDebugMacInfo,
2082 eSectionTypeDWARFDebugPubNames, eSectionTypeDWARFDebugPubTypes,
2083 eSectionTypeDWARFDebugRanges, eSectionTypeDWARFDebugStr,
2084 eSectionTypeDWARFDebugStrOffsets, eSectionTypeELFSymbolTable,
2085 };
2086 SectionList *elf_section_list = m_sections_ap.get();
2087 for (size_t idx = 0; idx < sizeof(g_sections) / sizeof(g_sections[0]);
2088 ++idx) {
2089 SectionType section_type = g_sections[idx];
2090 SectionSP section_sp(
2091 elf_section_list->FindSectionByType(section_type, true));
2092 if (section_sp) {
2093 SectionSP module_section_sp(
2094 unified_section_list.FindSectionByType(section_type, true));
2095 if (module_section_sp)
2096 unified_section_list.ReplaceSection(module_section_sp->GetID(),
2097 section_sp);
2098 else
2099 unified_section_list.AddSection(section_sp);
2100 }
2101 }
2102 } else {
2103 unified_section_list = *m_sections_ap;
2104 }
2105 }
Greg Clayton3046e662013-07-10 01:23:25 +00002106}
2107
Kate Stoneb9c1b512016-09-06 20:57:50 +00002108// Find the arm/aarch64 mapping symbol character in the given symbol name.
2109// Mapping symbols have the
2110// form of "$<char>[.<any>]*". Additionally we recognize cases when the mapping
2111// symbol prefixed by
2112// an arbitrary string because if a symbol prefix added to each symbol in the
2113// object file with
2114// objcopy then the mapping symbols are also prefixed.
2115static char FindArmAarch64MappingSymbol(const char *symbol_name) {
2116 if (!symbol_name)
2117 return '\0';
2118
2119 const char *dollar_pos = ::strchr(symbol_name, '$');
2120 if (!dollar_pos || dollar_pos[1] == '\0')
2121 return '\0';
2122
2123 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
2124 return dollar_pos[1];
2125 return '\0';
2126}
2127
2128#define STO_MIPS_ISA (3 << 6)
2129#define STO_MICROMIPS (2 << 6)
2130#define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
2131
2132// private
2133unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2134 SectionList *section_list,
2135 const size_t num_symbols,
2136 const DataExtractor &symtab_data,
2137 const DataExtractor &strtab_data) {
2138 ELFSymbol symbol;
2139 lldb::offset_t offset = 0;
2140
2141 static ConstString text_section_name(".text");
2142 static ConstString init_section_name(".init");
2143 static ConstString fini_section_name(".fini");
2144 static ConstString ctors_section_name(".ctors");
2145 static ConstString dtors_section_name(".dtors");
2146
2147 static ConstString data_section_name(".data");
2148 static ConstString rodata_section_name(".rodata");
2149 static ConstString rodata1_section_name(".rodata1");
2150 static ConstString data2_section_name(".data1");
2151 static ConstString bss_section_name(".bss");
2152 static ConstString opd_section_name(".opd"); // For ppc64
2153
2154 // On Android the oatdata and the oatexec symbols in the oat and odex files
2155 // covers the full
2156 // .text section what causes issues with displaying unusable symbol name to
2157 // the user and very
2158 // slow unwinding speed because the instruction emulation based unwind plans
2159 // try to emulate all
2160 // instructions in these symbols. Don't add these symbols to the symbol list
2161 // as they have no
2162 // use for the debugger and they are causing a lot of trouble.
2163 // Filtering can't be restricted to Android because this special object file
2164 // don't contain the
2165 // note section specifying the environment to Android but the custom extension
2166 // and file name
2167 // makes it highly unlikely that this will collide with anything else.
2168 ConstString file_extension = m_file.GetFileNameExtension();
2169 bool skip_oatdata_oatexec = file_extension == ConstString("oat") ||
2170 file_extension == ConstString("odex");
2171
2172 ArchSpec arch;
2173 GetArchitecture(arch);
2174 ModuleSP module_sp(GetModule());
2175 SectionList *module_section_list =
2176 module_sp ? module_sp->GetSectionList() : nullptr;
2177
2178 // Local cache to avoid doing a FindSectionByName for each symbol. The "const
2179 // char*" key must
2180 // came from a ConstString object so they can be compared by pointer
2181 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
2182
2183 unsigned i;
2184 for (i = 0; i < num_symbols; ++i) {
2185 if (symbol.Parse(symtab_data, &offset) == false)
2186 break;
2187
2188 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2189 if (!symbol_name)
2190 symbol_name = "";
2191
2192 // No need to add non-section symbols that have no names
2193 if (symbol.getType() != STT_SECTION &&
2194 (symbol_name == nullptr || symbol_name[0] == '\0'))
2195 continue;
2196
2197 // Skipping oatdata and oatexec sections if it is requested. See details
2198 // above the
2199 // definition of skip_oatdata_oatexec for the reasons.
2200 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
2201 ::strcmp(symbol_name, "oatexec") == 0))
2202 continue;
2203
2204 SectionSP symbol_section_sp;
2205 SymbolType symbol_type = eSymbolTypeInvalid;
2206 Elf64_Half section_idx = symbol.st_shndx;
2207
2208 switch (section_idx) {
2209 case SHN_ABS:
2210 symbol_type = eSymbolTypeAbsolute;
2211 break;
2212 case SHN_UNDEF:
2213 symbol_type = eSymbolTypeUndefined;
2214 break;
2215 default:
2216 symbol_section_sp = section_list->GetSectionAtIndex(section_idx);
2217 break;
2218 }
2219
2220 // If a symbol is undefined do not process it further even if it has a STT
2221 // type
2222 if (symbol_type != eSymbolTypeUndefined) {
2223 switch (symbol.getType()) {
2224 default:
2225 case STT_NOTYPE:
2226 // The symbol's type is not specified.
2227 break;
2228
2229 case STT_OBJECT:
2230 // The symbol is associated with a data object, such as a variable,
2231 // an array, etc.
2232 symbol_type = eSymbolTypeData;
2233 break;
2234
2235 case STT_FUNC:
2236 // The symbol is associated with a function or other executable code.
2237 symbol_type = eSymbolTypeCode;
2238 break;
2239
2240 case STT_SECTION:
2241 // The symbol is associated with a section. Symbol table entries of
2242 // this type exist primarily for relocation and normally have
2243 // STB_LOCAL binding.
2244 break;
2245
2246 case STT_FILE:
2247 // Conventionally, the symbol's name gives the name of the source
2248 // file associated with the object file. A file symbol has STB_LOCAL
2249 // binding, its section index is SHN_ABS, and it precedes the other
2250 // STB_LOCAL symbols for the file, if it is present.
2251 symbol_type = eSymbolTypeSourceFile;
2252 break;
2253
2254 case STT_GNU_IFUNC:
2255 // The symbol is associated with an indirect function. The actual
2256 // function will be resolved if it is referenced.
2257 symbol_type = eSymbolTypeResolver;
2258 break;
2259 }
2260 }
2261
2262 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) {
2263 if (symbol_section_sp) {
2264 const ConstString &sect_name = symbol_section_sp->GetName();
2265 if (sect_name == text_section_name || sect_name == init_section_name ||
2266 sect_name == fini_section_name || sect_name == ctors_section_name ||
2267 sect_name == dtors_section_name) {
2268 symbol_type = eSymbolTypeCode;
2269 } else if (sect_name == data_section_name ||
2270 sect_name == data2_section_name ||
2271 sect_name == rodata_section_name ||
2272 sect_name == rodata1_section_name ||
2273 sect_name == bss_section_name) {
2274 symbol_type = eSymbolTypeData;
2275 }
2276 }
2277 }
2278
2279 int64_t symbol_value_offset = 0;
2280 uint32_t additional_flags = 0;
2281
2282 if (arch.IsValid()) {
2283 if (arch.GetMachine() == llvm::Triple::arm) {
2284 if (symbol.getBinding() == STB_LOCAL) {
2285 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2286 if (symbol_type == eSymbolTypeCode) {
2287 switch (mapping_symbol) {
2288 case 'a':
2289 // $a[.<any>]* - marks an ARM instruction sequence
2290 m_address_class_map[symbol.st_value] = eAddressClassCode;
2291 break;
2292 case 'b':
2293 case 't':
2294 // $b[.<any>]* - marks a THUMB BL instruction sequence
2295 // $t[.<any>]* - marks a THUMB instruction sequence
2296 m_address_class_map[symbol.st_value] =
2297 eAddressClassCodeAlternateISA;
2298 break;
2299 case 'd':
2300 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2301 m_address_class_map[symbol.st_value] = eAddressClassData;
2302 break;
2303 }
2304 }
2305 if (mapping_symbol)
2306 continue;
2307 }
2308 } else if (arch.GetMachine() == llvm::Triple::aarch64) {
2309 if (symbol.getBinding() == STB_LOCAL) {
2310 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2311 if (symbol_type == eSymbolTypeCode) {
2312 switch (mapping_symbol) {
2313 case 'x':
2314 // $x[.<any>]* - marks an A64 instruction sequence
2315 m_address_class_map[symbol.st_value] = eAddressClassCode;
2316 break;
2317 case 'd':
2318 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2319 m_address_class_map[symbol.st_value] = eAddressClassData;
2320 break;
2321 }
2322 }
2323 if (mapping_symbol)
2324 continue;
2325 }
2326 }
2327
2328 if (arch.GetMachine() == llvm::Triple::arm) {
2329 if (symbol_type == eSymbolTypeCode) {
2330 if (symbol.st_value & 1) {
2331 // Subtracting 1 from the address effectively unsets
2332 // the low order bit, which results in the address
2333 // actually pointing to the beginning of the symbol.
2334 // This delta will be used below in conjunction with
2335 // symbol.st_value to produce the final symbol_value
2336 // that we store in the symtab.
2337 symbol_value_offset = -1;
2338 m_address_class_map[symbol.st_value ^ 1] =
2339 eAddressClassCodeAlternateISA;
2340 } else {
2341 // This address is ARM
2342 m_address_class_map[symbol.st_value] = eAddressClassCode;
2343 }
2344 }
2345 }
2346
2347 /*
2348 * MIPS:
2349 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for
2350 * MIPS).
2351 * This allows processor to switch between microMIPS and MIPS without any
2352 * need
2353 * for special mode-control register. However, apart from .debug_line,
2354 * none of
2355 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use
2356 * st_other
2357 * flag to check whether the symbol is microMIPS and then set the address
2358 * class
2359 * accordingly.
2360 */
2361 const llvm::Triple::ArchType llvm_arch = arch.GetMachine();
2362 if (llvm_arch == llvm::Triple::mips ||
2363 llvm_arch == llvm::Triple::mipsel ||
2364 llvm_arch == llvm::Triple::mips64 ||
2365 llvm_arch == llvm::Triple::mips64el) {
2366 if (IS_MICROMIPS(symbol.st_other))
2367 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2368 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
2369 symbol.st_value = symbol.st_value & (~1ull);
2370 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2371 } else {
2372 if (symbol_type == eSymbolTypeCode)
2373 m_address_class_map[symbol.st_value] = eAddressClassCode;
2374 else if (symbol_type == eSymbolTypeData)
2375 m_address_class_map[symbol.st_value] = eAddressClassData;
2376 else
2377 m_address_class_map[symbol.st_value] = eAddressClassUnknown;
2378 }
2379 }
2380 }
2381
2382 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
2383 // symbols. See above for
2384 // more details.
2385 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2386
2387 if (symbol_section_sp == nullptr && section_idx == SHN_ABS &&
2388 symbol.st_size != 0) {
2389 // We don't have a section for a symbol with non-zero size. Create a new
2390 // section for it
2391 // so the address range covered by the symbol is also covered by the
2392 // module (represented
2393 // through the section list). It is needed so module lookup for the
2394 // addresses covered
2395 // by this symbol will be successfull. This case happens for absolute
2396 // symbols.
2397 ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2398 symbol_section_sp =
2399 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
2400 eSectionTypeAbsoluteAddress, symbol_value,
2401 symbol.st_size, 0, 0, 0, SHF_ALLOC);
2402
2403 module_section_list->AddSection(symbol_section_sp);
2404 section_list->AddSection(symbol_section_sp);
2405 }
2406
2407 if (symbol_section_sp &&
2408 CalculateType() != ObjectFile::Type::eTypeObjectFile)
2409 symbol_value -= symbol_section_sp->GetFileAddress();
2410
2411 if (symbol_section_sp && module_section_list &&
2412 module_section_list != section_list) {
2413 const ConstString &sect_name = symbol_section_sp->GetName();
2414 auto section_it = section_name_to_section.find(sect_name.GetCString());
2415 if (section_it == section_name_to_section.end())
2416 section_it =
2417 section_name_to_section
2418 .emplace(sect_name.GetCString(),
2419 module_section_list->FindSectionByName(sect_name))
2420 .first;
Pavel Labathefddda3d2017-05-02 12:40:31 +00002421 if (section_it->second)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002422 symbol_section_sp = section_it->second;
2423 }
2424
2425 bool is_global = symbol.getBinding() == STB_GLOBAL;
2426 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2427 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z');
2428
2429 llvm::StringRef symbol_ref(symbol_name);
2430
2431 // Symbol names may contain @VERSION suffixes. Find those and strip them
2432 // temporarily.
2433 size_t version_pos = symbol_ref.find('@');
2434 bool has_suffix = version_pos != llvm::StringRef::npos;
2435 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2436 Mangled mangled(ConstString(symbol_bare), is_mangled);
2437
2438 // Now append the suffix back to mangled and unmangled names. Only do it if
2439 // the
2440 // demangling was successful (string is not empty).
2441 if (has_suffix) {
2442 llvm::StringRef suffix = symbol_ref.substr(version_pos);
2443
2444 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2445 if (!mangled_name.empty())
2446 mangled.SetMangledName(ConstString((mangled_name + suffix).str()));
2447
2448 ConstString demangled =
2449 mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2450 llvm::StringRef demangled_name = demangled.GetStringRef();
2451 if (!demangled_name.empty())
2452 mangled.SetDemangledName(ConstString((demangled_name + suffix).str()));
2453 }
2454
2455 // In ELF all symbol should have a valid size but it is not true for some
2456 // function symbols
2457 // coming from hand written assembly. As none of the function symbol should
2458 // have 0 size we
2459 // try to calculate the size for these symbols in the symtab with saying
2460 // that their original
2461 // size is not valid.
2462 bool symbol_size_valid =
2463 symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2464
2465 Symbol dc_symbol(
2466 i + start_id, // ID is the original symbol table index.
2467 mangled,
2468 symbol_type, // Type of this symbol
2469 is_global, // Is this globally visible?
2470 false, // Is this symbol debug info?
2471 false, // Is this symbol a trampoline?
2472 false, // Is this symbol artificial?
2473 AddressRange(symbol_section_sp, // Section in which this symbol is
2474 // defined or null.
2475 symbol_value, // Offset in section or symbol value.
2476 symbol.st_size), // Size in bytes of this symbol.
2477 symbol_size_valid, // Symbol size is valid
2478 has_suffix, // Contains linker annotations?
2479 flags); // Symbol flags.
2480 symtab->AddSymbol(dc_symbol);
2481 }
2482 return i;
2483}
2484
2485unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2486 user_id_t start_id,
2487 lldb_private::Section *symtab) {
2488 if (symtab->GetObjectFile() != this) {
2489 // If the symbol table section is owned by a different object file, have it
2490 // do the
2491 // parsing.
2492 ObjectFileELF *obj_file_elf =
2493 static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2494 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
2495 }
2496
2497 // Get section list for this object file.
2498 SectionList *section_list = m_sections_ap.get();
2499 if (!section_list)
2500 return 0;
2501
2502 user_id_t symtab_id = symtab->GetID();
2503 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2504 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2505 symtab_hdr->sh_type == SHT_DYNSYM);
2506
2507 // sh_link: section header index of associated string table.
2508 // Section ID's are ones based.
2509 user_id_t strtab_id = symtab_hdr->sh_link + 1;
2510 Section *strtab = section_list->FindSectionByID(strtab_id).get();
2511
2512 if (symtab && strtab) {
2513 assert(symtab->GetObjectFile() == this);
2514 assert(strtab->GetObjectFile() == this);
2515
2516 DataExtractor symtab_data;
2517 DataExtractor strtab_data;
2518 if (ReadSectionData(symtab, symtab_data) &&
2519 ReadSectionData(strtab, strtab_data)) {
2520 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2521
2522 return ParseSymbols(symbol_table, start_id, section_list, num_symbols,
2523 symtab_data, strtab_data);
2524 }
2525 }
2526
2527 return 0;
2528}
2529
2530size_t ObjectFileELF::ParseDynamicSymbols() {
2531 if (m_dynamic_symbols.size())
2532 return m_dynamic_symbols.size();
2533
2534 SectionList *section_list = GetSectionList();
2535 if (!section_list)
2536 return 0;
2537
2538 // Find the SHT_DYNAMIC section.
2539 Section *dynsym =
2540 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
2541 .get();
2542 if (!dynsym)
2543 return 0;
2544 assert(dynsym->GetObjectFile() == this);
2545
2546 ELFDynamic symbol;
2547 DataExtractor dynsym_data;
2548 if (ReadSectionData(dynsym, dynsym_data)) {
2549 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2550 lldb::offset_t cursor = 0;
2551
2552 while (cursor < section_size) {
2553 if (!symbol.Parse(dynsym_data, &cursor))
2554 break;
2555
2556 m_dynamic_symbols.push_back(symbol);
2557 }
2558 }
2559
2560 return m_dynamic_symbols.size();
2561}
2562
2563const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) {
2564 if (!ParseDynamicSymbols())
2565 return NULL;
2566
2567 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2568 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2569 for (; I != E; ++I) {
2570 ELFDynamic *symbol = &*I;
2571
2572 if (symbol->d_tag == tag)
2573 return symbol;
2574 }
2575
2576 return NULL;
2577}
2578
2579unsigned ObjectFileELF::PLTRelocationType() {
2580 // DT_PLTREL
2581 // This member specifies the type of relocation entry to which the
2582 // procedure linkage table refers. The d_val member holds DT_REL or
2583 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2584 // must use the same relocation.
2585 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2586
2587 if (symbol)
2588 return symbol->d_val;
2589
2590 return 0;
2591}
2592
2593// Returns the size of the normal plt entries and the offset of the first normal
2594// plt entry. The
2595// 0th entry in the plt table is usually a resolution entry which have different
2596// size in some
2597// architectures then the rest of the plt entries.
2598static std::pair<uint64_t, uint64_t>
2599GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
2600 const ELFSectionHeader *plt_hdr) {
2601 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2602
2603 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are 16
2604 // bytes.
2605 // So round the entsize up by the alignment if addralign is set.
2606 elf_xword plt_entsize =
2607 plt_hdr->sh_addralign
2608 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
2609 : plt_hdr->sh_entsize;
2610
2611 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2612 // PLT entries relocation code in general requires multiple instruction and
2613 // should be greater than 4 bytes in most cases. Try to guess correct size
2614 // just in case.
2615 if (plt_entsize <= 4) {
2616 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
2617 // size of the plt
2618 // entries based on the number of entries and the size of the plt section
2619 // with the
2620 // assumption that the size of the 0th entry is at least as big as the size
2621 // of the normal
2622 // entries and it isn't much bigger then that.
2623 if (plt_hdr->sh_addralign)
2624 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
2625 (num_relocations + 1) * plt_hdr->sh_addralign;
2626 else
2627 plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2628 }
2629
2630 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2631
2632 return std::make_pair(plt_entsize, plt_offset);
2633}
2634
2635static unsigned ParsePLTRelocations(
2636 Symtab *symbol_table, user_id_t start_id, unsigned rel_type,
2637 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2638 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr,
2639 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data,
2640 DataExtractor &symtab_data, DataExtractor &strtab_data) {
2641 ELFRelocation rel(rel_type);
2642 ELFSymbol symbol;
2643 lldb::offset_t offset = 0;
2644
2645 uint64_t plt_offset, plt_entsize;
2646 std::tie(plt_entsize, plt_offset) =
2647 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2648 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2649
2650 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2651 reloc_info_fn reloc_type;
2652 reloc_info_fn reloc_symbol;
2653
2654 if (hdr->Is32Bit()) {
2655 reloc_type = ELFRelocation::RelocType32;
2656 reloc_symbol = ELFRelocation::RelocSymbol32;
2657 } else {
2658 reloc_type = ELFRelocation::RelocType64;
2659 reloc_symbol = ELFRelocation::RelocSymbol64;
2660 }
2661
2662 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2663 unsigned i;
2664 for (i = 0; i < num_relocations; ++i) {
2665 if (rel.Parse(rel_data, &offset) == false)
2666 break;
2667
2668 if (reloc_type(rel) != slot_type)
2669 continue;
2670
2671 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2672 if (!symbol.Parse(symtab_data, &symbol_offset))
2673 break;
2674
2675 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2676 bool is_mangled =
2677 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2678 uint64_t plt_index = plt_offset + i * plt_entsize;
2679
2680 Symbol jump_symbol(
2681 i + start_id, // Symbol table index
2682 symbol_name, // symbol name.
2683 is_mangled, // is the symbol name mangled?
2684 eSymbolTypeTrampoline, // Type of this symbol
2685 false, // Is this globally visible?
2686 false, // Is this symbol debug info?
2687 true, // Is this symbol a trampoline?
2688 true, // Is this symbol artificial?
2689 plt_section_sp, // Section in which this symbol is defined or null.
2690 plt_index, // Offset in section or symbol value.
2691 plt_entsize, // Size in bytes of this symbol.
2692 true, // Size is valid
2693 false, // Contains linker annotations?
2694 0); // Symbol flags.
2695
2696 symbol_table->AddSymbol(jump_symbol);
2697 }
2698
2699 return i;
2700}
2701
2702unsigned
2703ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id,
2704 const ELFSectionHeaderInfo *rel_hdr,
2705 user_id_t rel_id) {
2706 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2707
2708 // The link field points to the associated symbol table.
2709 user_id_t symtab_id = rel_hdr->sh_link;
2710
2711 // If the link field doesn't point to the appropriate symbol name table then
2712 // try to find it by name as some compiler don't fill in the link fields.
2713 if (!symtab_id)
2714 symtab_id = GetSectionIndexByName(".dynsym");
2715
2716 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers
2717 // point that to the .got.plt or .got section instead of .plt.
2718 user_id_t plt_id = GetSectionIndexByName(".plt");
2719
2720 if (!symtab_id || !plt_id)
2721 return 0;
2722
2723 // Section ID's are ones based;
2724 symtab_id++;
2725 plt_id++;
2726
2727 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2728 if (!plt_hdr)
2729 return 0;
2730
2731 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2732 if (!sym_hdr)
2733 return 0;
2734
2735 SectionList *section_list = m_sections_ap.get();
2736 if (!section_list)
2737 return 0;
2738
2739 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2740 if (!rel_section)
2741 return 0;
2742
2743 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id));
2744 if (!plt_section_sp)
2745 return 0;
2746
2747 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2748 if (!symtab)
2749 return 0;
2750
2751 // sh_link points to associated string table.
2752 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2753 if (!strtab)
2754 return 0;
2755
2756 DataExtractor rel_data;
2757 if (!ReadSectionData(rel_section, rel_data))
2758 return 0;
2759
2760 DataExtractor symtab_data;
2761 if (!ReadSectionData(symtab, symtab_data))
2762 return 0;
2763
2764 DataExtractor strtab_data;
2765 if (!ReadSectionData(strtab, strtab_data))
2766 return 0;
2767
2768 unsigned rel_type = PLTRelocationType();
2769 if (!rel_type)
2770 return 0;
2771
2772 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header,
2773 rel_hdr, plt_hdr, sym_hdr, plt_section_sp,
2774 rel_data, symtab_data, strtab_data);
2775}
2776
2777unsigned ObjectFileELF::RelocateSection(
2778 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2779 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2780 DataExtractor &rel_data, DataExtractor &symtab_data,
2781 DataExtractor &debug_data, Section *rel_section) {
2782 ELFRelocation rel(rel_hdr->sh_type);
2783 lldb::addr_t offset = 0;
2784 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2785 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2786 reloc_info_fn reloc_type;
2787 reloc_info_fn reloc_symbol;
2788
2789 if (hdr->Is32Bit()) {
2790 reloc_type = ELFRelocation::RelocType32;
2791 reloc_symbol = ELFRelocation::RelocSymbol32;
2792 } else {
2793 reloc_type = ELFRelocation::RelocType64;
2794 reloc_symbol = ELFRelocation::RelocSymbol64;
2795 }
2796
2797 for (unsigned i = 0; i < num_relocations; ++i) {
2798 if (rel.Parse(rel_data, &offset) == false)
2799 break;
2800
2801 Symbol *symbol = NULL;
2802
2803 if (hdr->Is32Bit()) {
2804 switch (reloc_type(rel)) {
2805 case R_386_32:
2806 case R_386_PC32:
2807 default:
2808 assert(false && "unexpected relocation type");
2809 }
2810 } else {
2811 switch (reloc_type(rel)) {
2812 case R_X86_64_64: {
2813 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2814 if (symbol) {
2815 addr_t value = symbol->GetAddressRef().GetFileAddress();
2816 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2817 uint64_t *dst = reinterpret_cast<uint64_t *>(
2818 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2819 ELFRelocation::RelocOffset64(rel));
2820 *dst = value + ELFRelocation::RelocAddend64(rel);
2821 }
2822 break;
2823 }
2824 case R_X86_64_32:
2825 case R_X86_64_32S: {
2826 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2827 if (symbol) {
2828 addr_t value = symbol->GetAddressRef().GetFileAddress();
2829 value += ELFRelocation::RelocAddend32(rel);
2830 assert(
2831 (reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2832 (reloc_type(rel) == R_X86_64_32S &&
2833 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2834 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2835 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2836 uint32_t *dst = reinterpret_cast<uint32_t *>(
2837 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2838 ELFRelocation::RelocOffset32(rel));
2839 *dst = truncated_addr;
2840 }
2841 break;
2842 }
2843 case R_X86_64_PC32:
2844 default:
2845 assert(false && "unexpected relocation type");
2846 }
2847 }
2848 }
2849
2850 return 0;
2851}
2852
2853unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
2854 user_id_t rel_id) {
2855 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2856
2857 // Parse in the section list if needed.
2858 SectionList *section_list = GetSectionList();
2859 if (!section_list)
2860 return 0;
2861
2862 // Section ID's are ones based.
2863 user_id_t symtab_id = rel_hdr->sh_link + 1;
2864 user_id_t debug_id = rel_hdr->sh_info + 1;
2865
2866 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2867 if (!symtab_hdr)
2868 return 0;
2869
2870 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2871 if (!debug_hdr)
2872 return 0;
2873
2874 Section *rel = section_list->FindSectionByID(rel_id).get();
2875 if (!rel)
2876 return 0;
2877
2878 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2879 if (!symtab)
2880 return 0;
2881
2882 Section *debug = section_list->FindSectionByID(debug_id).get();
2883 if (!debug)
2884 return 0;
2885
2886 DataExtractor rel_data;
2887 DataExtractor symtab_data;
2888 DataExtractor debug_data;
2889
2890 if (ReadSectionData(rel, rel_data) && ReadSectionData(symtab, symtab_data) &&
2891 ReadSectionData(debug, debug_data)) {
2892 RelocateSection(m_symtab_ap.get(), &m_header, rel_hdr, symtab_hdr,
2893 debug_hdr, rel_data, symtab_data, debug_data, debug);
2894 }
2895
2896 return 0;
2897}
2898
2899Symtab *ObjectFileELF::GetSymtab() {
2900 ModuleSP module_sp(GetModule());
2901 if (!module_sp)
2902 return NULL;
2903
2904 // We always want to use the main object file so we (hopefully) only have one
2905 // cached copy
2906 // of our symtab, dynamic sections, etc.
2907 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2908 if (module_obj_file && module_obj_file != this)
2909 return module_obj_file->GetSymtab();
2910
2911 if (m_symtab_ap.get() == NULL) {
2912 SectionList *section_list = module_sp->GetSectionList();
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002913 if (!section_list)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002914 return NULL;
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002915
Kate Stoneb9c1b512016-09-06 20:57:50 +00002916 uint64_t symbol_id = 0;
2917 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002918
Kate Stoneb9c1b512016-09-06 20:57:50 +00002919 // Sharable objects and dynamic executables usually have 2 distinct symbol
2920 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
2921 // smaller
2922 // version of the symtab that only contains global symbols. The information
2923 // found
2924 // in the dynsym is therefore also found in the symtab, while the reverse is
2925 // not
2926 // necessarily true.
2927 Section *symtab =
2928 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2929 if (!symtab) {
2930 // The symtab section is non-allocable and can be stripped, so if it
2931 // doesn't exist
2932 // then use the dynsym section which should always be there.
2933 symtab =
2934 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
2935 .get();
2936 }
2937 if (symtab) {
2938 m_symtab_ap.reset(new Symtab(symtab->GetObjectFile()));
2939 symbol_id += ParseSymbolTable(m_symtab_ap.get(), symbol_id, symtab);
2940 }
2941
2942 // DT_JMPREL
2943 // If present, this entry's d_ptr member holds the address of
2944 // relocation
2945 // entries associated solely with the procedure linkage table.
2946 // Separating
2947 // these relocation entries lets the dynamic linker ignore them during
2948 // process initialization, if lazy binding is enabled. If this entry is
2949 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2950 // also be present.
2951 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2952 if (symbol) {
2953 // Synthesize trampoline symbols to help navigate the PLT.
2954 addr_t addr = symbol->d_ptr;
2955 Section *reloc_section =
2956 section_list->FindSectionContainingFileAddress(addr).get();
2957 if (reloc_section) {
2958 user_id_t reloc_id = reloc_section->GetID();
2959 const ELFSectionHeaderInfo *reloc_header =
2960 GetSectionHeaderByIndex(reloc_id);
2961 assert(reloc_header);
2962
2963 if (m_symtab_ap == nullptr)
2964 m_symtab_ap.reset(new Symtab(reloc_section->GetObjectFile()));
2965
2966 ParseTrampolineSymbols(m_symtab_ap.get(), symbol_id, reloc_header,
2967 reloc_id);
2968 }
2969 }
2970
2971 DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo();
2972 if (eh_frame) {
2973 if (m_symtab_ap == nullptr)
2974 m_symtab_ap.reset(new Symtab(this));
2975 ParseUnwindSymbols(m_symtab_ap.get(), eh_frame);
2976 }
2977
2978 // If we still don't have any symtab then create an empty instance to avoid
2979 // do the section
2980 // lookup next time.
2981 if (m_symtab_ap == nullptr)
2982 m_symtab_ap.reset(new Symtab(this));
2983
2984 m_symtab_ap->CalculateSymbolSizes();
2985 }
2986
2987 for (SectionHeaderCollIter I = m_section_headers.begin();
2988 I != m_section_headers.end(); ++I) {
2989 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
2990 if (CalculateType() == eTypeObjectFile) {
2991 const char *section_name = I->section_name.AsCString("");
2992 if (strstr(section_name, ".rela.debug") ||
2993 strstr(section_name, ".rel.debug")) {
2994 const ELFSectionHeader &reloc_header = *I;
2995 user_id_t reloc_id = SectionIndex(I);
2996 RelocateDebugSections(&reloc_header, reloc_id);
Tamas Berghammered844cb2016-02-10 10:43:34 +00002997 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002998 }
2999 }
3000 }
3001 return m_symtab_ap.get();
Tamas Berghammer6b63b142016-02-18 11:12:18 +00003002}
Tamas Berghammer5bfd4d02016-02-10 12:10:58 +00003003
Kate Stoneb9c1b512016-09-06 20:57:50 +00003004void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
3005 DWARFCallFrameInfo *eh_frame) {
3006 SectionList *section_list = GetSectionList();
3007 if (!section_list)
3008 return;
3009
3010 // First we save the new symbols into a separate list and add them to the
3011 // symbol table after
3012 // we colleced all symbols we want to add. This is neccessary because adding a
3013 // new symbol
3014 // invalidates the internal index of the symtab what causing the next lookup
3015 // to be slow because
3016 // it have to recalculate the index first.
3017 std::vector<Symbol> new_symbols;
3018
3019 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
3020 lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
3021 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
3022 if (symbol) {
3023 if (!symbol->GetByteSizeIsValid()) {
3024 symbol->SetByteSize(size);
3025 symbol->SetSizeIsSynthesized(true);
3026 }
3027 } else {
3028 SectionSP section_sp =
3029 section_list->FindSectionContainingFileAddress(file_addr);
3030 if (section_sp) {
3031 addr_t offset = file_addr - section_sp->GetFileAddress();
3032 const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
3033 uint64_t symbol_id = symbol_table->GetNumSymbols();
3034 Symbol eh_symbol(
3035 symbol_id, // Symbol table index.
3036 symbol_name, // Symbol name.
3037 false, // Is the symbol name mangled?
3038 eSymbolTypeCode, // Type of this symbol.
3039 true, // Is this globally visible?
3040 false, // Is this symbol debug info?
3041 false, // Is this symbol a trampoline?
3042 true, // Is this symbol artificial?
3043 section_sp, // Section in which this symbol is defined or null.
3044 offset, // Offset in section or symbol value.
3045 0, // Size: Don't specify the size as an FDE can
3046 false, // Size is valid: cover multiple symbols.
3047 false, // Contains linker annotations?
3048 0); // Symbol flags.
3049 new_symbols.push_back(eh_symbol);
3050 }
3051 }
3052 return true;
3053 });
3054
3055 for (const Symbol &s : new_symbols)
3056 symbol_table->AddSymbol(s);
3057}
3058
3059bool ObjectFileELF::IsStripped() {
3060 // TODO: determine this for ELF
3061 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003062}
3063
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003064//===----------------------------------------------------------------------===//
3065// Dump
3066//
3067// Dump the specifics of the runtime file container (such as any headers
3068// segments, sections, etc).
3069//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003070void ObjectFileELF::Dump(Stream *s) {
3071 ModuleSP module_sp(GetModule());
3072 if (!module_sp) {
3073 return;
3074 }
Adrian McCarthy543725c2016-04-04 21:21:49 +00003075
Kate Stoneb9c1b512016-09-06 20:57:50 +00003076 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
3077 s->Printf("%p: ", static_cast<void *>(this));
3078 s->Indent();
3079 s->PutCString("ObjectFileELF");
Adrian McCarthy543725c2016-04-04 21:21:49 +00003080
Kate Stoneb9c1b512016-09-06 20:57:50 +00003081 ArchSpec header_arch;
3082 GetArchitecture(header_arch);
Adrian McCarthy543725c2016-04-04 21:21:49 +00003083
Kate Stoneb9c1b512016-09-06 20:57:50 +00003084 *s << ", file = '" << m_file
3085 << "', arch = " << header_arch.GetArchitectureName() << "\n";
Adrian McCarthy543725c2016-04-04 21:21:49 +00003086
Kate Stoneb9c1b512016-09-06 20:57:50 +00003087 DumpELFHeader(s, m_header);
3088 s->EOL();
3089 DumpELFProgramHeaders(s);
3090 s->EOL();
3091 DumpELFSectionHeaders(s);
3092 s->EOL();
3093 SectionList *section_list = GetSectionList();
3094 if (section_list)
3095 section_list->Dump(s, NULL, true, UINT32_MAX);
3096 Symtab *symtab = GetSymtab();
3097 if (symtab)
3098 symtab->Dump(s, NULL, eSortOrderNone);
3099 s->EOL();
3100 DumpDependentModules(s);
3101 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003102}
3103
3104//----------------------------------------------------------------------
3105// DumpELFHeader
3106//
3107// Dump the ELF header to the specified output stream
3108//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003109void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
3110 s->PutCString("ELF Header\n");
3111 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
3112 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
3113 header.e_ident[EI_MAG1]);
3114 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
3115 header.e_ident[EI_MAG2]);
3116 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
3117 header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003118
Kate Stoneb9c1b512016-09-06 20:57:50 +00003119 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
3120 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
3121 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
3122 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
3123 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003124
Kate Stoneb9c1b512016-09-06 20:57:50 +00003125 s->Printf("e_type = 0x%4.4x ", header.e_type);
3126 DumpELFHeader_e_type(s, header.e_type);
3127 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
3128 s->Printf("e_version = 0x%8.8x\n", header.e_version);
3129 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
3130 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
3131 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
3132 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
3133 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
3134 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00003135 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003136 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00003137 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum);
3138 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003139}
3140
3141//----------------------------------------------------------------------
3142// DumpELFHeader_e_type
3143//
3144// Dump an token value for the ELF header member e_type
3145//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003146void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
3147 switch (e_type) {
3148 case ET_NONE:
3149 *s << "ET_NONE";
3150 break;
3151 case ET_REL:
3152 *s << "ET_REL";
3153 break;
3154 case ET_EXEC:
3155 *s << "ET_EXEC";
3156 break;
3157 case ET_DYN:
3158 *s << "ET_DYN";
3159 break;
3160 case ET_CORE:
3161 *s << "ET_CORE";
3162 break;
3163 default:
3164 break;
3165 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003166}
3167
3168//----------------------------------------------------------------------
3169// DumpELFHeader_e_ident_EI_DATA
3170//
3171// Dump an token value for the ELF header member e_ident[EI_DATA]
3172//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003173void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
3174 unsigned char ei_data) {
3175 switch (ei_data) {
3176 case ELFDATANONE:
3177 *s << "ELFDATANONE";
3178 break;
3179 case ELFDATA2LSB:
3180 *s << "ELFDATA2LSB - Little Endian";
3181 break;
3182 case ELFDATA2MSB:
3183 *s << "ELFDATA2MSB - Big Endian";
3184 break;
3185 default:
3186 break;
3187 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003188}
3189
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003190//----------------------------------------------------------------------
3191// DumpELFProgramHeader
3192//
3193// Dump a single ELF program header to the specified output stream
3194//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003195void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3196 const ELFProgramHeader &ph) {
3197 DumpELFProgramHeader_p_type(s, ph.p_type);
3198 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3199 ph.p_vaddr, ph.p_paddr);
3200 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3201 ph.p_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003202
Kate Stoneb9c1b512016-09-06 20:57:50 +00003203 DumpELFProgramHeader_p_flags(s, ph.p_flags);
3204 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003205}
3206
3207//----------------------------------------------------------------------
3208// DumpELFProgramHeader_p_type
3209//
3210// Dump an token value for the ELF program header member p_type which
3211// describes the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003212// ----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003213void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3214 const int kStrWidth = 15;
3215 switch (p_type) {
3216 CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3217 CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3218 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3219 CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3220 CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3221 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3222 CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3223 CASE_AND_STREAM(s, PT_TLS, kStrWidth);
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00003224 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003225 default:
3226 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3227 break;
3228 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003229}
3230
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003231//----------------------------------------------------------------------
3232// DumpELFProgramHeader_p_flags
3233//
3234// Dump an token value for the ELF program header member p_flags
3235//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003236void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3237 *s << ((p_flags & PF_X) ? "PF_X" : " ")
3238 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3239 << ((p_flags & PF_W) ? "PF_W" : " ")
3240 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3241 << ((p_flags & PF_R) ? "PF_R" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003242}
3243
3244//----------------------------------------------------------------------
3245// DumpELFProgramHeaders
3246//
3247// Dump all of the ELF program header to the specified output stream
3248//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003249void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3250 if (!ParseProgramHeaders())
3251 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003252
Kate Stoneb9c1b512016-09-06 20:57:50 +00003253 s->PutCString("Program Headers\n");
3254 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
3255 "p_filesz p_memsz p_flags p_align\n");
3256 s->PutCString("==== --------------- -------- -------- -------- "
3257 "-------- -------- ------------------------- --------\n");
Ed Maste3a8ab6e2015-02-23 15:33:11 +00003258
Kate Stoneb9c1b512016-09-06 20:57:50 +00003259 uint32_t idx = 0;
3260 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
3261 I != m_program_headers.end(); ++I, ++idx) {
3262 s->Printf("[%2u] ", idx);
3263 ObjectFileELF::DumpELFProgramHeader(s, *I);
3264 s->EOL();
3265 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003266}
3267
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003268//----------------------------------------------------------------------
3269// DumpELFSectionHeader
3270//
3271// Dump a single ELF section header to the specified output stream
3272//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003273void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3274 const ELFSectionHeaderInfo &sh) {
3275 s->Printf("%8.8x ", sh.sh_name);
3276 DumpELFSectionHeader_sh_type(s, sh.sh_type);
3277 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3278 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3279 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3280 sh.sh_offset, sh.sh_size);
3281 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3282 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003283}
3284
3285//----------------------------------------------------------------------
3286// DumpELFSectionHeader_sh_type
3287//
3288// Dump an token value for the ELF section header member sh_type which
3289// describes the type of the section
3290//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003291void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3292 const int kStrWidth = 12;
3293 switch (sh_type) {
3294 CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3295 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3296 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3297 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3298 CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3299 CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3300 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3301 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3302 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3303 CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3304 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3305 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3306 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3307 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3308 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3309 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3310 default:
3311 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3312 break;
3313 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003314}
3315
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003316//----------------------------------------------------------------------
3317// DumpELFSectionHeader_sh_flags
3318//
3319// Dump an token value for the ELF section header member sh_flags
3320//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003321void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3322 elf_xword sh_flags) {
3323 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
3324 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3325 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
3326 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3327 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003328}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003329
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003330//----------------------------------------------------------------------
3331// DumpELFSectionHeaders
3332//
3333// Dump all of the ELF section header to the specified output stream
3334//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003335void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3336 if (!ParseSectionHeaders())
3337 return;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003338
Kate Stoneb9c1b512016-09-06 20:57:50 +00003339 s->PutCString("Section Headers\n");
3340 s->PutCString("IDX name type flags "
3341 "addr offset size link info addralgn "
3342 "entsize Name\n");
3343 s->PutCString("==== -------- ------------ -------------------------------- "
3344 "-------- -------- -------- -------- -------- -------- "
3345 "-------- ====================\n");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003346
Kate Stoneb9c1b512016-09-06 20:57:50 +00003347 uint32_t idx = 0;
3348 for (SectionHeaderCollConstIter I = m_section_headers.begin();
3349 I != m_section_headers.end(); ++I, ++idx) {
3350 s->Printf("[%2u] ", idx);
3351 ObjectFileELF::DumpELFSectionHeader(s, *I);
3352 const char *section_name = I->section_name.AsCString("");
3353 if (section_name)
3354 *s << ' ' << section_name << "\n";
3355 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003356}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003357
Kate Stoneb9c1b512016-09-06 20:57:50 +00003358void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3359 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003360
Kate Stoneb9c1b512016-09-06 20:57:50 +00003361 if (num_modules > 0) {
3362 s->PutCString("Dependent Modules:\n");
3363 for (unsigned i = 0; i < num_modules; ++i) {
3364 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
3365 s->Printf(" %s\n", spec.GetFilename().GetCString());
3366 }
3367 }
3368}
3369
3370bool ObjectFileELF::GetArchitecture(ArchSpec &arch) {
3371 if (!ParseHeader())
3372 return false;
3373
3374 if (m_section_headers.empty()) {
3375 // Allow elf notes to be parsed which may affect the detected architecture.
3376 ParseSectionHeaders();
3377 }
3378
3379 if (CalculateType() == eTypeCoreFile &&
3380 m_arch_spec.TripleOSIsUnspecifiedUnknown()) {
3381 // Core files don't have section headers yet they have PT_NOTE program
3382 // headers
3383 // that might shed more light on the architecture
3384 if (ParseProgramHeaders()) {
Kamil Rytarowski12801f12017-03-26 15:34:57 +00003385 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003386 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i);
3387 if (header && header->p_type == PT_NOTE && header->p_offset != 0 &&
3388 header->p_filesz > 0) {
3389 DataExtractor data;
3390 if (data.SetData(m_data, header->p_offset, header->p_filesz) ==
3391 header->p_filesz) {
3392 lldb_private::UUID uuid;
3393 RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
3394 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003395 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003396 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003397 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003398 }
3399 arch = m_arch_spec;
3400 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003401}
3402
Kate Stoneb9c1b512016-09-06 20:57:50 +00003403ObjectFile::Type ObjectFileELF::CalculateType() {
3404 switch (m_header.e_type) {
3405 case llvm::ELF::ET_NONE:
3406 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003407 return eTypeUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003408
3409 case llvm::ELF::ET_REL:
3410 // 1 - Relocatable file
3411 return eTypeObjectFile;
3412
3413 case llvm::ELF::ET_EXEC:
3414 // 2 - Executable file
3415 return eTypeExecutable;
3416
3417 case llvm::ELF::ET_DYN:
3418 // 3 - Shared object file
3419 return eTypeSharedLibrary;
3420
3421 case ET_CORE:
3422 // 4 - Core file
3423 return eTypeCoreFile;
3424
3425 default:
3426 break;
3427 }
3428 return eTypeUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003429}
3430
Kate Stoneb9c1b512016-09-06 20:57:50 +00003431ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3432 switch (m_header.e_type) {
3433 case llvm::ELF::ET_NONE:
3434 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003435 return eStrataUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003436
Kate Stoneb9c1b512016-09-06 20:57:50 +00003437 case llvm::ELF::ET_REL:
3438 // 1 - Relocatable file
3439 return eStrataUnknown;
3440
3441 case llvm::ELF::ET_EXEC:
3442 // 2 - Executable file
3443 // TODO: is there any way to detect that an executable is a kernel
3444 // related executable by inspecting the program headers, section
3445 // headers, symbols, or any other flag bits???
3446 return eStrataUser;
3447
3448 case llvm::ELF::ET_DYN:
3449 // 3 - Shared object file
3450 // TODO: is there any way to detect that an shared library is a kernel
3451 // related executable by inspecting the program headers, section
3452 // headers, symbols, or any other flag bits???
3453 return eStrataUnknown;
3454
3455 case ET_CORE:
3456 // 4 - Core file
3457 // TODO: is there any way to detect that an core file is a kernel
3458 // related executable by inspecting the program headers, section
3459 // headers, symbols, or any other flag bits???
3460 return eStrataUnknown;
3461
3462 default:
3463 break;
3464 }
3465 return eStrataUnknown;
3466}