blob: 95685c23ec115bf033f17668438ee5464a3bc51d [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 Wilsonf325ba92010-07-13 23:07:23 +000016#include "lldb/Core/FileSpecList.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000017#include "lldb/Core/Module.h"
Greg Claytonf4d6de62013-04-24 22:29:28 +000018#include "lldb/Core/ModuleSpec.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000019#include "lldb/Core/PluginManager.h"
20#include "lldb/Core/Section.h"
Jonas Devlieghere59b78bc2018-11-01 04:45:28 +000021#include "lldb/Host/FileSystem.h"
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +000022#include "lldb/Symbol/DWARFCallFrameInfo.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000023#include "lldb/Symbol/SymbolContext.h"
Steve Pucci9e02dac2014-02-06 19:02:19 +000024#include "lldb/Target/SectionLoadList.h"
Ed Maste54803652013-10-11 17:39:07 +000025#include "lldb/Target/Target.h"
Pavel Labath5f19b902017-11-13 16:16:33 +000026#include "lldb/Utility/ArchSpec.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000027#include "lldb/Utility/DataBufferHeap.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000028#include "lldb/Utility/Log.h"
Zachary Turner97206d52017-05-12 04:51:55 +000029#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000030#include "lldb/Utility/Stream.h"
Pavel Labath38d06322017-06-29 14:32:17 +000031#include "lldb/Utility/Timer.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000032
Stephen Wilson499b40e2011-03-30 16:07:05 +000033#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000034#include "llvm/ADT/StringRef.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000035#include "llvm/Object/Decompressor.h"
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +000036#include "llvm/Support/ARMBuildAttributes.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000037#include "llvm/Support/MathExtras.h"
Zachary Turner3f4a4b32017-02-24 18:56:49 +000038#include "llvm/Support/MemoryBuffer.h"
Sagar Thakurad5b55a2016-05-24 14:52:50 +000039#include "llvm/Support/MipsABIFlags.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000040
Kate Stoneb9c1b512016-09-06 20:57:50 +000041#define CASE_AND_STREAM(s, def, width) \
42 case def: \
43 s->Printf("%-*s", width, #def); \
44 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045
Chris Lattner30fdc8d2010-06-08 16:52:24 +000046using namespace lldb;
47using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000048using namespace elf;
49using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000050
Stephen Wilson499b40e2011-03-30 16:07:05 +000051namespace {
Todd Fialab91de782014-06-27 16:52:49 +000052
53// ELF note owner definitions
54const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000055const char *const LLDB_NT_OWNER_GNU = "GNU";
56const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Kamil Rytarowski12801f12017-03-26 15:34:57 +000057const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000058const char *const LLDB_NT_OWNER_CSR = "csr";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000059const char *const LLDB_NT_OWNER_ANDROID = "Android";
Kate Stoneb9c1b512016-09-06 20:57:50 +000060const char *const LLDB_NT_OWNER_CORE = "CORE";
61const char *const LLDB_NT_OWNER_LINUX = "LINUX";
Todd Fialab91de782014-06-27 16:52:49 +000062
63// ELF note type definitions
Kate Stoneb9c1b512016-09-06 20:57:50 +000064const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000065const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
66
Kate Stoneb9c1b512016-09-06 20:57:50 +000067const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
68const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
Todd Fialab91de782014-06-27 16:52:49 +000069
70const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
71
Kate Stoneb9c1b512016-09-06 20:57:50 +000072const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
73const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
Todd Fialab91de782014-06-27 16:52:49 +000074
75// GNU ABI note OS constants
Kate Stoneb9c1b512016-09-06 20:57:50 +000076const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
77const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000078const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
79
Greg Claytonb704b692015-10-28 18:04:38 +000080// LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants
Kate Stoneb9c1b512016-09-06 20:57:50 +000081#define NT_PRSTATUS 1
82#define NT_PRFPREG 2
83#define NT_PRPSINFO 3
84#define NT_TASKSTRUCT 4
85#define NT_AUXV 6
86#define NT_SIGINFO 0x53494749
87#define NT_FILE 0x46494c45
88#define NT_PRXFPREG 0x46e62b7f
89#define NT_PPC_VMX 0x100
90#define NT_PPC_SPE 0x101
91#define NT_PPC_VSX 0x102
92#define NT_386_TLS 0x200
93#define NT_386_IOPERM 0x201
94#define NT_X86_XSTATE 0x202
95#define NT_S390_HIGH_GPRS 0x300
96#define NT_S390_TIMER 0x301
97#define NT_S390_TODCMP 0x302
98#define NT_S390_TODPREG 0x303
99#define NT_S390_CTRS 0x304
100#define NT_S390_PREFIX 0x305
101#define NT_S390_LAST_BREAK 0x306
102#define NT_S390_SYSTEM_CALL 0x307
103#define NT_S390_TDB 0x308
104#define NT_S390_VXRS_LOW 0x309
105#define NT_S390_VXRS_HIGH 0x30a
106#define NT_ARM_VFP 0x400
107#define NT_ARM_TLS 0x401
108#define NT_ARM_HW_BREAK 0x402
109#define NT_ARM_HW_WATCH 0x403
110#define NT_ARM_SYSTEM_CALL 0x404
111#define NT_METAG_CBUF 0x500
112#define NT_METAG_RPIPE 0x501
113#define NT_METAG_TLS 0x502
Greg Claytonb704b692015-10-28 18:04:38 +0000114
Stephen Wilson499b40e2011-03-30 16:07:05 +0000115//===----------------------------------------------------------------------===//
116/// @class ELFRelocation
Adrian Prantld8f460e2018-05-02 16:55:16 +0000117/// Generic wrapper for ELFRel and ELFRela.
Stephen Wilson499b40e2011-03-30 16:07:05 +0000118///
119/// This helper class allows us to parse both ELFRel and ELFRela relocation
120/// entries in a generic manner.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000121class ELFRelocation {
Stephen Wilson499b40e2011-03-30 16:07:05 +0000122public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000123 /// Constructs an ELFRelocation entry with a personality as given by @p
124 /// type.
125 ///
126 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
127 ELFRelocation(unsigned type);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000128
Kate Stoneb9c1b512016-09-06 20:57:50 +0000129 ~ELFRelocation();
Ed Maste81b4c5f2016-01-04 01:43:47 +0000130
Kate Stoneb9c1b512016-09-06 20:57:50 +0000131 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000132
Kate Stoneb9c1b512016-09-06 20:57:50 +0000133 static unsigned RelocType32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000134
Kate Stoneb9c1b512016-09-06 20:57:50 +0000135 static unsigned RelocType64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000136
Kate Stoneb9c1b512016-09-06 20:57:50 +0000137 static unsigned RelocSymbol32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000138
Kate Stoneb9c1b512016-09-06 20:57:50 +0000139 static unsigned RelocSymbol64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000140
Kate Stoneb9c1b512016-09-06 20:57:50 +0000141 static unsigned RelocOffset32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000142
Kate Stoneb9c1b512016-09-06 20:57:50 +0000143 static unsigned RelocOffset64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000144
Kate Stoneb9c1b512016-09-06 20:57:50 +0000145 static unsigned RelocAddend32(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000146
Kate Stoneb9c1b512016-09-06 20:57:50 +0000147 static unsigned RelocAddend64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000148
Stephen Wilson499b40e2011-03-30 16:07:05 +0000149private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000150 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000151
Kate Stoneb9c1b512016-09-06 20:57:50 +0000152 RelocUnion reloc;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000153};
154
Kate Stoneb9c1b512016-09-06 20:57:50 +0000155ELFRelocation::ELFRelocation(unsigned type) {
156 if (type == DT_REL || type == SHT_REL)
157 reloc = new ELFRel();
158 else if (type == DT_RELA || type == SHT_RELA)
159 reloc = new ELFRela();
160 else {
161 assert(false && "unexpected relocation type");
162 reloc = static_cast<ELFRel *>(NULL);
163 }
Stephen Wilson499b40e2011-03-30 16:07:05 +0000164}
165
Kate Stoneb9c1b512016-09-06 20:57:50 +0000166ELFRelocation::~ELFRelocation() {
167 if (reloc.is<ELFRel *>())
168 delete reloc.get<ELFRel *>();
169 else
170 delete reloc.get<ELFRela *>();
Stephen Wilson499b40e2011-03-30 16:07:05 +0000171}
172
Kate Stoneb9c1b512016-09-06 20:57:50 +0000173bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
174 lldb::offset_t *offset) {
175 if (reloc.is<ELFRel *>())
176 return reloc.get<ELFRel *>()->Parse(data, offset);
177 else
178 return reloc.get<ELFRela *>()->Parse(data, offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000179}
180
Kate Stoneb9c1b512016-09-06 20:57:50 +0000181unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
182 if (rel.reloc.is<ELFRel *>())
183 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
184 else
185 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000186}
187
Kate Stoneb9c1b512016-09-06 20:57:50 +0000188unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
189 if (rel.reloc.is<ELFRel *>())
190 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
191 else
192 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000193}
194
Kate Stoneb9c1b512016-09-06 20:57:50 +0000195unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
196 if (rel.reloc.is<ELFRel *>())
197 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
198 else
199 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000200}
201
Kate Stoneb9c1b512016-09-06 20:57:50 +0000202unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
203 if (rel.reloc.is<ELFRel *>())
204 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
205 else
206 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000207}
208
Kate Stoneb9c1b512016-09-06 20:57:50 +0000209unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
210 if (rel.reloc.is<ELFRel *>())
211 return rel.reloc.get<ELFRel *>()->r_offset;
212 else
213 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000214}
215
Kate Stoneb9c1b512016-09-06 20:57:50 +0000216unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
217 if (rel.reloc.is<ELFRel *>())
218 return rel.reloc.get<ELFRel *>()->r_offset;
219 else
220 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000221}
222
Kate Stoneb9c1b512016-09-06 20:57:50 +0000223unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
224 if (rel.reloc.is<ELFRel *>())
225 return 0;
226 else
227 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000228}
229
Kate Stoneb9c1b512016-09-06 20:57:50 +0000230unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
231 if (rel.reloc.is<ELFRel *>())
232 return 0;
233 else
234 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000235}
236
Stephen Wilson499b40e2011-03-30 16:07:05 +0000237} // end anonymous namespace
238
Kate Stoneb9c1b512016-09-06 20:57:50 +0000239bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
240 // Read all fields.
241 if (data.GetU32(offset, &n_namesz, 3) == NULL)
242 return false;
Ed Mastec113ff82013-12-02 17:49:13 +0000243
Adrian Prantl05097242018-04-30 16:49:04 +0000244 // The name field is required to be nul-terminated, and n_namesz includes the
245 // terminating nul in observed implementations (contrary to the ELF-64 spec).
246 // A special case is needed for cores generated by some older Linux versions,
247 // which write a note named "CORE" without a nul terminator and n_namesz = 4.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000248 if (n_namesz == 4) {
249 char buf[4];
250 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
251 return false;
252 if (strncmp(buf, "CORE", 4) == 0) {
253 n_name = "CORE";
254 *offset += 4;
255 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000256 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000257 }
Ed Mastec113ff82013-12-02 17:49:13 +0000258
Kate Stoneb9c1b512016-09-06 20:57:50 +0000259 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
260 if (cstr == NULL) {
261 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
262 if (log)
263 log->Printf("Failed to parse note name lacking nul terminator");
Ed Mastec113ff82013-12-02 17:49:13 +0000264
Kate Stoneb9c1b512016-09-06 20:57:50 +0000265 return false;
266 }
267 n_name = cstr;
268 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000269}
270
Kate Stoneb9c1b512016-09-06 20:57:50 +0000271static uint32_t kalimbaVariantFromElfFlags(const elf::elf_word e_flags) {
272 const uint32_t dsp_rev = e_flags & 0xFF;
273 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE;
274 switch (dsp_rev) {
275 // TODO(mg11) Support more variants
276 case 10:
277 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3;
278 break;
279 case 14:
280 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4;
281 break;
282 case 17:
283 case 20:
284 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5;
285 break;
286 default:
287 break;
288 }
289 return kal_arch_variant;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000290}
291
Nitesh Jain706c5202017-03-31 11:06:25 +0000292static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
293 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
294 uint32_t endian = header.e_ident[EI_DATA];
Kate Stoneb9c1b512016-09-06 20:57:50 +0000295 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
Nitesh Jain706c5202017-03-31 11:06:25 +0000296 uint32_t fileclass = header.e_ident[EI_CLASS];
297
Adrian Prantl05097242018-04-30 16:49:04 +0000298 // If there aren't any elf flags available (e.g core elf file) then return
299 // default
Nitesh Jain706c5202017-03-31 11:06:25 +0000300 // 32 or 64 bit arch (without any architecture revision) based on object file's class.
301 if (header.e_type == ET_CORE) {
302 switch (fileclass) {
303 case llvm::ELF::ELFCLASS32:
304 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
305 : ArchSpec::eMIPSSubType_mips32;
306 case llvm::ELF::ELFCLASS64:
307 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
308 : ArchSpec::eMIPSSubType_mips64;
309 default:
310 return arch_variant;
311 }
312 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000313
Kate Stoneb9c1b512016-09-06 20:57:50 +0000314 switch (mips_arch) {
315 case llvm::ELF::EF_MIPS_ARCH_1:
316 case llvm::ELF::EF_MIPS_ARCH_2:
317 case llvm::ELF::EF_MIPS_ARCH_32:
318 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
319 : ArchSpec::eMIPSSubType_mips32;
320 case llvm::ELF::EF_MIPS_ARCH_32R2:
321 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
322 : ArchSpec::eMIPSSubType_mips32r2;
323 case llvm::ELF::EF_MIPS_ARCH_32R6:
324 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
325 : ArchSpec::eMIPSSubType_mips32r6;
326 case llvm::ELF::EF_MIPS_ARCH_3:
327 case llvm::ELF::EF_MIPS_ARCH_4:
328 case llvm::ELF::EF_MIPS_ARCH_5:
329 case llvm::ELF::EF_MIPS_ARCH_64:
330 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
331 : ArchSpec::eMIPSSubType_mips64;
332 case llvm::ELF::EF_MIPS_ARCH_64R2:
333 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
334 : ArchSpec::eMIPSSubType_mips64r2;
335 case llvm::ELF::EF_MIPS_ARCH_64R6:
336 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
337 : ArchSpec::eMIPSSubType_mips64r6;
338 default:
339 break;
340 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000341
Kate Stoneb9c1b512016-09-06 20:57:50 +0000342 return arch_variant;
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000343}
344
Kate Stoneb9c1b512016-09-06 20:57:50 +0000345static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
346 if (header.e_machine == llvm::ELF::EM_MIPS)
Nitesh Jain706c5202017-03-31 11:06:25 +0000347 return mipsVariantFromElfFlags(header);
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000348
Kate Stoneb9c1b512016-09-06 20:57:50 +0000349 return llvm::ELF::EM_CSR_KALIMBA == header.e_machine
350 ? kalimbaVariantFromElfFlags(header.e_flags)
351 : LLDB_INVALID_CPUTYPE;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000352}
353
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000354//! The kalimba toolchain identifies a code section as being
355//! one with the SHT_PROGBITS set in the section sh_type and the top
356//! bit in the 32-bit address field set.
357static lldb::SectionType
Kate Stoneb9c1b512016-09-06 20:57:50 +0000358kalimbaSectionType(const elf::ELFHeader &header,
359 const elf::ELFSectionHeader &sect_hdr) {
360 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine) {
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000361 return eSectionTypeOther;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000362 }
363
364 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type) {
365 return eSectionTypeZeroFill;
366 }
367
368 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type) {
369 const lldb::addr_t KAL_CODE_BIT = 1 << 31;
370 return KAL_CODE_BIT & sect_hdr.sh_addr ? eSectionTypeCode
371 : eSectionTypeData;
372 }
373
374 return eSectionTypeOther;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000375}
376
Todd Fiala4339f3a2014-03-25 19:29:09 +0000377// Arbitrary constant used as UUID prefix for core files.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000378const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000379
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000380//------------------------------------------------------------------
381// Static methods.
382//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000383void ObjectFileELF::Initialize() {
384 PluginManager::RegisterPlugin(GetPluginNameStatic(),
385 GetPluginDescriptionStatic(), CreateInstance,
386 CreateMemoryInstance, GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000387}
388
Kate Stoneb9c1b512016-09-06 20:57:50 +0000389void ObjectFileELF::Terminate() {
390 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000391}
392
Kate Stoneb9c1b512016-09-06 20:57:50 +0000393lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
394 static ConstString g_name("elf");
395 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000396}
397
Kate Stoneb9c1b512016-09-06 20:57:50 +0000398const char *ObjectFileELF::GetPluginDescriptionStatic() {
399 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000400}
401
Kate Stoneb9c1b512016-09-06 20:57:50 +0000402ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
403 DataBufferSP &data_sp,
404 lldb::offset_t data_offset,
405 const lldb_private::FileSpec *file,
406 lldb::offset_t file_offset,
407 lldb::offset_t length) {
408 if (!data_sp) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000409 data_sp = MapFileData(*file, length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000410 if (!data_sp)
411 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000412 data_offset = 0;
413 }
414
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000415 assert(data_sp);
416
417 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
418 return nullptr;
419
420 const uint8_t *magic = data_sp->GetBytes() + data_offset;
421 if (!ELFHeader::MagicBytesMatch(magic))
422 return nullptr;
423
424 // Update the data to contain the entire file if it doesn't already
425 if (data_sp->GetByteSize() < length) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000426 data_sp = MapFileData(*file, 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) {
Benjamin Kramere1a60742017-09-14 15:01:55 +0000454 std::unique_ptr<ObjectFileELF> objfile_ap(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000455 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) {
Todd Fiala4339f3a2014-03-25 19:29:09 +0000542
Kate Stoneb9c1b512016-09-06 20:57:50 +0000543 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000544
Pavel Labath5ea7ecd2018-12-12 14:20:28 +0000545 for (const ELFProgramHeader &H : program_headers) {
546 if (H.p_type == llvm::ELF::PT_NOTE) {
547 const elf_off ph_offset = H.p_offset;
548 const size_t ph_size = H.p_filesz;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000549
Kate Stoneb9c1b512016-09-06 20:57:50 +0000550 DataExtractor segment_data;
551 if (segment_data.SetData(object_data, ph_offset, ph_size) != ph_size) {
Adrian Prantl05097242018-04-30 16:49:04 +0000552 // The ELF program header contained incorrect data, probably corefile
553 // is incomplete or corrupted.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000554 break;
555 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000556
Kate Stoneb9c1b512016-09-06 20:57:50 +0000557 core_notes_crc = calc_crc32(core_notes_crc, segment_data.GetDataStart(),
558 segment_data.GetByteSize());
Todd Fiala4339f3a2014-03-25 19:29:09 +0000559 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000560 }
Todd Fiala4339f3a2014-03-25 19:29:09 +0000561
Kate Stoneb9c1b512016-09-06 20:57:50 +0000562 return core_notes_crc;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000563}
564
Kate Stoneb9c1b512016-09-06 20:57:50 +0000565static const char *OSABIAsCString(unsigned char osabi_byte) {
566#define _MAKE_OSABI_CASE(x) \
567 case x: \
568 return #x
569 switch (osabi_byte) {
570 _MAKE_OSABI_CASE(ELFOSABI_NONE);
571 _MAKE_OSABI_CASE(ELFOSABI_HPUX);
572 _MAKE_OSABI_CASE(ELFOSABI_NETBSD);
573 _MAKE_OSABI_CASE(ELFOSABI_GNU);
574 _MAKE_OSABI_CASE(ELFOSABI_HURD);
575 _MAKE_OSABI_CASE(ELFOSABI_SOLARIS);
576 _MAKE_OSABI_CASE(ELFOSABI_AIX);
577 _MAKE_OSABI_CASE(ELFOSABI_IRIX);
578 _MAKE_OSABI_CASE(ELFOSABI_FREEBSD);
579 _MAKE_OSABI_CASE(ELFOSABI_TRU64);
580 _MAKE_OSABI_CASE(ELFOSABI_MODESTO);
581 _MAKE_OSABI_CASE(ELFOSABI_OPENBSD);
582 _MAKE_OSABI_CASE(ELFOSABI_OPENVMS);
583 _MAKE_OSABI_CASE(ELFOSABI_NSK);
584 _MAKE_OSABI_CASE(ELFOSABI_AROS);
585 _MAKE_OSABI_CASE(ELFOSABI_FENIXOS);
586 _MAKE_OSABI_CASE(ELFOSABI_C6000_ELFABI);
587 _MAKE_OSABI_CASE(ELFOSABI_C6000_LINUX);
588 _MAKE_OSABI_CASE(ELFOSABI_ARM);
589 _MAKE_OSABI_CASE(ELFOSABI_STANDALONE);
590 default:
591 return "<unknown-osabi>";
592 }
Todd Fialab91de782014-06-27 16:52:49 +0000593#undef _MAKE_OSABI_CASE
594}
595
Ed Mastef6a13122015-06-05 13:03:08 +0000596//
597// WARNING : This function is being deprecated
Adrian Prantl05097242018-04-30 16:49:04 +0000598// It's functionality has moved to ArchSpec::SetArchitecture This function is
599// only being kept to validate the move.
Ed Mastef6a13122015-06-05 13:03:08 +0000600//
601// TODO : Remove this function
Kate Stoneb9c1b512016-09-06 20:57:50 +0000602static bool GetOsFromOSABI(unsigned char osabi_byte,
603 llvm::Triple::OSType &ostype) {
604 switch (osabi_byte) {
605 case ELFOSABI_AIX:
606 ostype = llvm::Triple::OSType::AIX;
607 break;
608 case ELFOSABI_FREEBSD:
609 ostype = llvm::Triple::OSType::FreeBSD;
610 break;
611 case ELFOSABI_GNU:
612 ostype = llvm::Triple::OSType::Linux;
613 break;
614 case ELFOSABI_NETBSD:
615 ostype = llvm::Triple::OSType::NetBSD;
616 break;
617 case ELFOSABI_OPENBSD:
618 ostype = llvm::Triple::OSType::OpenBSD;
619 break;
620 case ELFOSABI_SOLARIS:
621 ostype = llvm::Triple::OSType::Solaris;
622 break;
623 default:
624 ostype = llvm::Triple::OSType::UnknownOS;
625 }
626 return ostype != llvm::Triple::OSType::UnknownOS;
Todd Fialab91de782014-06-27 16:52:49 +0000627}
628
Kate Stoneb9c1b512016-09-06 20:57:50 +0000629size_t ObjectFileELF::GetModuleSpecifications(
630 const lldb_private::FileSpec &file, lldb::DataBufferSP &data_sp,
631 lldb::offset_t data_offset, lldb::offset_t file_offset,
632 lldb::offset_t length, lldb_private::ModuleSpecList &specs) {
633 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Todd Fialab91de782014-06-27 16:52:49 +0000634
Kate Stoneb9c1b512016-09-06 20:57:50 +0000635 const size_t initial_count = specs.GetSize();
Michael Sartainc836ae72013-05-23 20:57:03 +0000636
Kate Stoneb9c1b512016-09-06 20:57:50 +0000637 if (ObjectFileELF::MagicBytesMatch(data_sp, 0, data_sp->GetByteSize())) {
638 DataExtractor data;
639 data.SetData(data_sp);
640 elf::ELFHeader header;
Pavel Labath23ccc292017-01-31 23:09:46 +0000641 lldb::offset_t header_offset = data_offset;
642 if (header.Parse(data, &header_offset)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000643 if (data_sp) {
644 ModuleSpec spec(file);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000645
Kate Stoneb9c1b512016-09-06 20:57:50 +0000646 const uint32_t sub_type = subTypeFromElfHeader(header);
647 spec.GetArchitecture().SetArchitecture(
648 eArchTypeELF, header.e_machine, sub_type, header.e_ident[EI_OSABI]);
Matthew Gardiner5f675792014-08-27 12:09:39 +0000649
Kate Stoneb9c1b512016-09-06 20:57:50 +0000650 if (spec.GetArchitecture().IsValid()) {
651 llvm::Triple::OSType ostype;
652 llvm::Triple::VendorType vendor;
653 llvm::Triple::OSType spec_ostype =
654 spec.GetArchitecture().GetTriple().getOS();
Todd Fialab91de782014-06-27 16:52:49 +0000655
Kate Stoneb9c1b512016-09-06 20:57:50 +0000656 if (log)
657 log->Printf("ObjectFileELF::%s file '%s' module OSABI: %s",
658 __FUNCTION__, file.GetPath().c_str(),
659 OSABIAsCString(header.e_ident[EI_OSABI]));
Ed Mastef6a13122015-06-05 13:03:08 +0000660
Kate Stoneb9c1b512016-09-06 20:57:50 +0000661 // SetArchitecture should have set the vendor to unknown
662 vendor = spec.GetArchitecture().GetTriple().getVendor();
663 assert(vendor == llvm::Triple::UnknownVendor);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +0000664 UNUSED_IF_ASSERT_DISABLED(vendor);
Ed Mastef6a13122015-06-05 13:03:08 +0000665
Kate Stoneb9c1b512016-09-06 20:57:50 +0000666 //
667 // Validate it is ok to remove GetOsFromOSABI
668 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
669 assert(spec_ostype == ostype);
670 if (spec_ostype != llvm::Triple::OSType::UnknownOS) {
671 if (log)
672 log->Printf("ObjectFileELF::%s file '%s' set ELF module OS type "
673 "from ELF header OSABI.",
674 __FUNCTION__, file.GetPath().c_str());
675 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000676
Pavel Labath4f033122018-02-05 17:25:40 +0000677 data_sp = MapFileData(file, -1, file_offset);
678 if (data_sp)
679 data.SetData(data_sp);
Adrian Prantl05097242018-04-30 16:49:04 +0000680 // In case there is header extension in the section #0, the header we
681 // parsed above could have sentinel values for e_phnum, e_shnum, and
682 // e_shstrndx. In this case we need to reparse the header with a
683 // bigger data source to get the actual values.
Pavel Labath4f033122018-02-05 17:25:40 +0000684 if (header.HasHeaderExtension()) {
685 lldb::offset_t header_offset = data_offset;
686 header.Parse(data, &header_offset);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000687 }
Michael Sartaina7499c92013-07-01 19:45:50 +0000688
Kate Stoneb9c1b512016-09-06 20:57:50 +0000689 uint32_t gnu_debuglink_crc = 0;
690 std::string gnu_debuglink_file;
691 SectionHeaderColl section_headers;
692 lldb_private::UUID &uuid = spec.GetUUID();
Michael Sartain9f4517a2013-07-03 01:52:14 +0000693
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000694 GetSectionHeaderInfo(section_headers, data, header, uuid,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000695 gnu_debuglink_file, gnu_debuglink_crc,
696 spec.GetArchitecture());
Ravitheja Addepally15f89c42016-01-19 12:55:21 +0000697
Kate Stoneb9c1b512016-09-06 20:57:50 +0000698 llvm::Triple &spec_triple = spec.GetArchitecture().GetTriple();
Todd Fialab91de782014-06-27 16:52:49 +0000699
Kate Stoneb9c1b512016-09-06 20:57:50 +0000700 if (log)
701 log->Printf("ObjectFileELF::%s file '%s' module set to triple: %s "
702 "(architecture %s)",
703 __FUNCTION__, file.GetPath().c_str(),
704 spec_triple.getTriple().c_str(),
705 spec.GetArchitecture().GetArchitectureName());
Todd Fialab91de782014-06-27 16:52:49 +0000706
Kate Stoneb9c1b512016-09-06 20:57:50 +0000707 if (!uuid.IsValid()) {
708 uint32_t core_notes_crc = 0;
Todd Fiala4339f3a2014-03-25 19:29:09 +0000709
Kate Stoneb9c1b512016-09-06 20:57:50 +0000710 if (!gnu_debuglink_crc) {
Pavel Labathf9d16472017-05-15 13:02:37 +0000711 static Timer::Category func_cat(LLVM_PRETTY_FUNCTION);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000712 lldb_private::Timer scoped_timer(
Pavel Labathf9d16472017-05-15 13:02:37 +0000713 func_cat,
Kate Stoneb9c1b512016-09-06 20:57:50 +0000714 "Calculating module crc32 %s with size %" PRIu64 " KiB",
715 file.GetLastPathComponent().AsCString(),
Jonas Devlieghere59b78bc2018-11-01 04:45:28 +0000716 (FileSystem::Instance().GetByteSize(file) - file_offset) /
717 1024);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000718
Kate Stoneb9c1b512016-09-06 20:57:50 +0000719 // For core files - which usually don't happen to have a
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000720 // gnu_debuglink, and are pretty bulky - calculating whole
721 // contents crc32 would be too much of luxury. Thus we will need
722 // to fallback to something simpler.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000723 if (header.e_type == llvm::ELF::ET_CORE) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000724 ProgramHeaderColl program_headers;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000725 GetProgramHeaderInfo(program_headers, data, header);
Michael Sartainc836ae72013-05-23 20:57:03 +0000726
Kate Stoneb9c1b512016-09-06 20:57:50 +0000727 core_notes_crc =
728 CalculateELFNotesSegmentsCRC32(program_headers, data);
729 } else {
Pavel Labath4f033122018-02-05 17:25:40 +0000730 gnu_debuglink_crc = calc_gnu_debuglink_crc32(
731 data.GetDataStart(), data.GetByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000732 }
733 }
Pavel Labath77c397f2018-06-29 11:20:29 +0000734 using u32le = llvm::support::ulittle32_t;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000735 if (gnu_debuglink_crc) {
736 // Use 4 bytes of crc from the .gnu_debuglink section.
Pavel Labath77c397f2018-06-29 11:20:29 +0000737 u32le data(gnu_debuglink_crc);
738 uuid = UUID::fromData(&data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000739 } else if (core_notes_crc) {
740 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
Adrian Prantl05097242018-04-30 16:49:04 +0000741 // it look different form .gnu_debuglink crc followed by 4 bytes
742 // of note segments crc.
Pavel Labath77c397f2018-06-29 11:20:29 +0000743 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
744 uuid = UUID::fromData(data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000745 }
746 }
747
748 specs.Append(spec);
749 }
750 }
751 }
752 }
753
754 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000755}
756
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000757//------------------------------------------------------------------
758// PluginInterface protocol
759//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000760lldb_private::ConstString ObjectFileELF::GetPluginName() {
761 return GetPluginNameStatic();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000762}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000763
Kate Stoneb9c1b512016-09-06 20:57:50 +0000764uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000765//------------------------------------------------------------------
766// ObjectFile protocol
767//------------------------------------------------------------------
768
Kate Stoneb9c1b512016-09-06 20:57:50 +0000769ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
770 DataBufferSP &data_sp, lldb::offset_t data_offset,
771 const FileSpec *file, lldb::offset_t file_offset,
772 lldb::offset_t length)
773 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
774 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
775 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
776 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
777 if (file)
778 m_file = *file;
779 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000780}
781
Kate Stoneb9c1b512016-09-06 20:57:50 +0000782ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
783 DataBufferSP &header_data_sp,
784 const lldb::ProcessSP &process_sp,
785 addr_t header_addr)
786 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
787 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
788 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
789 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
790 ::memset(&m_header, 0, sizeof(m_header));
Andrew MacPherson17220c12014-03-05 10:12:43 +0000791}
792
Kate Stoneb9c1b512016-09-06 20:57:50 +0000793ObjectFileELF::~ObjectFileELF() {}
794
795bool ObjectFileELF::IsExecutable() const {
796 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000797}
798
Kate Stoneb9c1b512016-09-06 20:57:50 +0000799bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
800 bool value_is_offset) {
801 ModuleSP module_sp = GetModule();
802 if (module_sp) {
803 size_t num_loaded_sections = 0;
804 SectionList *section_list = GetSectionList();
805 if (section_list) {
806 if (!value_is_offset) {
807 bool found_offset = false;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +0000808 for (const ELFProgramHeader &H : ProgramHeaders()) {
809 if (H.p_type != PT_LOAD || H.p_offset != 0)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000810 continue;
Jim Ingham5aee1622010-08-09 23:31:02 +0000811
Pavel Labath5ea7ecd2018-12-12 14:20:28 +0000812 value = value - H.p_vaddr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000813 found_offset = true;
814 break;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000815 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000816 if (!found_offset)
817 return false;
818 }
819
820 const size_t num_sections = section_list->GetSize();
821 size_t sect_idx = 0;
822
823 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
Adrian Prantl05097242018-04-30 16:49:04 +0000824 // Iterate through the object file sections to find all of the sections
825 // that have SHF_ALLOC in their flag bits.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000826 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
827 if (section_sp && section_sp->Test(SHF_ALLOC)) {
Pavel Labathec03d7e2018-02-28 20:42:29 +0000828 lldb::addr_t load_addr = section_sp->GetFileAddress();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000829 // We don't want to update the load address of a section with type
830 // eSectionTypeAbsoluteAddress as they already have the absolute load
Adrian Prantl05097242018-04-30 16:49:04 +0000831 // address already specified
Kate Stoneb9c1b512016-09-06 20:57:50 +0000832 if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
833 load_addr += value;
834
835 // On 32-bit systems the load address have to fit into 4 bytes. The
Adrian Prantl05097242018-04-30 16:49:04 +0000836 // rest of the bytes are the overflow from the addition.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000837 if (GetAddressByteSize() == 4)
838 load_addr &= 0xFFFFFFFF;
839
840 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
841 load_addr))
842 ++num_loaded_sections;
843 }
844 }
845 return num_loaded_sections > 0;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000846 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000847 }
848 return false;
849}
850
851ByteOrder ObjectFileELF::GetByteOrder() const {
852 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
853 return eByteOrderBig;
854 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
855 return eByteOrderLittle;
856 return eByteOrderInvalid;
857}
858
859uint32_t ObjectFileELF::GetAddressByteSize() const {
860 return m_data.GetAddressByteSize();
861}
862
863AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
864 Symtab *symtab = GetSymtab();
865 if (!symtab)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000866 return AddressClass::eUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000867
Adrian Prantl05097242018-04-30 16:49:04 +0000868 // The address class is determined based on the symtab. Ask it from the
869 // object file what contains the symtab information.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000870 ObjectFile *symtab_objfile = symtab->GetObjectFile();
871 if (symtab_objfile != nullptr && symtab_objfile != this)
872 return symtab_objfile->GetAddressClass(file_addr);
873
874 auto res = ObjectFile::GetAddressClass(file_addr);
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000875 if (res != AddressClass::eCode)
Kate Stoneb9c1b512016-09-06 20:57:50 +0000876 return res;
877
878 auto ub = m_address_class_map.upper_bound(file_addr);
879 if (ub == m_address_class_map.begin()) {
Adrian Prantl05097242018-04-30 16:49:04 +0000880 // No entry in the address class map before the address. Return default
881 // address class for an address in a code section.
Tatyana Krasnukha04803b32018-06-26 13:06:54 +0000882 return AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000883 }
884
885 // Move iterator to the address class entry preceding address
886 --ub;
887
888 return ub->second;
889}
890
891size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
Pavel Labath0d38e4f2018-12-18 15:56:45 +0000892 return std::distance(m_section_headers.begin(), I);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000893}
894
895size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
Pavel Labath0d38e4f2018-12-18 15:56:45 +0000896 return std::distance(m_section_headers.begin(), I);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000897}
898
899bool ObjectFileELF::ParseHeader() {
900 lldb::offset_t offset = 0;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000901 return m_header.Parse(m_data, &offset);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000902}
903
Kate Stoneb9c1b512016-09-06 20:57:50 +0000904bool ObjectFileELF::GetUUID(lldb_private::UUID *uuid) {
905 // Need to parse the section list to get the UUIDs, so make sure that's been
906 // done.
907 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000908 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000909
Pavel Labath77c397f2018-06-29 11:20:29 +0000910 using u32le = llvm::support::ulittle32_t;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000911 if (m_uuid.IsValid()) {
912 // We have the full build id uuid.
913 *uuid = m_uuid;
914 return true;
915 } else if (GetType() == ObjectFile::eTypeCoreFile) {
916 uint32_t core_notes_crc = 0;
917
918 if (!ParseProgramHeaders())
919 return false;
920
921 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
922
923 if (core_notes_crc) {
Adrian Prantl05097242018-04-30 16:49:04 +0000924 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look
925 // different form .gnu_debuglink crc - followed by 4 bytes of note
Kate Stoneb9c1b512016-09-06 20:57:50 +0000926 // segments crc.
Pavel Labath77c397f2018-06-29 11:20:29 +0000927 u32le data[] = {u32le(g_core_uuid_magic), u32le(core_notes_crc)};
928 m_uuid = UUID::fromData(data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000929 }
930 } else {
931 if (!m_gnu_debuglink_crc)
932 m_gnu_debuglink_crc =
933 calc_gnu_debuglink_crc32(m_data.GetDataStart(), m_data.GetByteSize());
934 if (m_gnu_debuglink_crc) {
935 // Use 4 bytes of crc from the .gnu_debuglink section.
Pavel Labath77c397f2018-06-29 11:20:29 +0000936 u32le data(m_gnu_debuglink_crc);
937 m_uuid = UUID::fromData(&data, sizeof(data));
Kate Stoneb9c1b512016-09-06 20:57:50 +0000938 }
939 }
940
941 if (m_uuid.IsValid()) {
942 *uuid = m_uuid;
943 return true;
944 }
945
946 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000947}
948
Kate Stoneb9c1b512016-09-06 20:57:50 +0000949lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() {
950 FileSpecList file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000951
Kate Stoneb9c1b512016-09-06 20:57:50 +0000952 if (!m_gnu_debuglink_file.empty()) {
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +0000953 FileSpec file_spec(m_gnu_debuglink_file);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000954 file_spec_list.Append(file_spec);
955 }
956 return file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000957}
958
Kate Stoneb9c1b512016-09-06 20:57:50 +0000959uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
960 size_t num_modules = ParseDependentModules();
961 uint32_t num_specs = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000962
Kate Stoneb9c1b512016-09-06 20:57:50 +0000963 for (unsigned i = 0; i < num_modules; ++i) {
964 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
965 num_specs++;
966 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000967
Kate Stoneb9c1b512016-09-06 20:57:50 +0000968 return num_specs;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000969}
970
Kate Stoneb9c1b512016-09-06 20:57:50 +0000971Address ObjectFileELF::GetImageInfoAddress(Target *target) {
972 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000973 return Address();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000974
975 SectionList *section_list = GetSectionList();
976 if (!section_list)
977 return Address();
978
979 // Find the SHT_DYNAMIC (.dynamic) section.
980 SectionSP dynsym_section_sp(
981 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
982 if (!dynsym_section_sp)
983 return Address();
984 assert(dynsym_section_sp->GetObjectFile() == this);
985
986 user_id_t dynsym_id = dynsym_section_sp->GetID();
987 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
988 if (!dynsym_hdr)
989 return Address();
990
991 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
992 ELFDynamic &symbol = m_dynamic_symbols[i];
993
994 if (symbol.d_tag == DT_DEBUG) {
Adrian Prantl05097242018-04-30 16:49:04 +0000995 // Compute the offset as the number of previous entries plus the size of
996 // d_tag.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000997 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
998 return Address(dynsym_section_sp, offset);
999 }
1000 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
1001 // exists in non-PIE.
1002 else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
1003 symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
1004 target) {
1005 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1006 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
1007 if (dyn_base == LLDB_INVALID_ADDRESS)
1008 return Address();
1009
Zachary Turner97206d52017-05-12 04:51:55 +00001010 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001011 if (symbol.d_tag == DT_MIPS_RLD_MAP) {
1012 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
1013 Address addr;
1014 if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
1015 addr))
1016 return addr;
1017 }
1018 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) {
1019 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer,
1020 // relative to the address of the tag.
1021 uint64_t rel_offset;
1022 rel_offset = target->ReadUnsignedIntegerFromMemory(
1023 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error);
1024 if (error.Success() && rel_offset != UINT64_MAX) {
1025 Address addr;
1026 addr_t debug_ptr_address =
1027 dyn_base + (offset - GetAddressByteSize()) + rel_offset;
1028 addr.SetOffset(debug_ptr_address);
1029 return addr;
1030 }
1031 }
1032 }
1033 }
1034
1035 return Address();
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001036}
1037
Kate Stoneb9c1b512016-09-06 20:57:50 +00001038lldb_private::Address ObjectFileELF::GetEntryPointAddress() {
1039 if (m_entry_point_address.IsValid())
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001040 return m_entry_point_address;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001041
1042 if (!ParseHeader() || !IsExecutable())
1043 return m_entry_point_address;
1044
1045 SectionList *section_list = GetSectionList();
1046 addr_t offset = m_header.e_entry;
1047
1048 if (!section_list)
1049 m_entry_point_address.SetOffset(offset);
1050 else
1051 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
1052 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +00001053}
1054
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001055//----------------------------------------------------------------------
1056// ParseDependentModules
1057//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001058size_t ObjectFileELF::ParseDependentModules() {
1059 if (m_filespec_ap.get())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001060 return m_filespec_ap->GetSize();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001061
1062 m_filespec_ap.reset(new FileSpecList());
1063
1064 if (!ParseSectionHeaders())
1065 return 0;
1066
1067 SectionList *section_list = GetSectionList();
1068 if (!section_list)
1069 return 0;
1070
1071 // Find the SHT_DYNAMIC section.
1072 Section *dynsym =
1073 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
1074 .get();
1075 if (!dynsym)
1076 return 0;
1077 assert(dynsym->GetObjectFile() == this);
1078
1079 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID());
1080 if (!header)
1081 return 0;
1082 // sh_link: section header index of string table used by entries in the
1083 // section.
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001084 Section *dynstr = section_list->FindSectionByID(header->sh_link).get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001085 if (!dynstr)
1086 return 0;
1087
1088 DataExtractor dynsym_data;
1089 DataExtractor dynstr_data;
1090 if (ReadSectionData(dynsym, dynsym_data) &&
1091 ReadSectionData(dynstr, dynstr_data)) {
1092 ELFDynamic symbol;
1093 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1094 lldb::offset_t offset = 0;
1095
1096 // The only type of entries we are concerned with are tagged DT_NEEDED,
1097 // yielding the name of a required library.
1098 while (offset < section_size) {
1099 if (!symbol.Parse(dynsym_data, &offset))
1100 break;
1101
1102 if (symbol.d_tag != DT_NEEDED)
1103 continue;
1104
1105 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1106 const char *lib_name = dynstr_data.PeekCStr(str_index);
Jonas Devlieghere8f3be7a2018-11-01 21:05:36 +00001107 FileSpec file_spec(lib_name);
1108 FileSystem::Instance().Resolve(file_spec);
1109 m_filespec_ap->Append(file_spec);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001110 }
1111 }
1112
1113 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001114}
1115
1116//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001117// GetProgramHeaderInfo
1118//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001119size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001120 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001121 const ELFHeader &header) {
1122 // We have already parsed the program headers
1123 if (!program_headers.empty())
Todd Fiala4339f3a2014-03-25 19:29:09 +00001124 return program_headers.size();
1125
Kate Stoneb9c1b512016-09-06 20:57:50 +00001126 // If there are no program headers to read we are done.
1127 if (header.e_phnum == 0)
1128 return 0;
1129
1130 program_headers.resize(header.e_phnum);
1131 if (program_headers.size() != header.e_phnum)
1132 return 0;
1133
1134 const size_t ph_size = header.e_phnum * header.e_phentsize;
1135 const elf_off ph_offset = header.e_phoff;
1136 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001137 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001138 return 0;
1139
1140 uint32_t idx;
1141 lldb::offset_t offset;
1142 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001143 if (!program_headers[idx].Parse(data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001144 break;
1145 }
1146
1147 if (idx < program_headers.size())
1148 program_headers.resize(idx);
1149
1150 return program_headers.size();
Todd Fiala4339f3a2014-03-25 19:29:09 +00001151}
1152
1153//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001154// ParseProgramHeaders
1155//----------------------------------------------------------------------
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00001156bool ObjectFileELF::ParseProgramHeaders() {
1157 return GetProgramHeaderInfo(m_program_headers, m_data, m_header) != 0;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001158}
1159
Zachary Turner97206d52017-05-12 04:51:55 +00001160lldb_private::Status
Kate Stoneb9c1b512016-09-06 20:57:50 +00001161ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
1162 lldb_private::ArchSpec &arch_spec,
1163 lldb_private::UUID &uuid) {
1164 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Zachary Turner97206d52017-05-12 04:51:55 +00001165 Status error;
Todd Fialab91de782014-06-27 16:52:49 +00001166
Kate Stoneb9c1b512016-09-06 20:57:50 +00001167 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001168
Kate Stoneb9c1b512016-09-06 20:57:50 +00001169 while (true) {
1170 // Parse the note header. If this fails, bail out.
1171 const lldb::offset_t note_offset = offset;
1172 ELFNote note = ELFNote();
1173 if (!note.Parse(data, &offset)) {
1174 // We're done.
1175 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001176 }
Todd Fialab91de782014-06-27 16:52:49 +00001177
Kate Stoneb9c1b512016-09-06 20:57:50 +00001178 if (log)
1179 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32,
1180 __FUNCTION__, note.n_name.c_str(), note.n_type);
1181
1182 // Process FreeBSD ELF notes.
1183 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1184 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1185 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) {
1186 // Pull out the min version info.
1187 uint32_t version_info;
1188 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1189 error.SetErrorString("failed to read FreeBSD ABI note payload");
1190 return error;
1191 }
1192
1193 // Convert the version info into a major/minor number.
1194 const uint32_t version_major = version_info / 100000;
1195 const uint32_t version_minor = (version_info / 1000) % 100;
1196
1197 char os_name[32];
1198 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32,
1199 version_major, version_minor);
1200
1201 // Set the elf OS version to FreeBSD. Also clear the vendor.
1202 arch_spec.GetTriple().setOSName(os_name);
1203 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1204
1205 if (log)
1206 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32
1207 ".%" PRIu32,
1208 __FUNCTION__, version_major, version_minor,
1209 static_cast<uint32_t>(version_info % 1000));
1210 }
1211 // Process GNU ELF notes.
1212 else if (note.n_name == LLDB_NT_OWNER_GNU) {
1213 switch (note.n_type) {
1214 case LLDB_NT_GNU_ABI_TAG:
1215 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) {
1216 // Pull out the min OS version supporting the ABI.
1217 uint32_t version_info[4];
1218 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) ==
1219 nullptr) {
1220 error.SetErrorString("failed to read GNU ABI note payload");
1221 return error;
1222 }
1223
1224 // Set the OS per the OS field.
1225 switch (version_info[0]) {
1226 case LLDB_NT_GNU_ABI_OS_LINUX:
1227 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1228 arch_spec.GetTriple().setVendor(
1229 llvm::Triple::VendorType::UnknownVendor);
1230 if (log)
1231 log->Printf(
1232 "ObjectFileELF::%s detected Linux, min version %" PRIu32
1233 ".%" PRIu32 ".%" PRIu32,
1234 __FUNCTION__, version_info[1], version_info[2],
1235 version_info[3]);
1236 // FIXME we have the minimal version number, we could be propagating
1237 // that. version_info[1] = OS Major, version_info[2] = OS Minor,
1238 // version_info[3] = Revision.
1239 break;
1240 case LLDB_NT_GNU_ABI_OS_HURD:
1241 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1242 arch_spec.GetTriple().setVendor(
1243 llvm::Triple::VendorType::UnknownVendor);
1244 if (log)
1245 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min "
1246 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1247 __FUNCTION__, version_info[1], version_info[2],
1248 version_info[3]);
1249 break;
1250 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1251 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris);
1252 arch_spec.GetTriple().setVendor(
1253 llvm::Triple::VendorType::UnknownVendor);
1254 if (log)
1255 log->Printf(
1256 "ObjectFileELF::%s detected Solaris, min version %" PRIu32
1257 ".%" PRIu32 ".%" PRIu32,
1258 __FUNCTION__, version_info[1], version_info[2],
1259 version_info[3]);
1260 break;
1261 default:
1262 if (log)
1263 log->Printf(
1264 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32
1265 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1266 __FUNCTION__, version_info[0], version_info[1],
1267 version_info[2], version_info[3]);
1268 break;
1269 }
1270 }
1271 break;
1272
1273 case LLDB_NT_GNU_BUILD_ID_TAG:
1274 // Only bother processing this if we don't already have the uuid set.
1275 if (!uuid.IsValid()) {
1276 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a
Pavel Labath77c397f2018-06-29 11:20:29 +00001277 // build-id of a different length. Accept it as long as it's at least
1278 // 4 bytes as it will be better than our own crc32.
1279 if (note.n_descsz >= 4) {
1280 if (const uint8_t *buf = data.PeekData(offset, note.n_descsz)) {
1281 // Save the build id as the UUID for the module.
1282 uuid = UUID::fromData(buf, note.n_descsz);
1283 } else {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001284 error.SetErrorString("failed to read GNU_BUILD_ID note payload");
1285 return error;
1286 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001287 }
1288 }
1289 break;
1290 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001291 if (arch_spec.IsMIPS() &&
1292 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1293 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform
1294 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001295 }
1296 // Process NetBSD ELF notes.
1297 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1298 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1299 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE)) {
1300 // Pull out the min version info.
1301 uint32_t version_info;
1302 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1303 error.SetErrorString("failed to read NetBSD ABI note payload");
1304 return error;
1305 }
1306
1307 // Set the elf OS version to NetBSD. Also clear the vendor.
1308 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD);
1309 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1310
1311 if (log)
1312 log->Printf(
1313 "ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32,
1314 __FUNCTION__, version_info);
1315 }
Kamil Rytarowski12801f12017-03-26 15:34:57 +00001316 // Process OpenBSD ELF notes.
1317 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) {
1318 // Set the elf OS version to OpenBSD. Also clear the vendor.
1319 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD);
1320 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1321 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001322 // Process CSR kalimba notes
1323 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1324 (note.n_name == LLDB_NT_OWNER_CSR)) {
1325 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1326 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1327
1328 // TODO At some point the description string could be processed.
Adrian Prantl05097242018-04-30 16:49:04 +00001329 // It could provide a steer towards the kalimba variant which this ELF
1330 // targets.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001331 if (note.n_descsz) {
1332 const char *cstr =
1333 data.GetCStr(&offset, llvm::alignTo(note.n_descsz, 4));
1334 (void)cstr;
1335 }
1336 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) {
1337 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1338 arch_spec.GetTriple().setEnvironment(
1339 llvm::Triple::EnvironmentType::Android);
1340 } else if (note.n_name == LLDB_NT_OWNER_LINUX) {
1341 // This is sometimes found in core files and usually contains extended
1342 // register info
1343 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1344 } else if (note.n_name == LLDB_NT_OWNER_CORE) {
Adrian Prantl05097242018-04-30 16:49:04 +00001345 // Parse the NT_FILE to look for stuff in paths to shared libraries As
1346 // the contents look like this in a 64 bit ELF core file: count =
1347 // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index
1348 // start end file_ofs path =====
1349 // ------------------ ------------------ ------------------
1350 // ------------------------------------- [ 0] 0x0000000000400000
1351 // 0x0000000000401000 0x0000000000000000 /tmp/a.out [ 1]
1352 // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [
1353 // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out
Kate Stoneb9c1b512016-09-06 20:57:50 +00001354 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
Adrian Prantl05097242018-04-30 16:49:04 +00001355 // /lib/x86_64-linux-gnu/libc-2.19.so [ 4] 0x00007fa79cba8000
1356 // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-
1357 // gnu/libc-2.19.so [ 5] 0x00007fa79cda7000 0x00007fa79cdab000
1358 // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [ 6]
1359 // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64
1360 // -linux-gnu/libc-2.19.so [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000
1361 // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [ 8]
1362 // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64
1363 // -linux-gnu/ld-2.19.so [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000
1364 // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs
1365 // the count, page_size, start, end, file_ofs are uint32_t For reference:
1366 // see readelf source code (in binutils).
Kate Stoneb9c1b512016-09-06 20:57:50 +00001367 if (note.n_type == NT_FILE) {
1368 uint64_t count = data.GetAddress(&offset);
1369 const char *cstr;
1370 data.GetAddress(&offset); // Skip page size
1371 offset += count * 3 *
1372 data.GetAddressByteSize(); // Skip all start/end/file_ofs
1373 for (size_t i = 0; i < count; ++i) {
1374 cstr = data.GetCStr(&offset);
1375 if (cstr == nullptr) {
1376 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read "
1377 "at an offset after the end "
1378 "(GetCStr returned nullptr)",
1379 __FUNCTION__);
1380 return error;
1381 }
1382 llvm::StringRef path(cstr);
Richard Chamberlaina0c82e12016-10-13 12:11:00 +00001383 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001384 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1385 break;
1386 }
1387 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001388 if (arch_spec.IsMIPS() &&
1389 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
Adrian Prantl05097242018-04-30 16:49:04 +00001390 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some
1391 // cases (e.g. compile with -nostdlib) Hence set OS to Linux
Leonard Mosescu9ba51572018-08-07 18:00:30 +00001392 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001393 }
1394 }
1395
Adrian Prantl05097242018-04-30 16:49:04 +00001396 // Calculate the offset of the next note just in case "offset" has been
1397 // used to poke at the contents of the note data
Kate Stoneb9c1b512016-09-06 20:57:50 +00001398 offset = note_offset + note.GetByteSize();
1399 }
1400
1401 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001402}
Michael Sartaina7499c92013-07-01 19:45:50 +00001403
Kate Stoneb9c1b512016-09-06 20:57:50 +00001404void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length,
1405 ArchSpec &arch_spec) {
1406 lldb::offset_t Offset = 0;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001407
Kate Stoneb9c1b512016-09-06 20:57:50 +00001408 uint8_t FormatVersion = data.GetU8(&Offset);
1409 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version)
1410 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001411
Kate Stoneb9c1b512016-09-06 20:57:50 +00001412 Offset = Offset + sizeof(uint32_t); // Section Length
1413 llvm::StringRef VendorName = data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001414
Kate Stoneb9c1b512016-09-06 20:57:50 +00001415 if (VendorName != "aeabi")
1416 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001417
Kate Stoneb9c1b512016-09-06 20:57:50 +00001418 if (arch_spec.GetTriple().getEnvironment() ==
1419 llvm::Triple::UnknownEnvironment)
1420 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001421
Kate Stoneb9c1b512016-09-06 20:57:50 +00001422 while (Offset < length) {
1423 uint8_t Tag = data.GetU8(&Offset);
1424 uint32_t Size = data.GetU32(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001425
Kate Stoneb9c1b512016-09-06 20:57:50 +00001426 if (Tag != llvm::ARMBuildAttrs::File || Size == 0)
1427 continue;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001428
Kate Stoneb9c1b512016-09-06 20:57:50 +00001429 while (Offset < length) {
1430 uint64_t Tag = data.GetULEB128(&Offset);
1431 switch (Tag) {
1432 default:
1433 if (Tag < 32)
1434 data.GetULEB128(&Offset);
1435 else if (Tag % 2 == 0)
1436 data.GetULEB128(&Offset);
1437 else
1438 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001439
Kate Stoneb9c1b512016-09-06 20:57:50 +00001440 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001441
Kate Stoneb9c1b512016-09-06 20:57:50 +00001442 case llvm::ARMBuildAttrs::CPU_raw_name:
1443 case llvm::ARMBuildAttrs::CPU_name:
1444 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001445
Kate Stoneb9c1b512016-09-06 20:57:50 +00001446 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001447
Kate Stoneb9c1b512016-09-06 20:57:50 +00001448 case llvm::ARMBuildAttrs::ABI_VFP_args: {
1449 uint64_t VFPArgs = data.GetULEB128(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001450
Kate Stoneb9c1b512016-09-06 20:57:50 +00001451 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) {
1452 if (arch_spec.GetTriple().getEnvironment() ==
1453 llvm::Triple::UnknownEnvironment ||
1454 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF)
1455 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001456
Kate Stoneb9c1b512016-09-06 20:57:50 +00001457 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1458 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) {
1459 if (arch_spec.GetTriple().getEnvironment() ==
1460 llvm::Triple::UnknownEnvironment ||
1461 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI)
1462 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001463
Kate Stoneb9c1b512016-09-06 20:57:50 +00001464 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001465 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001466
1467 break;
1468 }
1469 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001470 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001471 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001472}
Todd Fialab91de782014-06-27 16:52:49 +00001473
Michael Sartaina7499c92013-07-01 19:45:50 +00001474//----------------------------------------------------------------------
1475// GetSectionHeaderInfo
1476//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001477size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001478 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001479 const elf::ELFHeader &header,
1480 lldb_private::UUID &uuid,
1481 std::string &gnu_debuglink_file,
1482 uint32_t &gnu_debuglink_crc,
1483 ArchSpec &arch_spec) {
1484 // Don't reparse the section headers if we already did that.
1485 if (!section_headers.empty())
1486 return section_headers.size();
Todd Fiala6477ea82014-07-11 15:13:33 +00001487
Kate Stoneb9c1b512016-09-06 20:57:50 +00001488 // Only initialize the arch_spec to okay defaults if they're not already set.
1489 // We'll refine this with note data as we parse the notes.
1490 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) {
1491 llvm::Triple::OSType ostype;
1492 llvm::Triple::OSType spec_ostype;
1493 const uint32_t sub_type = subTypeFromElfHeader(header);
1494 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
1495 header.e_ident[EI_OSABI]);
Leonard Mosescu9ba51572018-08-07 18:00:30 +00001496
Adrian Prantl05097242018-04-30 16:49:04 +00001497 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is
1498 // determined based on EI_OSABI flag and the info extracted from ELF notes
1499 // (see RefineModuleDetailsFromNote). However in some cases that still
1500 // might be not enough: for example a shared library might not have any
1501 // notes at all and have EI_OSABI flag set to System V, as result the OS
1502 // will be set to UnknownOS.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001503 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
1504 spec_ostype = arch_spec.GetTriple().getOS();
1505 assert(spec_ostype == ostype);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +00001506 UNUSED_IF_ASSERT_DISABLED(spec_ostype);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001507 }
1508
1509 if (arch_spec.GetMachine() == llvm::Triple::mips ||
1510 arch_spec.GetMachine() == llvm::Triple::mipsel ||
1511 arch_spec.GetMachine() == llvm::Triple::mips64 ||
1512 arch_spec.GetMachine() == llvm::Triple::mips64el) {
1513 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) {
1514 case llvm::ELF::EF_MIPS_MICROMIPS:
1515 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips);
1516 break;
1517 case llvm::ELF::EF_MIPS_ARCH_ASE_M16:
1518 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16);
1519 break;
1520 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX:
1521 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx);
1522 break;
1523 default:
1524 break;
Todd Fialab91de782014-06-27 16:52:49 +00001525 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001526 }
Todd Fialab91de782014-06-27 16:52:49 +00001527
Kate Stoneb9c1b512016-09-06 20:57:50 +00001528 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1529 arch_spec.GetMachine() == llvm::Triple::thumb) {
1530 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT)
1531 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1532 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT)
1533 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1534 }
Jaydeep Patil501a7812015-07-16 03:51:55 +00001535
Kate Stoneb9c1b512016-09-06 20:57:50 +00001536 // If there are no section headers we are done.
1537 if (header.e_shnum == 0)
Michael Sartaina7499c92013-07-01 19:45:50 +00001538 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001539
1540 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1541
1542 section_headers.resize(header.e_shnum);
1543 if (section_headers.size() != header.e_shnum)
1544 return 0;
1545
1546 const size_t sh_size = header.e_shnum * header.e_shentsize;
1547 const elf_off sh_offset = header.e_shoff;
1548 DataExtractor sh_data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001549 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001550 return 0;
1551
1552 uint32_t idx;
1553 lldb::offset_t offset;
1554 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001555 if (!section_headers[idx].Parse(sh_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001556 break;
1557 }
1558 if (idx < section_headers.size())
1559 section_headers.resize(idx);
1560
1561 const unsigned strtab_idx = header.e_shstrndx;
1562 if (strtab_idx && strtab_idx < section_headers.size()) {
1563 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1564 const size_t byte_size = sheader.sh_size;
1565 const Elf64_Off offset = sheader.sh_offset;
1566 lldb_private::DataExtractor shstr_data;
1567
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001568 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001569 for (SectionHeaderCollIter I = section_headers.begin();
1570 I != section_headers.end(); ++I) {
1571 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink");
1572 const ELFSectionHeaderInfo &sheader = *I;
1573 const uint64_t section_size =
1574 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1575 ConstString name(shstr_data.PeekCStr(I->sh_name));
1576
1577 I->section_name = name;
1578
1579 if (arch_spec.IsMIPS()) {
1580 uint32_t arch_flags = arch_spec.GetFlags();
1581 DataExtractor data;
1582 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) {
1583
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001584 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1585 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001586 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1587 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1588 arch_flags |= data.GetU32(&offset);
1589
1590 // The floating point ABI is at offset 7
1591 offset = 7;
1592 switch (data.GetU8(&offset)) {
1593 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY:
1594 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1595 break;
1596 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
1597 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1598 break;
1599 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE:
1600 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1601 break;
1602 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT:
1603 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1604 break;
1605 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64:
1606 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1607 break;
1608 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX:
1609 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1610 break;
1611 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64:
1612 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1613 break;
1614 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A:
1615 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1616 break;
1617 }
1618 }
1619 }
1620 // Settings appropriate ArchSpec ABI Flags
1621 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) {
1622 case llvm::ELF::EF_MIPS_ABI_O32:
1623 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1624 break;
1625 case EF_MIPS_ABI_O64:
1626 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1627 break;
1628 case EF_MIPS_ABI_EABI32:
1629 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1630 break;
1631 case EF_MIPS_ABI_EABI64:
1632 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1633 break;
1634 default:
1635 // ABI Mask doesn't cover N32 and N64 ABI.
1636 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1637 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
Mehdi Aminid16a6e32017-06-23 18:20:13 +00001638 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001639 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1640 break;
1641 }
1642 arch_spec.SetFlags(arch_flags);
1643 }
1644
1645 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1646 arch_spec.GetMachine() == llvm::Triple::thumb) {
1647 DataExtractor data;
1648
1649 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001650 data.SetData(object_data, sheader.sh_offset, section_size) == section_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001651 ParseARMAttributes(data, section_size, arch_spec);
1652 }
1653
1654 if (name == g_sect_name_gnu_debuglink) {
1655 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001656 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1657 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001658 lldb::offset_t gnu_debuglink_offset = 0;
1659 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset);
1660 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
1661 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1662 }
1663 }
1664
1665 // Process ELF note section entries.
1666 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1667
1668 // The section header ".note.android.ident" is stored as a
1669 // PROGBITS type header but it is actually a note header.
1670 static ConstString g_sect_name_android_ident(".note.android.ident");
1671 if (!is_note_header && name == g_sect_name_android_ident)
1672 is_note_header = true;
1673
1674 if (is_note_header) {
1675 // Allow notes to refine module info.
1676 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001677 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1678 section_size) == section_size)) {
Zachary Turner97206d52017-05-12 04:51:55 +00001679 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001680 if (error.Fail()) {
1681 if (log)
1682 log->Printf("ObjectFileELF::%s ELF note processing failed: %s",
1683 __FUNCTION__, error.AsCString());
1684 }
1685 }
1686 }
1687 }
1688
1689 // Make any unknown triple components to be unspecified unknowns.
1690 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1691 arch_spec.GetTriple().setVendorName(llvm::StringRef());
1692 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1693 arch_spec.GetTriple().setOSName(llvm::StringRef());
1694
1695 return section_headers.size();
1696 }
1697 }
1698
1699 section_headers.clear();
1700 return 0;
Michael Sartaina7499c92013-07-01 19:45:50 +00001701}
1702
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001703llvm::StringRef
Kate Stoneb9c1b512016-09-06 20:57:50 +00001704ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1705 size_t pos = symbol_name.find('@');
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001706 return symbol_name.substr(0, pos);
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001707}
1708
Michael Sartaina7499c92013-07-01 19:45:50 +00001709//----------------------------------------------------------------------
1710// ParseSectionHeaders
1711//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001712size_t ObjectFileELF::ParseSectionHeaders() {
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001713 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid,
1714 m_gnu_debuglink_file, m_gnu_debuglink_crc,
1715 m_arch_spec);
Michael Sartaina7499c92013-07-01 19:45:50 +00001716}
1717
Michael Sartaina7499c92013-07-01 19:45:50 +00001718const ObjectFileELF::ELFSectionHeaderInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001719ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001720 if (!ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001721 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001722
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001723 if (id < m_section_headers.size())
Kate Stoneb9c1b512016-09-06 20:57:50 +00001724 return &m_section_headers[id];
1725
1726 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00001727}
1728
Kate Stoneb9c1b512016-09-06 20:57:50 +00001729lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) {
1730 if (!name || !name[0] || !ParseSectionHeaders())
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001731 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001732 for (size_t i = 1; i < m_section_headers.size(); ++i)
1733 if (m_section_headers[i].section_name == ConstString(name))
1734 return i;
1735 return 0;
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001736}
1737
Pavel Labath62a82542018-12-15 13:45:38 +00001738static SectionType GetSectionTypeFromName(llvm::StringRef Name) {
Pavel Labathef8683a2018-12-12 15:46:18 +00001739 return llvm::StringSwitch<SectionType>(Name)
1740 .Case(".ARM.exidx", eSectionTypeARMexidx)
1741 .Case(".ARM.extab", eSectionTypeARMextab)
1742 .Cases(".bss", ".tbss", eSectionTypeZeroFill)
1743 .Cases(".data", ".tdata", eSectionTypeData)
1744 .Case(".debug_abbrev", eSectionTypeDWARFDebugAbbrev)
1745 .Case(".debug_abbrev.dwo", eSectionTypeDWARFDebugAbbrevDwo)
1746 .Case(".debug_addr", eSectionTypeDWARFDebugAddr)
1747 .Case(".debug_aranges", eSectionTypeDWARFDebugAranges)
1748 .Case(".debug_cu_index", eSectionTypeDWARFDebugCuIndex)
1749 .Case(".debug_frame", eSectionTypeDWARFDebugFrame)
1750 .Case(".debug_info", eSectionTypeDWARFDebugInfo)
1751 .Case(".debug_info.dwo", eSectionTypeDWARFDebugInfoDwo)
1752 .Cases(".debug_line", ".debug_line.dwo", eSectionTypeDWARFDebugLine)
1753 .Cases(".debug_line_str", ".debug_line_str.dwo",
1754 eSectionTypeDWARFDebugLineStr)
1755 .Cases(".debug_loc", ".debug_loc.dwo", eSectionTypeDWARFDebugLoc)
1756 .Cases(".debug_loclists", ".debug_loclists.dwo",
1757 eSectionTypeDWARFDebugLocLists)
1758 .Case(".debug_macinfo", eSectionTypeDWARFDebugMacInfo)
1759 .Cases(".debug_macro", ".debug_macro.dwo", eSectionTypeDWARFDebugMacro)
1760 .Case(".debug_names", eSectionTypeDWARFDebugNames)
1761 .Case(".debug_pubnames", eSectionTypeDWARFDebugPubNames)
1762 .Case(".debug_pubtypes", eSectionTypeDWARFDebugPubTypes)
1763 .Case(".debug_ranges", eSectionTypeDWARFDebugRanges)
1764 .Case(".debug_rnglists", eSectionTypeDWARFDebugRngLists)
1765 .Case(".debug_str", eSectionTypeDWARFDebugStr)
1766 .Case(".debug_str.dwo", eSectionTypeDWARFDebugStrDwo)
1767 .Case(".debug_str_offsets", eSectionTypeDWARFDebugStrOffsets)
1768 .Case(".debug_str_offsets.dwo", eSectionTypeDWARFDebugStrOffsetsDwo)
1769 .Case(".debug_types", eSectionTypeDWARFDebugTypes)
1770 .Case(".eh_frame", eSectionTypeEHFrame)
1771 .Case(".gnu_debugaltlink", eSectionTypeDWARFGNUDebugAltLink)
1772 .Case(".gosymtab", eSectionTypeGoSymtab)
1773 .Case(".text", eSectionTypeCode)
1774 .Default(eSectionTypeOther);
1775}
1776
Pavel Labath62a82542018-12-15 13:45:38 +00001777SectionType ObjectFileELF::GetSectionType(const ELFSectionHeaderInfo &H) const {
1778 switch (H.sh_type) {
1779 case SHT_PROGBITS:
1780 if (H.sh_flags & SHF_EXECINSTR)
1781 return eSectionTypeCode;
1782 break;
1783 case SHT_SYMTAB:
1784 return eSectionTypeELFSymbolTable;
1785 case SHT_DYNSYM:
1786 return eSectionTypeELFDynamicSymbols;
1787 case SHT_RELA:
1788 case SHT_REL:
1789 return eSectionTypeELFRelocationEntries;
1790 case SHT_DYNAMIC:
1791 return eSectionTypeELFDynamicLinkInfo;
1792 }
1793 SectionType Type = GetSectionTypeFromName(H.section_name.GetStringRef());
1794 if (Type == eSectionTypeOther) {
1795 // the kalimba toolchain assumes that ELF section names are free-form.
1796 // It does support linkscripts which (can) give rise to various
1797 // arbitrarily named sections being "Code" or "Data".
1798 Type = kalimbaSectionType(m_header, H);
1799 }
1800 return Type;
1801}
1802
1803static uint32_t GetTargetByteSize(SectionType Type, const ArchSpec &arch) {
1804 switch (Type) {
1805 case eSectionTypeData:
1806 case eSectionTypeZeroFill:
1807 return arch.GetDataByteSize();
1808 case eSectionTypeCode:
1809 return arch.GetCodeByteSize();
1810 default:
1811 return 1;
1812 }
1813}
1814
1815static Permissions GetPermissions(const ELFSectionHeader &H) {
1816 Permissions Perm = Permissions(0);
1817 if (H.sh_flags & SHF_ALLOC)
1818 Perm |= ePermissionsReadable;
1819 if (H.sh_flags & SHF_WRITE)
1820 Perm |= ePermissionsWritable;
1821 if (H.sh_flags & SHF_EXECINSTR)
1822 Perm |= ePermissionsExecutable;
1823 return Perm;
1824}
1825
1826namespace {
1827// (Unlinked) ELF object files usually have 0 for every section address, meaning
1828// we need to compute synthetic addresses in order for "file addresses" from
1829// different sections to not overlap. This class handles that logic.
1830class VMAddressProvider {
1831 bool m_synthesizing;
1832 addr_t m_next;
1833
1834public:
1835 VMAddressProvider(ObjectFile::Type Type)
1836 : m_synthesizing(Type == ObjectFile::Type::eTypeObjectFile), m_next(0) {}
1837
1838 std::pair<addr_t, addr_t> GetAddressAndSize(const ELFSectionHeader &H) {
1839 addr_t address = H.sh_addr;
1840 addr_t size = H.sh_flags & SHF_ALLOC ? H.sh_size : 0;
1841 if (m_synthesizing && (H.sh_flags & SHF_ALLOC)) {
1842 m_next = llvm::alignTo(m_next, std::max<addr_t>(H.sh_addralign, 1));
1843 address = m_next;
1844 m_next += size;
1845 }
1846 return {address, size};
1847 }
1848};
1849}
1850
Kate Stoneb9c1b512016-09-06 20:57:50 +00001851void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
1852 if (!m_sections_ap.get() && ParseSectionHeaders()) {
1853 m_sections_ap.reset(new SectionList());
Andrew MacPherson17220c12014-03-05 10:12:43 +00001854
Pavel Labath62a82542018-12-15 13:45:38 +00001855 VMAddressProvider address_provider(CalculateType());
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001856 for (SectionHeaderCollIter I = std::next(m_section_headers.begin());
Kate Stoneb9c1b512016-09-06 20:57:50 +00001857 I != m_section_headers.end(); ++I) {
1858 const ELFSectionHeaderInfo &header = *I;
1859
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001860 ConstString &name = I->section_name;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001861 const uint64_t file_size =
1862 header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001863
Pavel Labath62a82542018-12-15 13:45:38 +00001864 addr_t vm_addr, vm_size;
1865 std::tie(vm_addr, vm_size) = address_provider.GetAddressAndSize(header);
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001866
Pavel Labath62a82542018-12-15 13:45:38 +00001867 SectionType sect_type = GetSectionType(header);
Pavel Labathedb01272018-04-30 13:23:47 +00001868
Kate Stoneb9c1b512016-09-06 20:57:50 +00001869 const uint32_t target_bytes_size =
Pavel Labath62a82542018-12-15 13:45:38 +00001870 GetTargetByteSize(sect_type, m_arch_spec);
1871
Kate Stoneb9c1b512016-09-06 20:57:50 +00001872 elf::elf_xword log2align =
1873 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign);
Ed Masted13f6912017-10-02 14:35:07 +00001874
Kate Stoneb9c1b512016-09-06 20:57:50 +00001875 SectionSP section_sp(new Section(
1876 GetModule(), // Module to which this section belongs.
1877 this, // ObjectFile to which this section belongs and should read
1878 // section data from.
1879 SectionIndex(I), // Section ID.
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001880 name, // Section name.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001881 sect_type, // Section type.
Pavel Labath62a82542018-12-15 13:45:38 +00001882 vm_addr, // VM address.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001883 vm_size, // VM size in bytes of this section.
1884 header.sh_offset, // Offset of this section in the file.
1885 file_size, // Size of the section as found in the file.
1886 log2align, // Alignment of the section
1887 header.sh_flags, // Flags for this section.
1888 target_bytes_size)); // Number of host bytes per target byte
1889
Pavel Labath62a82542018-12-15 13:45:38 +00001890 section_sp->SetPermissions(GetPermissions(header));
1891 section_sp->SetIsThreadSpecific(header.sh_flags & SHF_TLS);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001892 m_sections_ap->AddSection(section_sp);
Andrew MacPherson17220c12014-03-05 10:12:43 +00001893 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001894 }
1895
Pavel Labath3ef4eeb2018-03-09 12:30:09 +00001896 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the
1897 // unified section list.
1898 if (GetType() != eTypeDebugInfo)
1899 unified_section_list = *m_sections_ap;
Greg Clayton3046e662013-07-10 01:23:25 +00001900}
1901
Kate Stoneb9c1b512016-09-06 20:57:50 +00001902// Find the arm/aarch64 mapping symbol character in the given symbol name.
Adrian Prantl05097242018-04-30 16:49:04 +00001903// Mapping symbols have the form of "$<char>[.<any>]*". Additionally we
1904// recognize cases when the mapping symbol prefixed by an arbitrary string
1905// because if a symbol prefix added to each symbol in the object file with
Kate Stoneb9c1b512016-09-06 20:57:50 +00001906// objcopy then the mapping symbols are also prefixed.
1907static char FindArmAarch64MappingSymbol(const char *symbol_name) {
1908 if (!symbol_name)
1909 return '\0';
1910
1911 const char *dollar_pos = ::strchr(symbol_name, '$');
1912 if (!dollar_pos || dollar_pos[1] == '\0')
1913 return '\0';
1914
1915 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
1916 return dollar_pos[1];
1917 return '\0';
1918}
1919
1920#define STO_MIPS_ISA (3 << 6)
1921#define STO_MICROMIPS (2 << 6)
1922#define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
1923
1924// private
1925unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
1926 SectionList *section_list,
1927 const size_t num_symbols,
1928 const DataExtractor &symtab_data,
1929 const DataExtractor &strtab_data) {
1930 ELFSymbol symbol;
1931 lldb::offset_t offset = 0;
1932
1933 static ConstString text_section_name(".text");
1934 static ConstString init_section_name(".init");
1935 static ConstString fini_section_name(".fini");
1936 static ConstString ctors_section_name(".ctors");
1937 static ConstString dtors_section_name(".dtors");
1938
1939 static ConstString data_section_name(".data");
1940 static ConstString rodata_section_name(".rodata");
1941 static ConstString rodata1_section_name(".rodata1");
1942 static ConstString data2_section_name(".data1");
1943 static ConstString bss_section_name(".bss");
1944 static ConstString opd_section_name(".opd"); // For ppc64
1945
1946 // On Android the oatdata and the oatexec symbols in the oat and odex files
Adrian Prantl05097242018-04-30 16:49:04 +00001947 // covers the full .text section what causes issues with displaying unusable
1948 // symbol name to the user and very slow unwinding speed because the
1949 // instruction emulation based unwind plans try to emulate all instructions
1950 // in these symbols. Don't add these symbols to the symbol list as they have
1951 // no use for the debugger and they are causing a lot of trouble. Filtering
1952 // can't be restricted to Android because this special object file don't
1953 // contain the note section specifying the environment to Android but the
1954 // custom extension and file name makes it highly unlikely that this will
1955 // collide with anything else.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001956 ConstString file_extension = m_file.GetFileNameExtension();
Jonas Devliegheread8d48f2018-06-13 16:23:21 +00001957 bool skip_oatdata_oatexec = file_extension == ConstString(".oat") ||
1958 file_extension == ConstString(".odex");
Kate Stoneb9c1b512016-09-06 20:57:50 +00001959
1960 ArchSpec arch;
1961 GetArchitecture(arch);
1962 ModuleSP module_sp(GetModule());
1963 SectionList *module_section_list =
1964 module_sp ? module_sp->GetSectionList() : nullptr;
1965
1966 // Local cache to avoid doing a FindSectionByName for each symbol. The "const
Adrian Prantl05097242018-04-30 16:49:04 +00001967 // char*" key must came from a ConstString object so they can be compared by
1968 // pointer
Kate Stoneb9c1b512016-09-06 20:57:50 +00001969 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
1970
1971 unsigned i;
1972 for (i = 0; i < num_symbols; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00001973 if (!symbol.Parse(symtab_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00001974 break;
1975
1976 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
1977 if (!symbol_name)
1978 symbol_name = "";
1979
1980 // No need to add non-section symbols that have no names
1981 if (symbol.getType() != STT_SECTION &&
1982 (symbol_name == nullptr || symbol_name[0] == '\0'))
1983 continue;
1984
1985 // Skipping oatdata and oatexec sections if it is requested. See details
Adrian Prantl05097242018-04-30 16:49:04 +00001986 // above the definition of skip_oatdata_oatexec for the reasons.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001987 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
1988 ::strcmp(symbol_name, "oatexec") == 0))
1989 continue;
1990
1991 SectionSP symbol_section_sp;
1992 SymbolType symbol_type = eSymbolTypeInvalid;
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001993 Elf64_Half shndx = symbol.st_shndx;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001994
Pavel Labath0d38e4f2018-12-18 15:56:45 +00001995 switch (shndx) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001996 case SHN_ABS:
1997 symbol_type = eSymbolTypeAbsolute;
1998 break;
1999 case SHN_UNDEF:
2000 symbol_type = eSymbolTypeUndefined;
2001 break;
2002 default:
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002003 symbol_section_sp = section_list->FindSectionByID(shndx);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002004 break;
2005 }
2006
2007 // If a symbol is undefined do not process it further even if it has a STT
2008 // type
2009 if (symbol_type != eSymbolTypeUndefined) {
2010 switch (symbol.getType()) {
2011 default:
2012 case STT_NOTYPE:
2013 // The symbol's type is not specified.
2014 break;
2015
2016 case STT_OBJECT:
Adrian Prantl05097242018-04-30 16:49:04 +00002017 // The symbol is associated with a data object, such as a variable, an
2018 // array, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002019 symbol_type = eSymbolTypeData;
2020 break;
2021
2022 case STT_FUNC:
2023 // The symbol is associated with a function or other executable code.
2024 symbol_type = eSymbolTypeCode;
2025 break;
2026
2027 case STT_SECTION:
2028 // The symbol is associated with a section. Symbol table entries of
Adrian Prantl05097242018-04-30 16:49:04 +00002029 // this type exist primarily for relocation and normally have STB_LOCAL
2030 // binding.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002031 break;
2032
2033 case STT_FILE:
Adrian Prantl05097242018-04-30 16:49:04 +00002034 // Conventionally, the symbol's name gives the name of the source file
2035 // associated with the object file. A file symbol has STB_LOCAL
Kate Stoneb9c1b512016-09-06 20:57:50 +00002036 // binding, its section index is SHN_ABS, and it precedes the other
2037 // STB_LOCAL symbols for the file, if it is present.
2038 symbol_type = eSymbolTypeSourceFile;
2039 break;
2040
2041 case STT_GNU_IFUNC:
2042 // The symbol is associated with an indirect function. The actual
2043 // function will be resolved if it is referenced.
2044 symbol_type = eSymbolTypeResolver;
2045 break;
2046 }
2047 }
2048
2049 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) {
2050 if (symbol_section_sp) {
2051 const ConstString &sect_name = symbol_section_sp->GetName();
2052 if (sect_name == text_section_name || sect_name == init_section_name ||
2053 sect_name == fini_section_name || sect_name == ctors_section_name ||
2054 sect_name == dtors_section_name) {
2055 symbol_type = eSymbolTypeCode;
2056 } else if (sect_name == data_section_name ||
2057 sect_name == data2_section_name ||
2058 sect_name == rodata_section_name ||
2059 sect_name == rodata1_section_name ||
2060 sect_name == bss_section_name) {
2061 symbol_type = eSymbolTypeData;
2062 }
2063 }
2064 }
2065
2066 int64_t symbol_value_offset = 0;
2067 uint32_t additional_flags = 0;
2068
2069 if (arch.IsValid()) {
2070 if (arch.GetMachine() == llvm::Triple::arm) {
2071 if (symbol.getBinding() == STB_LOCAL) {
2072 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2073 if (symbol_type == eSymbolTypeCode) {
2074 switch (mapping_symbol) {
2075 case 'a':
2076 // $a[.<any>]* - marks an ARM instruction sequence
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002077 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002078 break;
2079 case 'b':
2080 case 't':
2081 // $b[.<any>]* - marks a THUMB BL instruction sequence
2082 // $t[.<any>]* - marks a THUMB instruction sequence
2083 m_address_class_map[symbol.st_value] =
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002084 AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002085 break;
2086 case 'd':
2087 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002088 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002089 break;
2090 }
2091 }
2092 if (mapping_symbol)
2093 continue;
2094 }
2095 } else if (arch.GetMachine() == llvm::Triple::aarch64) {
2096 if (symbol.getBinding() == STB_LOCAL) {
2097 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2098 if (symbol_type == eSymbolTypeCode) {
2099 switch (mapping_symbol) {
2100 case 'x':
2101 // $x[.<any>]* - marks an A64 instruction sequence
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002102 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002103 break;
2104 case 'd':
2105 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002106 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002107 break;
2108 }
2109 }
2110 if (mapping_symbol)
2111 continue;
2112 }
2113 }
2114
2115 if (arch.GetMachine() == llvm::Triple::arm) {
2116 if (symbol_type == eSymbolTypeCode) {
2117 if (symbol.st_value & 1) {
Adrian Prantl05097242018-04-30 16:49:04 +00002118 // Subtracting 1 from the address effectively unsets the low order
2119 // bit, which results in the address actually pointing to the
2120 // beginning of the symbol. This delta will be used below in
2121 // conjunction with symbol.st_value to produce the final
2122 // symbol_value that we store in the symtab.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002123 symbol_value_offset = -1;
2124 m_address_class_map[symbol.st_value ^ 1] =
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002125 AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002126 } else {
2127 // This address is ARM
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002128 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002129 }
2130 }
2131 }
2132
2133 /*
2134 * MIPS:
2135 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for
2136 * MIPS).
2137 * This allows processor to switch between microMIPS and MIPS without any
2138 * need
2139 * for special mode-control register. However, apart from .debug_line,
2140 * none of
2141 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use
2142 * st_other
2143 * flag to check whether the symbol is microMIPS and then set the address
2144 * class
2145 * accordingly.
2146 */
2147 const llvm::Triple::ArchType llvm_arch = arch.GetMachine();
2148 if (llvm_arch == llvm::Triple::mips ||
2149 llvm_arch == llvm::Triple::mipsel ||
2150 llvm_arch == llvm::Triple::mips64 ||
2151 llvm_arch == llvm::Triple::mips64el) {
2152 if (IS_MICROMIPS(symbol.st_other))
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002153 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002154 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
2155 symbol.st_value = symbol.st_value & (~1ull);
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002156 m_address_class_map[symbol.st_value] = AddressClass::eCodeAlternateISA;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002157 } else {
2158 if (symbol_type == eSymbolTypeCode)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002159 m_address_class_map[symbol.st_value] = AddressClass::eCode;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002160 else if (symbol_type == eSymbolTypeData)
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002161 m_address_class_map[symbol.st_value] = AddressClass::eData;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002162 else
Tatyana Krasnukha04803b32018-06-26 13:06:54 +00002163 m_address_class_map[symbol.st_value] = AddressClass::eUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002164 }
2165 }
2166 }
2167
2168 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
Adrian Prantl05097242018-04-30 16:49:04 +00002169 // symbols. See above for more details.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002170 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2171
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002172 if (symbol_section_sp == nullptr && shndx == SHN_ABS &&
Kate Stoneb9c1b512016-09-06 20:57:50 +00002173 symbol.st_size != 0) {
2174 // We don't have a section for a symbol with non-zero size. Create a new
Adrian Prantl05097242018-04-30 16:49:04 +00002175 // section for it so the address range covered by the symbol is also
2176 // covered by the module (represented through the section list). It is
2177 // needed so module lookup for the addresses covered by this symbol will
2178 // be successfull. This case happens for absolute symbols.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002179 ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2180 symbol_section_sp =
2181 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
2182 eSectionTypeAbsoluteAddress, symbol_value,
2183 symbol.st_size, 0, 0, 0, SHF_ALLOC);
2184
2185 module_section_list->AddSection(symbol_section_sp);
2186 section_list->AddSection(symbol_section_sp);
2187 }
2188
2189 if (symbol_section_sp &&
2190 CalculateType() != ObjectFile::Type::eTypeObjectFile)
2191 symbol_value -= symbol_section_sp->GetFileAddress();
2192
2193 if (symbol_section_sp && module_section_list &&
2194 module_section_list != section_list) {
2195 const ConstString &sect_name = symbol_section_sp->GetName();
2196 auto section_it = section_name_to_section.find(sect_name.GetCString());
2197 if (section_it == section_name_to_section.end())
2198 section_it =
2199 section_name_to_section
2200 .emplace(sect_name.GetCString(),
2201 module_section_list->FindSectionByName(sect_name))
2202 .first;
Pavel Labathefddda3d2017-05-02 12:40:31 +00002203 if (section_it->second)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002204 symbol_section_sp = section_it->second;
2205 }
2206
2207 bool is_global = symbol.getBinding() == STB_GLOBAL;
2208 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2209 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z');
2210
2211 llvm::StringRef symbol_ref(symbol_name);
2212
2213 // Symbol names may contain @VERSION suffixes. Find those and strip them
2214 // temporarily.
2215 size_t version_pos = symbol_ref.find('@');
2216 bool has_suffix = version_pos != llvm::StringRef::npos;
2217 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2218 Mangled mangled(ConstString(symbol_bare), is_mangled);
2219
2220 // Now append the suffix back to mangled and unmangled names. Only do it if
Adrian Prantl05097242018-04-30 16:49:04 +00002221 // the demangling was successful (string is not empty).
Kate Stoneb9c1b512016-09-06 20:57:50 +00002222 if (has_suffix) {
2223 llvm::StringRef suffix = symbol_ref.substr(version_pos);
2224
2225 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2226 if (!mangled_name.empty())
2227 mangled.SetMangledName(ConstString((mangled_name + suffix).str()));
2228
2229 ConstString demangled =
2230 mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2231 llvm::StringRef demangled_name = demangled.GetStringRef();
2232 if (!demangled_name.empty())
2233 mangled.SetDemangledName(ConstString((demangled_name + suffix).str()));
2234 }
2235
2236 // In ELF all symbol should have a valid size but it is not true for some
Adrian Prantl05097242018-04-30 16:49:04 +00002237 // function symbols coming from hand written assembly. As none of the
2238 // function symbol should have 0 size we try to calculate the size for
2239 // these symbols in the symtab with saying that their original size is not
2240 // valid.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002241 bool symbol_size_valid =
2242 symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2243
2244 Symbol dc_symbol(
2245 i + start_id, // ID is the original symbol table index.
2246 mangled,
2247 symbol_type, // Type of this symbol
2248 is_global, // Is this globally visible?
2249 false, // Is this symbol debug info?
2250 false, // Is this symbol a trampoline?
2251 false, // Is this symbol artificial?
2252 AddressRange(symbol_section_sp, // Section in which this symbol is
2253 // defined or null.
2254 symbol_value, // Offset in section or symbol value.
2255 symbol.st_size), // Size in bytes of this symbol.
2256 symbol_size_valid, // Symbol size is valid
2257 has_suffix, // Contains linker annotations?
2258 flags); // Symbol flags.
2259 symtab->AddSymbol(dc_symbol);
2260 }
2261 return i;
2262}
2263
2264unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2265 user_id_t start_id,
2266 lldb_private::Section *symtab) {
2267 if (symtab->GetObjectFile() != this) {
2268 // If the symbol table section is owned by a different object file, have it
Adrian Prantl05097242018-04-30 16:49:04 +00002269 // do the parsing.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002270 ObjectFileELF *obj_file_elf =
2271 static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2272 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
2273 }
2274
2275 // Get section list for this object file.
2276 SectionList *section_list = m_sections_ap.get();
2277 if (!section_list)
2278 return 0;
2279
2280 user_id_t symtab_id = symtab->GetID();
2281 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2282 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2283 symtab_hdr->sh_type == SHT_DYNSYM);
2284
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002285 // sh_link: section header index of associated string table.
2286 user_id_t strtab_id = symtab_hdr->sh_link;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002287 Section *strtab = section_list->FindSectionByID(strtab_id).get();
2288
2289 if (symtab && strtab) {
2290 assert(symtab->GetObjectFile() == this);
2291 assert(strtab->GetObjectFile() == this);
2292
2293 DataExtractor symtab_data;
2294 DataExtractor strtab_data;
2295 if (ReadSectionData(symtab, symtab_data) &&
2296 ReadSectionData(strtab, strtab_data)) {
2297 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2298
2299 return ParseSymbols(symbol_table, start_id, section_list, num_symbols,
2300 symtab_data, strtab_data);
2301 }
2302 }
2303
2304 return 0;
2305}
2306
2307size_t ObjectFileELF::ParseDynamicSymbols() {
2308 if (m_dynamic_symbols.size())
2309 return m_dynamic_symbols.size();
2310
2311 SectionList *section_list = GetSectionList();
2312 if (!section_list)
2313 return 0;
2314
2315 // Find the SHT_DYNAMIC section.
2316 Section *dynsym =
2317 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
2318 .get();
2319 if (!dynsym)
2320 return 0;
2321 assert(dynsym->GetObjectFile() == this);
2322
2323 ELFDynamic symbol;
2324 DataExtractor dynsym_data;
2325 if (ReadSectionData(dynsym, dynsym_data)) {
2326 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2327 lldb::offset_t cursor = 0;
2328
2329 while (cursor < section_size) {
2330 if (!symbol.Parse(dynsym_data, &cursor))
2331 break;
2332
2333 m_dynamic_symbols.push_back(symbol);
2334 }
2335 }
2336
2337 return m_dynamic_symbols.size();
2338}
2339
2340const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) {
2341 if (!ParseDynamicSymbols())
2342 return NULL;
2343
2344 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2345 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2346 for (; I != E; ++I) {
2347 ELFDynamic *symbol = &*I;
2348
2349 if (symbol->d_tag == tag)
2350 return symbol;
2351 }
2352
2353 return NULL;
2354}
2355
2356unsigned ObjectFileELF::PLTRelocationType() {
2357 // DT_PLTREL
2358 // This member specifies the type of relocation entry to which the
2359 // procedure linkage table refers. The d_val member holds DT_REL or
2360 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2361 // must use the same relocation.
2362 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2363
2364 if (symbol)
2365 return symbol->d_val;
2366
2367 return 0;
2368}
2369
Adrian Prantl05097242018-04-30 16:49:04 +00002370// Returns the size of the normal plt entries and the offset of the first
2371// normal plt entry. The 0th entry in the plt table is usually a resolution
2372// entry which have different size in some architectures then the rest of the
2373// plt entries.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002374static std::pair<uint64_t, uint64_t>
2375GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
2376 const ELFSectionHeader *plt_hdr) {
2377 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2378
Adrian Prantl05097242018-04-30 16:49:04 +00002379 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are
2380 // 16 bytes. So round the entsize up by the alignment if addralign is set.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002381 elf_xword plt_entsize =
2382 plt_hdr->sh_addralign
2383 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
2384 : plt_hdr->sh_entsize;
2385
2386 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2387 // PLT entries relocation code in general requires multiple instruction and
2388 // should be greater than 4 bytes in most cases. Try to guess correct size
2389 // just in case.
2390 if (plt_entsize <= 4) {
2391 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
Adrian Prantl05097242018-04-30 16:49:04 +00002392 // size of the plt entries based on the number of entries and the size of
2393 // the plt section with the assumption that the size of the 0th entry is at
2394 // least as big as the size of the normal entries and it isn't much bigger
2395 // then that.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002396 if (plt_hdr->sh_addralign)
2397 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
2398 (num_relocations + 1) * plt_hdr->sh_addralign;
2399 else
2400 plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2401 }
2402
2403 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2404
2405 return std::make_pair(plt_entsize, plt_offset);
2406}
2407
2408static unsigned ParsePLTRelocations(
2409 Symtab *symbol_table, user_id_t start_id, unsigned rel_type,
2410 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2411 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr,
2412 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data,
2413 DataExtractor &symtab_data, DataExtractor &strtab_data) {
2414 ELFRelocation rel(rel_type);
2415 ELFSymbol symbol;
2416 lldb::offset_t offset = 0;
2417
2418 uint64_t plt_offset, plt_entsize;
2419 std::tie(plt_entsize, plt_offset) =
2420 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2421 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2422
2423 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2424 reloc_info_fn reloc_type;
2425 reloc_info_fn reloc_symbol;
2426
2427 if (hdr->Is32Bit()) {
2428 reloc_type = ELFRelocation::RelocType32;
2429 reloc_symbol = ELFRelocation::RelocSymbol32;
2430 } else {
2431 reloc_type = ELFRelocation::RelocType64;
2432 reloc_symbol = ELFRelocation::RelocSymbol64;
2433 }
2434
2435 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2436 unsigned i;
2437 for (i = 0; i < num_relocations; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00002438 if (!rel.Parse(rel_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002439 break;
2440
2441 if (reloc_type(rel) != slot_type)
2442 continue;
2443
2444 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2445 if (!symbol.Parse(symtab_data, &symbol_offset))
2446 break;
2447
2448 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2449 bool is_mangled =
2450 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2451 uint64_t plt_index = plt_offset + i * plt_entsize;
2452
2453 Symbol jump_symbol(
2454 i + start_id, // Symbol table index
2455 symbol_name, // symbol name.
2456 is_mangled, // is the symbol name mangled?
2457 eSymbolTypeTrampoline, // Type of this symbol
2458 false, // Is this globally visible?
2459 false, // Is this symbol debug info?
2460 true, // Is this symbol a trampoline?
2461 true, // Is this symbol artificial?
2462 plt_section_sp, // Section in which this symbol is defined or null.
2463 plt_index, // Offset in section or symbol value.
2464 plt_entsize, // Size in bytes of this symbol.
2465 true, // Size is valid
2466 false, // Contains linker annotations?
2467 0); // Symbol flags.
2468
2469 symbol_table->AddSymbol(jump_symbol);
2470 }
2471
2472 return i;
2473}
2474
2475unsigned
2476ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id,
2477 const ELFSectionHeaderInfo *rel_hdr,
2478 user_id_t rel_id) {
2479 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2480
2481 // The link field points to the associated symbol table.
2482 user_id_t symtab_id = rel_hdr->sh_link;
2483
2484 // If the link field doesn't point to the appropriate symbol name table then
2485 // try to find it by name as some compiler don't fill in the link fields.
2486 if (!symtab_id)
2487 symtab_id = GetSectionIndexByName(".dynsym");
2488
2489 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers
2490 // point that to the .got.plt or .got section instead of .plt.
2491 user_id_t plt_id = GetSectionIndexByName(".plt");
2492
2493 if (!symtab_id || !plt_id)
2494 return 0;
2495
Kate Stoneb9c1b512016-09-06 20:57:50 +00002496 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2497 if (!plt_hdr)
2498 return 0;
2499
2500 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2501 if (!sym_hdr)
2502 return 0;
2503
2504 SectionList *section_list = m_sections_ap.get();
2505 if (!section_list)
2506 return 0;
2507
2508 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2509 if (!rel_section)
2510 return 0;
2511
2512 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id));
2513 if (!plt_section_sp)
2514 return 0;
2515
2516 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2517 if (!symtab)
2518 return 0;
2519
2520 // sh_link points to associated string table.
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002521 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link).get();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002522 if (!strtab)
2523 return 0;
2524
2525 DataExtractor rel_data;
2526 if (!ReadSectionData(rel_section, rel_data))
2527 return 0;
2528
2529 DataExtractor symtab_data;
2530 if (!ReadSectionData(symtab, symtab_data))
2531 return 0;
2532
2533 DataExtractor strtab_data;
2534 if (!ReadSectionData(strtab, strtab_data))
2535 return 0;
2536
2537 unsigned rel_type = PLTRelocationType();
2538 if (!rel_type)
2539 return 0;
2540
2541 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header,
2542 rel_hdr, plt_hdr, sym_hdr, plt_section_sp,
2543 rel_data, symtab_data, strtab_data);
2544}
2545
Ed Masted13f6912017-10-02 14:35:07 +00002546unsigned ObjectFileELF::ApplyRelocations(
Kate Stoneb9c1b512016-09-06 20:57:50 +00002547 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2548 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2549 DataExtractor &rel_data, DataExtractor &symtab_data,
2550 DataExtractor &debug_data, Section *rel_section) {
2551 ELFRelocation rel(rel_hdr->sh_type);
2552 lldb::addr_t offset = 0;
2553 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2554 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2555 reloc_info_fn reloc_type;
2556 reloc_info_fn reloc_symbol;
2557
2558 if (hdr->Is32Bit()) {
2559 reloc_type = ELFRelocation::RelocType32;
2560 reloc_symbol = ELFRelocation::RelocSymbol32;
2561 } else {
2562 reloc_type = ELFRelocation::RelocType64;
2563 reloc_symbol = ELFRelocation::RelocSymbol64;
2564 }
2565
2566 for (unsigned i = 0; i < num_relocations; ++i) {
Jonas Devliegherea6682a42018-12-15 00:15:33 +00002567 if (!rel.Parse(rel_data, &offset))
Kate Stoneb9c1b512016-09-06 20:57:50 +00002568 break;
2569
2570 Symbol *symbol = NULL;
2571
2572 if (hdr->Is32Bit()) {
2573 switch (reloc_type(rel)) {
2574 case R_386_32:
2575 case R_386_PC32:
2576 default:
Zachary Turnera6d54642017-12-02 00:15:29 +00002577 // FIXME: This asserts with this input:
2578 //
2579 // foo.cpp
2580 // int main(int argc, char **argv) { return 0; }
2581 //
2582 // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o
2583 //
2584 // and running this on the foo.o module.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002585 assert(false && "unexpected relocation type");
2586 }
2587 } else {
2588 switch (reloc_type(rel)) {
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002589 case R_AARCH64_ABS64:
Kate Stoneb9c1b512016-09-06 20:57:50 +00002590 case R_X86_64_64: {
2591 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2592 if (symbol) {
2593 addr_t value = symbol->GetAddressRef().GetFileAddress();
2594 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2595 uint64_t *dst = reinterpret_cast<uint64_t *>(
2596 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2597 ELFRelocation::RelocOffset64(rel));
Davide Italianob37f1ec2018-11-06 17:11:34 +00002598 uint64_t val_offset = value + ELFRelocation::RelocAddend64(rel);
2599 memcpy(dst, &val_offset, sizeof(uint64_t));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002600 }
2601 break;
2602 }
2603 case R_X86_64_32:
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002604 case R_X86_64_32S:
2605 case R_AARCH64_ABS32: {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002606 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2607 if (symbol) {
2608 addr_t value = symbol->GetAddressRef().GetFileAddress();
2609 value += ELFRelocation::RelocAddend32(rel);
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002610 if ((reloc_type(rel) == R_X86_64_32 && (value > UINT32_MAX)) ||
Stephane Sezer0c679b72018-08-06 22:21:28 +00002611 (reloc_type(rel) == R_X86_64_32S &&
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002612 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN)) ||
2613 (reloc_type(rel) == R_AARCH64_ABS32 &&
2614 ((int64_t)value > INT32_MAX && (int64_t)value < INT32_MIN))) {
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002615 Log *log =
2616 lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
2617 log->Printf("Failed to apply debug info relocations");
Nathan Lanza6868d2d2018-11-05 22:18:00 +00002618 break;
Stephane Sezer9e2fe8b2018-08-17 00:35:47 +00002619 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00002620 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2621 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2622 uint32_t *dst = reinterpret_cast<uint32_t *>(
2623 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2624 ELFRelocation::RelocOffset32(rel));
Davide Italianob37f1ec2018-11-06 17:11:34 +00002625 memcpy(dst, &truncated_addr, sizeof(uint32_t));
Kate Stoneb9c1b512016-09-06 20:57:50 +00002626 }
2627 break;
2628 }
2629 case R_X86_64_PC32:
2630 default:
2631 assert(false && "unexpected relocation type");
2632 }
2633 }
2634 }
2635
2636 return 0;
2637}
2638
2639unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
Ed Masted13f6912017-10-02 14:35:07 +00002640 user_id_t rel_id,
2641 lldb_private::Symtab *thetab) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002642 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2643
2644 // Parse in the section list if needed.
2645 SectionList *section_list = GetSectionList();
2646 if (!section_list)
2647 return 0;
2648
Pavel Labath0d38e4f2018-12-18 15:56:45 +00002649 user_id_t symtab_id = rel_hdr->sh_link;
2650 user_id_t debug_id = rel_hdr->sh_info;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002651
2652 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2653 if (!symtab_hdr)
2654 return 0;
2655
2656 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2657 if (!debug_hdr)
2658 return 0;
2659
2660 Section *rel = section_list->FindSectionByID(rel_id).get();
2661 if (!rel)
2662 return 0;
2663
2664 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2665 if (!symtab)
2666 return 0;
2667
2668 Section *debug = section_list->FindSectionByID(debug_id).get();
2669 if (!debug)
2670 return 0;
2671
2672 DataExtractor rel_data;
2673 DataExtractor symtab_data;
2674 DataExtractor debug_data;
2675
Ed Masted13f6912017-10-02 14:35:07 +00002676 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) &&
2677 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) &&
2678 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) {
2679 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr,
2680 rel_data, symtab_data, debug_data, debug);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002681 }
2682
2683 return 0;
2684}
2685
2686Symtab *ObjectFileELF::GetSymtab() {
2687 ModuleSP module_sp(GetModule());
2688 if (!module_sp)
2689 return NULL;
2690
2691 // We always want to use the main object file so we (hopefully) only have one
Adrian Prantl05097242018-04-30 16:49:04 +00002692 // cached copy of our symtab, dynamic sections, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002693 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2694 if (module_obj_file && module_obj_file != this)
2695 return module_obj_file->GetSymtab();
2696
2697 if (m_symtab_ap.get() == NULL) {
2698 SectionList *section_list = module_sp->GetSectionList();
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002699 if (!section_list)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002700 return NULL;
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002701
Kate Stoneb9c1b512016-09-06 20:57:50 +00002702 uint64_t symbol_id = 0;
2703 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002704
Kate Stoneb9c1b512016-09-06 20:57:50 +00002705 // Sharable objects and dynamic executables usually have 2 distinct symbol
2706 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
Adrian Prantl05097242018-04-30 16:49:04 +00002707 // smaller version of the symtab that only contains global symbols. The
2708 // information found in the dynsym is therefore also found in the symtab,
2709 // while the reverse is not necessarily true.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002710 Section *symtab =
2711 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2712 if (!symtab) {
2713 // The symtab section is non-allocable and can be stripped, so if it
Adrian Prantl05097242018-04-30 16:49:04 +00002714 // doesn't exist then use the dynsym section which should always be
2715 // there.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002716 symtab =
2717 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
2718 .get();
2719 }
2720 if (symtab) {
2721 m_symtab_ap.reset(new Symtab(symtab->GetObjectFile()));
2722 symbol_id += ParseSymbolTable(m_symtab_ap.get(), symbol_id, symtab);
2723 }
2724
2725 // DT_JMPREL
2726 // If present, this entry's d_ptr member holds the address of
2727 // relocation
2728 // entries associated solely with the procedure linkage table.
2729 // Separating
2730 // these relocation entries lets the dynamic linker ignore them during
2731 // process initialization, if lazy binding is enabled. If this entry is
2732 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2733 // also be present.
2734 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2735 if (symbol) {
2736 // Synthesize trampoline symbols to help navigate the PLT.
2737 addr_t addr = symbol->d_ptr;
2738 Section *reloc_section =
2739 section_list->FindSectionContainingFileAddress(addr).get();
2740 if (reloc_section) {
2741 user_id_t reloc_id = reloc_section->GetID();
2742 const ELFSectionHeaderInfo *reloc_header =
2743 GetSectionHeaderByIndex(reloc_id);
2744 assert(reloc_header);
2745
2746 if (m_symtab_ap == nullptr)
2747 m_symtab_ap.reset(new Symtab(reloc_section->GetObjectFile()));
2748
2749 ParseTrampolineSymbols(m_symtab_ap.get(), symbol_id, reloc_header,
2750 reloc_id);
2751 }
2752 }
2753
2754 DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo();
2755 if (eh_frame) {
2756 if (m_symtab_ap == nullptr)
2757 m_symtab_ap.reset(new Symtab(this));
2758 ParseUnwindSymbols(m_symtab_ap.get(), eh_frame);
2759 }
2760
2761 // If we still don't have any symtab then create an empty instance to avoid
Adrian Prantl05097242018-04-30 16:49:04 +00002762 // do the section lookup next time.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002763 if (m_symtab_ap == nullptr)
2764 m_symtab_ap.reset(new Symtab(this));
Davide Italiano407c6912018-11-02 21:59:14 +00002765
2766 m_symtab_ap->CalculateSymbolSizes();
Kate Stoneb9c1b512016-09-06 20:57:50 +00002767 }
2768
Ed Masted13f6912017-10-02 14:35:07 +00002769 return m_symtab_ap.get();
2770}
2771
2772void ObjectFileELF::RelocateSection(lldb_private::Section *section)
2773{
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002774 static const char *debug_prefix = ".debug";
Ed Masted13f6912017-10-02 14:35:07 +00002775
Adrian Prantl05097242018-04-30 16:49:04 +00002776 // Set relocated bit so we stop getting called, regardless of whether we
2777 // actually relocate.
Ed Masted13f6912017-10-02 14:35:07 +00002778 section->SetIsRelocated(true);
2779
2780 // We only relocate in ELF relocatable files
2781 if (CalculateType() != eTypeObjectFile)
2782 return;
2783
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002784 const char *section_name = section->GetName().GetCString();
Ed Masted13f6912017-10-02 14:35:07 +00002785 // Can't relocate that which can't be named
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002786 if (section_name == nullptr)
Ed Masted13f6912017-10-02 14:35:07 +00002787 return;
2788
2789 // We don't relocate non-debug sections at the moment
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002790 if (strncmp(section_name, debug_prefix, strlen(debug_prefix)))
Ed Masted13f6912017-10-02 14:35:07 +00002791 return;
2792
2793 // Relocation section names to look for
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002794 std::string needle = std::string(".rel") + section_name;
2795 std::string needlea = std::string(".rela") + section_name;
Ed Masted13f6912017-10-02 14:35:07 +00002796
Kate Stoneb9c1b512016-09-06 20:57:50 +00002797 for (SectionHeaderCollIter I = m_section_headers.begin();
2798 I != m_section_headers.end(); ++I) {
2799 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
Ed Masted13f6912017-10-02 14:35:07 +00002800 const char *hay_name = I->section_name.GetCString();
2801 if (hay_name == nullptr)
2802 continue;
2803 if (needle == hay_name || needlea == hay_name) {
2804 const ELFSectionHeader &reloc_header = *I;
2805 user_id_t reloc_id = SectionIndex(I);
2806 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab());
2807 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002808 }
2809 }
2810 }
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002811}
Tamas Berghammer5bfd4d02016-02-10 12:10:58 +00002812
Kate Stoneb9c1b512016-09-06 20:57:50 +00002813void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
2814 DWARFCallFrameInfo *eh_frame) {
2815 SectionList *section_list = GetSectionList();
2816 if (!section_list)
2817 return;
2818
2819 // First we save the new symbols into a separate list and add them to the
Adrian Prantl05097242018-04-30 16:49:04 +00002820 // symbol table after we colleced all symbols we want to add. This is
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002821 // neccessary because adding a new symbol invalidates the internal index of
Adrian Prantl05097242018-04-30 16:49:04 +00002822 // the symtab what causing the next lookup to be slow because it have to
2823 // recalculate the index first.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002824 std::vector<Symbol> new_symbols;
2825
2826 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
2827 lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
2828 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
2829 if (symbol) {
2830 if (!symbol->GetByteSizeIsValid()) {
2831 symbol->SetByteSize(size);
2832 symbol->SetSizeIsSynthesized(true);
2833 }
2834 } else {
2835 SectionSP section_sp =
2836 section_list->FindSectionContainingFileAddress(file_addr);
2837 if (section_sp) {
2838 addr_t offset = file_addr - section_sp->GetFileAddress();
2839 const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
2840 uint64_t symbol_id = symbol_table->GetNumSymbols();
2841 Symbol eh_symbol(
2842 symbol_id, // Symbol table index.
2843 symbol_name, // Symbol name.
2844 false, // Is the symbol name mangled?
2845 eSymbolTypeCode, // Type of this symbol.
2846 true, // Is this globally visible?
2847 false, // Is this symbol debug info?
2848 false, // Is this symbol a trampoline?
2849 true, // Is this symbol artificial?
2850 section_sp, // Section in which this symbol is defined or null.
2851 offset, // Offset in section or symbol value.
2852 0, // Size: Don't specify the size as an FDE can
2853 false, // Size is valid: cover multiple symbols.
2854 false, // Contains linker annotations?
2855 0); // Symbol flags.
2856 new_symbols.push_back(eh_symbol);
2857 }
2858 }
2859 return true;
2860 });
2861
2862 for (const Symbol &s : new_symbols)
2863 symbol_table->AddSymbol(s);
2864}
2865
2866bool ObjectFileELF::IsStripped() {
2867 // TODO: determine this for ELF
2868 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002869}
2870
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002871//===----------------------------------------------------------------------===//
2872// Dump
2873//
2874// Dump the specifics of the runtime file container (such as any headers
2875// segments, sections, etc).
2876//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00002877void ObjectFileELF::Dump(Stream *s) {
2878 ModuleSP module_sp(GetModule());
2879 if (!module_sp) {
2880 return;
2881 }
Adrian McCarthy543725c2016-04-04 21:21:49 +00002882
Kate Stoneb9c1b512016-09-06 20:57:50 +00002883 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2884 s->Printf("%p: ", static_cast<void *>(this));
2885 s->Indent();
2886 s->PutCString("ObjectFileELF");
Adrian McCarthy543725c2016-04-04 21:21:49 +00002887
Kate Stoneb9c1b512016-09-06 20:57:50 +00002888 ArchSpec header_arch;
2889 GetArchitecture(header_arch);
Adrian McCarthy543725c2016-04-04 21:21:49 +00002890
Kate Stoneb9c1b512016-09-06 20:57:50 +00002891 *s << ", file = '" << m_file
2892 << "', arch = " << header_arch.GetArchitectureName() << "\n";
Adrian McCarthy543725c2016-04-04 21:21:49 +00002893
Kate Stoneb9c1b512016-09-06 20:57:50 +00002894 DumpELFHeader(s, m_header);
2895 s->EOL();
2896 DumpELFProgramHeaders(s);
2897 s->EOL();
2898 DumpELFSectionHeaders(s);
2899 s->EOL();
2900 SectionList *section_list = GetSectionList();
2901 if (section_list)
2902 section_list->Dump(s, NULL, true, UINT32_MAX);
2903 Symtab *symtab = GetSymtab();
2904 if (symtab)
2905 symtab->Dump(s, NULL, eSortOrderNone);
2906 s->EOL();
2907 DumpDependentModules(s);
2908 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002909}
2910
2911//----------------------------------------------------------------------
2912// DumpELFHeader
2913//
2914// Dump the ELF header to the specified output stream
2915//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00002916void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
2917 s->PutCString("ELF Header\n");
2918 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
2919 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
2920 header.e_ident[EI_MAG1]);
2921 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
2922 header.e_ident[EI_MAG2]);
2923 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
2924 header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002925
Kate Stoneb9c1b512016-09-06 20:57:50 +00002926 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
2927 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
2928 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
2929 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
2930 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002931
Kate Stoneb9c1b512016-09-06 20:57:50 +00002932 s->Printf("e_type = 0x%4.4x ", header.e_type);
2933 DumpELFHeader_e_type(s, header.e_type);
2934 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
2935 s->Printf("e_version = 0x%8.8x\n", header.e_version);
2936 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
2937 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
2938 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
2939 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
2940 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
2941 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00002942 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002943 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00002944 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum);
2945 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002946}
2947
2948//----------------------------------------------------------------------
2949// DumpELFHeader_e_type
2950//
2951// Dump an token value for the ELF header member e_type
2952//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00002953void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
2954 switch (e_type) {
2955 case ET_NONE:
2956 *s << "ET_NONE";
2957 break;
2958 case ET_REL:
2959 *s << "ET_REL";
2960 break;
2961 case ET_EXEC:
2962 *s << "ET_EXEC";
2963 break;
2964 case ET_DYN:
2965 *s << "ET_DYN";
2966 break;
2967 case ET_CORE:
2968 *s << "ET_CORE";
2969 break;
2970 default:
2971 break;
2972 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002973}
2974
2975//----------------------------------------------------------------------
2976// DumpELFHeader_e_ident_EI_DATA
2977//
2978// Dump an token value for the ELF header member e_ident[EI_DATA]
2979//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00002980void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
2981 unsigned char ei_data) {
2982 switch (ei_data) {
2983 case ELFDATANONE:
2984 *s << "ELFDATANONE";
2985 break;
2986 case ELFDATA2LSB:
2987 *s << "ELFDATA2LSB - Little Endian";
2988 break;
2989 case ELFDATA2MSB:
2990 *s << "ELFDATA2MSB - Big Endian";
2991 break;
2992 default:
2993 break;
2994 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002995}
2996
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002997//----------------------------------------------------------------------
2998// DumpELFProgramHeader
2999//
3000// Dump a single ELF program header to the specified output stream
3001//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003002void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3003 const ELFProgramHeader &ph) {
3004 DumpELFProgramHeader_p_type(s, ph.p_type);
3005 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3006 ph.p_vaddr, ph.p_paddr);
3007 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3008 ph.p_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003009
Kate Stoneb9c1b512016-09-06 20:57:50 +00003010 DumpELFProgramHeader_p_flags(s, ph.p_flags);
3011 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003012}
3013
3014//----------------------------------------------------------------------
3015// DumpELFProgramHeader_p_type
3016//
Adrian Prantl05097242018-04-30 16:49:04 +00003017// Dump an token value for the ELF program header member p_type which describes
3018// the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003019// ----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003020void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3021 const int kStrWidth = 15;
3022 switch (p_type) {
3023 CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3024 CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3025 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3026 CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3027 CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3028 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3029 CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3030 CASE_AND_STREAM(s, PT_TLS, kStrWidth);
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00003031 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003032 default:
3033 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3034 break;
3035 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003036}
3037
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003038//----------------------------------------------------------------------
3039// DumpELFProgramHeader_p_flags
3040//
3041// Dump an token value for the ELF program header member p_flags
3042//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003043void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3044 *s << ((p_flags & PF_X) ? "PF_X" : " ")
3045 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3046 << ((p_flags & PF_W) ? "PF_W" : " ")
3047 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3048 << ((p_flags & PF_R) ? "PF_R" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003049}
3050
3051//----------------------------------------------------------------------
3052// DumpELFProgramHeaders
3053//
3054// Dump all of the ELF program header to the specified output stream
3055//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003056void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3057 if (!ParseProgramHeaders())
3058 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003059
Kate Stoneb9c1b512016-09-06 20:57:50 +00003060 s->PutCString("Program Headers\n");
3061 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
3062 "p_filesz p_memsz p_flags p_align\n");
3063 s->PutCString("==== --------------- -------- -------- -------- "
3064 "-------- -------- ------------------------- --------\n");
Ed Maste3a8ab6e2015-02-23 15:33:11 +00003065
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003066 for (const auto &H : llvm::enumerate(m_program_headers)) {
3067 s->Format("[{0,2}] ", H.index());
3068 ObjectFileELF::DumpELFProgramHeader(s, H.value());
Kate Stoneb9c1b512016-09-06 20:57:50 +00003069 s->EOL();
3070 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003071}
3072
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003073//----------------------------------------------------------------------
3074// DumpELFSectionHeader
3075//
3076// Dump a single ELF section header to the specified output stream
3077//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003078void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3079 const ELFSectionHeaderInfo &sh) {
3080 s->Printf("%8.8x ", sh.sh_name);
3081 DumpELFSectionHeader_sh_type(s, sh.sh_type);
3082 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3083 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3084 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3085 sh.sh_offset, sh.sh_size);
3086 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3087 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003088}
3089
3090//----------------------------------------------------------------------
3091// DumpELFSectionHeader_sh_type
3092//
3093// Dump an token value for the ELF section header member sh_type which
3094// describes the type of the section
3095//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003096void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3097 const int kStrWidth = 12;
3098 switch (sh_type) {
3099 CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3100 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3101 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3102 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3103 CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3104 CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3105 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3106 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3107 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3108 CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3109 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3110 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3111 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3112 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3113 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3114 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3115 default:
3116 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3117 break;
3118 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003119}
3120
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003121//----------------------------------------------------------------------
3122// DumpELFSectionHeader_sh_flags
3123//
3124// Dump an token value for the ELF section header member sh_flags
3125//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003126void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3127 elf_xword sh_flags) {
3128 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
3129 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3130 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
3131 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3132 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003133}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003134
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003135//----------------------------------------------------------------------
3136// DumpELFSectionHeaders
3137//
3138// Dump all of the ELF section header to the specified output stream
3139//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003140void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3141 if (!ParseSectionHeaders())
3142 return;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003143
Kate Stoneb9c1b512016-09-06 20:57:50 +00003144 s->PutCString("Section Headers\n");
3145 s->PutCString("IDX name type flags "
3146 "addr offset size link info addralgn "
3147 "entsize Name\n");
3148 s->PutCString("==== -------- ------------ -------------------------------- "
3149 "-------- -------- -------- -------- -------- -------- "
3150 "-------- ====================\n");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003151
Kate Stoneb9c1b512016-09-06 20:57:50 +00003152 uint32_t idx = 0;
3153 for (SectionHeaderCollConstIter I = m_section_headers.begin();
3154 I != m_section_headers.end(); ++I, ++idx) {
3155 s->Printf("[%2u] ", idx);
3156 ObjectFileELF::DumpELFSectionHeader(s, *I);
3157 const char *section_name = I->section_name.AsCString("");
3158 if (section_name)
3159 *s << ' ' << section_name << "\n";
3160 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003161}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003162
Kate Stoneb9c1b512016-09-06 20:57:50 +00003163void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3164 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003165
Kate Stoneb9c1b512016-09-06 20:57:50 +00003166 if (num_modules > 0) {
3167 s->PutCString("Dependent Modules:\n");
3168 for (unsigned i = 0; i < num_modules; ++i) {
3169 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
3170 s->Printf(" %s\n", spec.GetFilename().GetCString());
3171 }
3172 }
3173}
3174
3175bool ObjectFileELF::GetArchitecture(ArchSpec &arch) {
3176 if (!ParseHeader())
3177 return false;
3178
3179 if (m_section_headers.empty()) {
3180 // Allow elf notes to be parsed which may affect the detected architecture.
3181 ParseSectionHeaders();
3182 }
3183
3184 if (CalculateType() == eTypeCoreFile &&
3185 m_arch_spec.TripleOSIsUnspecifiedUnknown()) {
3186 // Core files don't have section headers yet they have PT_NOTE program
Adrian Prantl05097242018-04-30 16:49:04 +00003187 // headers that might shed more light on the architecture
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003188 for (const elf::ELFProgramHeader &H : ProgramHeaders()) {
3189 if (H.p_type != PT_NOTE || H.p_offset == 0 || H.p_filesz == 0)
3190 continue;
3191 DataExtractor data;
3192 if (data.SetData(m_data, H.p_offset, H.p_filesz) == H.p_filesz) {
3193 UUID uuid;
3194 RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003195 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003196 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003197 }
3198 arch = m_arch_spec;
3199 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003200}
3201
Kate Stoneb9c1b512016-09-06 20:57:50 +00003202ObjectFile::Type ObjectFileELF::CalculateType() {
3203 switch (m_header.e_type) {
3204 case llvm::ELF::ET_NONE:
3205 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003206 return eTypeUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003207
3208 case llvm::ELF::ET_REL:
3209 // 1 - Relocatable file
3210 return eTypeObjectFile;
3211
3212 case llvm::ELF::ET_EXEC:
3213 // 2 - Executable file
3214 return eTypeExecutable;
3215
3216 case llvm::ELF::ET_DYN:
3217 // 3 - Shared object file
3218 return eTypeSharedLibrary;
3219
3220 case ET_CORE:
3221 // 4 - Core file
3222 return eTypeCoreFile;
3223
3224 default:
3225 break;
3226 }
3227 return eTypeUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003228}
3229
Kate Stoneb9c1b512016-09-06 20:57:50 +00003230ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3231 switch (m_header.e_type) {
3232 case llvm::ELF::ET_NONE:
3233 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003234 return eStrataUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003235
Kate Stoneb9c1b512016-09-06 20:57:50 +00003236 case llvm::ELF::ET_REL:
3237 // 1 - Relocatable file
3238 return eStrataUnknown;
3239
3240 case llvm::ELF::ET_EXEC:
3241 // 2 - Executable file
3242 // TODO: is there any way to detect that an executable is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003243 // related executable by inspecting the program headers, section headers,
3244 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003245 return eStrataUser;
3246
3247 case llvm::ELF::ET_DYN:
3248 // 3 - Shared object file
3249 // TODO: is there any way to detect that an shared library is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003250 // related executable by inspecting the program headers, section headers,
3251 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003252 return eStrataUnknown;
3253
3254 case ET_CORE:
3255 // 4 - Core file
3256 // TODO: is there any way to detect that an core file is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003257 // related executable by inspecting the program headers, section headers,
3258 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003259 return eStrataUnknown;
3260
3261 default:
3262 break;
3263 }
3264 return eStrataUnknown;
3265}
Pavel Labathe2867bc2017-12-15 14:23:58 +00003266
3267size_t ObjectFileELF::ReadSectionData(Section *section,
3268 lldb::offset_t section_offset, void *dst,
3269 size_t dst_len) {
3270 // If some other objectfile owns this data, pass this to them.
3271 if (section->GetObjectFile() != this)
3272 return section->GetObjectFile()->ReadSectionData(section, section_offset,
3273 dst, dst_len);
3274
3275 if (!section->Test(SHF_COMPRESSED))
3276 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
3277
3278 // For compressed sections we need to read to full data to be able to
3279 // decompress.
3280 DataExtractor data;
3281 ReadSectionData(section, data);
3282 return data.CopyData(section_offset, dst_len, dst);
3283}
3284
3285size_t ObjectFileELF::ReadSectionData(Section *section,
3286 DataExtractor &section_data) {
3287 // If some other objectfile owns this data, pass this to them.
3288 if (section->GetObjectFile() != this)
3289 return section->GetObjectFile()->ReadSectionData(section, section_data);
3290
Pavel Labathe2867bc2017-12-15 14:23:58 +00003291 size_t result = ObjectFile::ReadSectionData(section, section_data);
3292 if (result == 0 || !section->Test(SHF_COMPRESSED))
3293 return result;
3294
3295 auto Decompressor = llvm::object::Decompressor::create(
3296 section->GetName().GetStringRef(),
3297 {reinterpret_cast<const char *>(section_data.GetDataStart()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003298 size_t(section_data.GetByteSize())},
Pavel Labathe2867bc2017-12-15 14:23:58 +00003299 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8);
3300 if (!Decompressor) {
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003301 GetModule()->ReportWarning(
3302 "Unable to initialize decompressor for section '%s': %s",
3303 section->GetName().GetCString(),
3304 llvm::toString(Decompressor.takeError()).c_str());
3305 section_data.Clear();
3306 return 0;
Pavel Labathe2867bc2017-12-15 14:23:58 +00003307 }
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003308
Pavel Labathe2867bc2017-12-15 14:23:58 +00003309 auto buffer_sp =
3310 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0);
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003311 if (auto error = Decompressor->decompress(
Pavel Labathe2867bc2017-12-15 14:23:58 +00003312 {reinterpret_cast<char *>(buffer_sp->GetBytes()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003313 size_t(buffer_sp->GetByteSize())})) {
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003314 GetModule()->ReportWarning(
3315 "Decompression of section '%s' failed: %s",
3316 section->GetName().GetCString(),
3317 llvm::toString(std::move(error)).c_str());
3318 section_data.Clear();
3319 return 0;
Pavel Labathe2867bc2017-12-15 14:23:58 +00003320 }
Leonard Mosescu9ba51572018-08-07 18:00:30 +00003321
Pavel Labathe2867bc2017-12-15 14:23:58 +00003322 section_data.SetData(buffer_sp);
3323 return buffer_sp->GetByteSize();
3324}
Pavel Labath16064d32018-03-20 11:56:24 +00003325
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003326llvm::ArrayRef<ELFProgramHeader> ObjectFileELF::ProgramHeaders() {
3327 ParseProgramHeaders();
3328 return m_program_headers;
3329}
3330
3331DataExtractor ObjectFileELF::GetSegmentData(const ELFProgramHeader &H) {
3332 return DataExtractor(m_data, H.p_offset, H.p_filesz);
3333}
3334
Pavel Labath16064d32018-03-20 11:56:24 +00003335bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003336 for (const ELFProgramHeader &H : ProgramHeaders()) {
3337 if (H.p_paddr != 0)
Pavel Labath16064d32018-03-20 11:56:24 +00003338 return true;
3339 }
3340 return false;
3341}
3342
3343std::vector<ObjectFile::LoadableData>
3344ObjectFileELF::GetLoadableData(Target &target) {
Adrian Prantl05097242018-04-30 16:49:04 +00003345 // Create a list of loadable data from loadable segments, using physical
3346 // addresses if they aren't all null
Pavel Labath16064d32018-03-20 11:56:24 +00003347 std::vector<LoadableData> loadables;
Pavel Labath16064d32018-03-20 11:56:24 +00003348 bool should_use_paddr = AnySegmentHasPhysicalAddress();
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003349 for (const ELFProgramHeader &H : ProgramHeaders()) {
Pavel Labath16064d32018-03-20 11:56:24 +00003350 LoadableData loadable;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003351 if (H.p_type != llvm::ELF::PT_LOAD)
Pavel Labath16064d32018-03-20 11:56:24 +00003352 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003353 loadable.Dest = should_use_paddr ? H.p_paddr : H.p_vaddr;
Pavel Labath16064d32018-03-20 11:56:24 +00003354 if (loadable.Dest == LLDB_INVALID_ADDRESS)
3355 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003356 if (H.p_filesz == 0)
Pavel Labath16064d32018-03-20 11:56:24 +00003357 continue;
Pavel Labath5ea7ecd2018-12-12 14:20:28 +00003358 auto segment_data = GetSegmentData(H);
Pavel Labath16064d32018-03-20 11:56:24 +00003359 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(),
3360 segment_data.GetByteSize());
3361 loadables.push_back(loadable);
3362 }
3363 return loadables;
3364}