blob: 84e74628bd80544f0d5645fe91e00bfdc0e4c206 [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"
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +000021#include "lldb/Symbol/DWARFCallFrameInfo.h"
Jim Ingham672e6f52011-03-07 23:44:08 +000022#include "lldb/Symbol/SymbolContext.h"
Steve Pucci9e02dac2014-02-06 19:02:19 +000023#include "lldb/Target/SectionLoadList.h"
Ed Maste54803652013-10-11 17:39:07 +000024#include "lldb/Target/Target.h"
Pavel Labath5f19b902017-11-13 16:16:33 +000025#include "lldb/Utility/ArchSpec.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000026#include "lldb/Utility/DataBufferHeap.h"
Zachary Turner6f9e6902017-03-03 20:56:28 +000027#include "lldb/Utility/Log.h"
Zachary Turner97206d52017-05-12 04:51:55 +000028#include "lldb/Utility/Status.h"
Zachary Turnerbf9a7732017-02-02 21:39:50 +000029#include "lldb/Utility/Stream.h"
Pavel Labath38d06322017-06-29 14:32:17 +000030#include "lldb/Utility/Timer.h"
Chris Lattner30fdc8d2010-06-08 16:52:24 +000031
Stephen Wilson499b40e2011-03-30 16:07:05 +000032#include "llvm/ADT/PointerUnion.h"
Zachary Turner97a14e62014-08-19 17:18:29 +000033#include "llvm/ADT/StringRef.h"
Pavel Labathe2867bc2017-12-15 14:23:58 +000034#include "llvm/Object/Decompressor.h"
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +000035#include "llvm/Support/ARMBuildAttributes.h"
Zachary Turner736d4d82014-06-25 05:42:32 +000036#include "llvm/Support/MathExtras.h"
Zachary Turner3f4a4b32017-02-24 18:56:49 +000037#include "llvm/Support/MemoryBuffer.h"
Sagar Thakurad5b55a2016-05-24 14:52:50 +000038#include "llvm/Support/MipsABIFlags.h"
Stephen Wilson499b40e2011-03-30 16:07:05 +000039
Kate Stoneb9c1b512016-09-06 20:57:50 +000040#define CASE_AND_STREAM(s, def, width) \
41 case def: \
42 s->Printf("%-*s", width, #def); \
43 break;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000044
Chris Lattner30fdc8d2010-06-08 16:52:24 +000045using namespace lldb;
46using namespace lldb_private;
Stephen Wilsonf325ba92010-07-13 23:07:23 +000047using namespace elf;
48using namespace llvm::ELF;
Chris Lattner30fdc8d2010-06-08 16:52:24 +000049
Stephen Wilson499b40e2011-03-30 16:07:05 +000050namespace {
Todd Fialab91de782014-06-27 16:52:49 +000051
52// ELF note owner definitions
53const char *const LLDB_NT_OWNER_FREEBSD = "FreeBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000054const char *const LLDB_NT_OWNER_GNU = "GNU";
55const char *const LLDB_NT_OWNER_NETBSD = "NetBSD";
Kamil Rytarowski12801f12017-03-26 15:34:57 +000056const char *const LLDB_NT_OWNER_OPENBSD = "OpenBSD";
Kate Stoneb9c1b512016-09-06 20:57:50 +000057const char *const LLDB_NT_OWNER_CSR = "csr";
Tamas Berghammerdb037d92015-03-18 10:36:27 +000058const char *const LLDB_NT_OWNER_ANDROID = "Android";
Kate Stoneb9c1b512016-09-06 20:57:50 +000059const char *const LLDB_NT_OWNER_CORE = "CORE";
60const char *const LLDB_NT_OWNER_LINUX = "LINUX";
Todd Fialab91de782014-06-27 16:52:49 +000061
62// ELF note type definitions
Kate Stoneb9c1b512016-09-06 20:57:50 +000063const elf_word LLDB_NT_FREEBSD_ABI_TAG = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000064const elf_word LLDB_NT_FREEBSD_ABI_SIZE = 4;
65
Kate Stoneb9c1b512016-09-06 20:57:50 +000066const elf_word LLDB_NT_GNU_ABI_TAG = 0x01;
67const elf_word LLDB_NT_GNU_ABI_SIZE = 16;
Todd Fialab91de782014-06-27 16:52:49 +000068
69const elf_word LLDB_NT_GNU_BUILD_ID_TAG = 0x03;
70
Kate Stoneb9c1b512016-09-06 20:57:50 +000071const elf_word LLDB_NT_NETBSD_ABI_TAG = 0x01;
72const elf_word LLDB_NT_NETBSD_ABI_SIZE = 4;
Todd Fialab91de782014-06-27 16:52:49 +000073
74// GNU ABI note OS constants
Kate Stoneb9c1b512016-09-06 20:57:50 +000075const elf_word LLDB_NT_GNU_ABI_OS_LINUX = 0x00;
76const elf_word LLDB_NT_GNU_ABI_OS_HURD = 0x01;
Todd Fialab91de782014-06-27 16:52:49 +000077const elf_word LLDB_NT_GNU_ABI_OS_SOLARIS = 0x02;
78
Greg Claytonb704b692015-10-28 18:04:38 +000079// LLDB_NT_OWNER_CORE and LLDB_NT_OWNER_LINUX note contants
Kate Stoneb9c1b512016-09-06 20:57:50 +000080#define NT_PRSTATUS 1
81#define NT_PRFPREG 2
82#define NT_PRPSINFO 3
83#define NT_TASKSTRUCT 4
84#define NT_AUXV 6
85#define NT_SIGINFO 0x53494749
86#define NT_FILE 0x46494c45
87#define NT_PRXFPREG 0x46e62b7f
88#define NT_PPC_VMX 0x100
89#define NT_PPC_SPE 0x101
90#define NT_PPC_VSX 0x102
91#define NT_386_TLS 0x200
92#define NT_386_IOPERM 0x201
93#define NT_X86_XSTATE 0x202
94#define NT_S390_HIGH_GPRS 0x300
95#define NT_S390_TIMER 0x301
96#define NT_S390_TODCMP 0x302
97#define NT_S390_TODPREG 0x303
98#define NT_S390_CTRS 0x304
99#define NT_S390_PREFIX 0x305
100#define NT_S390_LAST_BREAK 0x306
101#define NT_S390_SYSTEM_CALL 0x307
102#define NT_S390_TDB 0x308
103#define NT_S390_VXRS_LOW 0x309
104#define NT_S390_VXRS_HIGH 0x30a
105#define NT_ARM_VFP 0x400
106#define NT_ARM_TLS 0x401
107#define NT_ARM_HW_BREAK 0x402
108#define NT_ARM_HW_WATCH 0x403
109#define NT_ARM_SYSTEM_CALL 0x404
110#define NT_METAG_CBUF 0x500
111#define NT_METAG_RPIPE 0x501
112#define NT_METAG_TLS 0x502
Greg Claytonb704b692015-10-28 18:04:38 +0000113
Stephen Wilson499b40e2011-03-30 16:07:05 +0000114//===----------------------------------------------------------------------===//
115/// @class ELFRelocation
Adrian Prantld8f460e2018-05-02 16:55:16 +0000116/// Generic wrapper for ELFRel and ELFRela.
Stephen Wilson499b40e2011-03-30 16:07:05 +0000117///
118/// This helper class allows us to parse both ELFRel and ELFRela relocation
119/// entries in a generic manner.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000120class ELFRelocation {
Stephen Wilson499b40e2011-03-30 16:07:05 +0000121public:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000122 /// Constructs an ELFRelocation entry with a personality as given by @p
123 /// type.
124 ///
125 /// @param type Either DT_REL or DT_RELA. Any other value is invalid.
126 ELFRelocation(unsigned type);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000127
Kate Stoneb9c1b512016-09-06 20:57:50 +0000128 ~ELFRelocation();
Ed Maste81b4c5f2016-01-04 01:43:47 +0000129
Kate Stoneb9c1b512016-09-06 20:57:50 +0000130 bool Parse(const lldb_private::DataExtractor &data, lldb::offset_t *offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000131
Kate Stoneb9c1b512016-09-06 20:57:50 +0000132 static unsigned RelocType32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000133
Kate Stoneb9c1b512016-09-06 20:57:50 +0000134 static unsigned RelocType64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000135
Kate Stoneb9c1b512016-09-06 20:57:50 +0000136 static unsigned RelocSymbol32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000137
Kate Stoneb9c1b512016-09-06 20:57:50 +0000138 static unsigned RelocSymbol64(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000139
Kate Stoneb9c1b512016-09-06 20:57:50 +0000140 static unsigned RelocOffset32(const ELFRelocation &rel);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000141
Kate Stoneb9c1b512016-09-06 20:57:50 +0000142 static unsigned RelocOffset64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000143
Kate Stoneb9c1b512016-09-06 20:57:50 +0000144 static unsigned RelocAddend32(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000145
Kate Stoneb9c1b512016-09-06 20:57:50 +0000146 static unsigned RelocAddend64(const ELFRelocation &rel);
Andrew MacPherson17220c12014-03-05 10:12:43 +0000147
Stephen Wilson499b40e2011-03-30 16:07:05 +0000148private:
Kate Stoneb9c1b512016-09-06 20:57:50 +0000149 typedef llvm::PointerUnion<ELFRel *, ELFRela *> RelocUnion;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000150
Kate Stoneb9c1b512016-09-06 20:57:50 +0000151 RelocUnion reloc;
Stephen Wilson499b40e2011-03-30 16:07:05 +0000152};
153
Kate Stoneb9c1b512016-09-06 20:57:50 +0000154ELFRelocation::ELFRelocation(unsigned type) {
155 if (type == DT_REL || type == SHT_REL)
156 reloc = new ELFRel();
157 else if (type == DT_RELA || type == SHT_RELA)
158 reloc = new ELFRela();
159 else {
160 assert(false && "unexpected relocation type");
161 reloc = static_cast<ELFRel *>(NULL);
162 }
Stephen Wilson499b40e2011-03-30 16:07:05 +0000163}
164
Kate Stoneb9c1b512016-09-06 20:57:50 +0000165ELFRelocation::~ELFRelocation() {
166 if (reloc.is<ELFRel *>())
167 delete reloc.get<ELFRel *>();
168 else
169 delete reloc.get<ELFRela *>();
Stephen Wilson499b40e2011-03-30 16:07:05 +0000170}
171
Kate Stoneb9c1b512016-09-06 20:57:50 +0000172bool ELFRelocation::Parse(const lldb_private::DataExtractor &data,
173 lldb::offset_t *offset) {
174 if (reloc.is<ELFRel *>())
175 return reloc.get<ELFRel *>()->Parse(data, offset);
176 else
177 return reloc.get<ELFRela *>()->Parse(data, offset);
Stephen Wilson499b40e2011-03-30 16:07:05 +0000178}
179
Kate Stoneb9c1b512016-09-06 20:57:50 +0000180unsigned ELFRelocation::RelocType32(const ELFRelocation &rel) {
181 if (rel.reloc.is<ELFRel *>())
182 return ELFRel::RelocType32(*rel.reloc.get<ELFRel *>());
183 else
184 return ELFRela::RelocType32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000185}
186
Kate Stoneb9c1b512016-09-06 20:57:50 +0000187unsigned ELFRelocation::RelocType64(const ELFRelocation &rel) {
188 if (rel.reloc.is<ELFRel *>())
189 return ELFRel::RelocType64(*rel.reloc.get<ELFRel *>());
190 else
191 return ELFRela::RelocType64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000192}
193
Kate Stoneb9c1b512016-09-06 20:57:50 +0000194unsigned ELFRelocation::RelocSymbol32(const ELFRelocation &rel) {
195 if (rel.reloc.is<ELFRel *>())
196 return ELFRel::RelocSymbol32(*rel.reloc.get<ELFRel *>());
197 else
198 return ELFRela::RelocSymbol32(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000199}
200
Kate Stoneb9c1b512016-09-06 20:57:50 +0000201unsigned ELFRelocation::RelocSymbol64(const ELFRelocation &rel) {
202 if (rel.reloc.is<ELFRel *>())
203 return ELFRel::RelocSymbol64(*rel.reloc.get<ELFRel *>());
204 else
205 return ELFRela::RelocSymbol64(*rel.reloc.get<ELFRela *>());
Stephen Wilson499b40e2011-03-30 16:07:05 +0000206}
207
Kate Stoneb9c1b512016-09-06 20:57:50 +0000208unsigned ELFRelocation::RelocOffset32(const ELFRelocation &rel) {
209 if (rel.reloc.is<ELFRel *>())
210 return rel.reloc.get<ELFRel *>()->r_offset;
211 else
212 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000213}
214
Kate Stoneb9c1b512016-09-06 20:57:50 +0000215unsigned ELFRelocation::RelocOffset64(const ELFRelocation &rel) {
216 if (rel.reloc.is<ELFRel *>())
217 return rel.reloc.get<ELFRel *>()->r_offset;
218 else
219 return rel.reloc.get<ELFRela *>()->r_offset;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000220}
221
Kate Stoneb9c1b512016-09-06 20:57:50 +0000222unsigned ELFRelocation::RelocAddend32(const ELFRelocation &rel) {
223 if (rel.reloc.is<ELFRel *>())
224 return 0;
225 else
226 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000227}
228
Kate Stoneb9c1b512016-09-06 20:57:50 +0000229unsigned ELFRelocation::RelocAddend64(const ELFRelocation &rel) {
230 if (rel.reloc.is<ELFRel *>())
231 return 0;
232 else
233 return rel.reloc.get<ELFRela *>()->r_addend;
Andrew MacPherson17220c12014-03-05 10:12:43 +0000234}
235
Stephen Wilson499b40e2011-03-30 16:07:05 +0000236} // end anonymous namespace
237
Kate Stoneb9c1b512016-09-06 20:57:50 +0000238bool ELFNote::Parse(const DataExtractor &data, lldb::offset_t *offset) {
239 // Read all fields.
240 if (data.GetU32(offset, &n_namesz, 3) == NULL)
241 return false;
Ed Mastec113ff82013-12-02 17:49:13 +0000242
Adrian Prantl05097242018-04-30 16:49:04 +0000243 // The name field is required to be nul-terminated, and n_namesz includes the
244 // terminating nul in observed implementations (contrary to the ELF-64 spec).
245 // A special case is needed for cores generated by some older Linux versions,
246 // which write a note named "CORE" without a nul terminator and n_namesz = 4.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000247 if (n_namesz == 4) {
248 char buf[4];
249 if (data.ExtractBytes(*offset, 4, data.GetByteOrder(), buf) != 4)
250 return false;
251 if (strncmp(buf, "CORE", 4) == 0) {
252 n_name = "CORE";
253 *offset += 4;
254 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000255 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000256 }
Ed Mastec113ff82013-12-02 17:49:13 +0000257
Kate Stoneb9c1b512016-09-06 20:57:50 +0000258 const char *cstr = data.GetCStr(offset, llvm::alignTo(n_namesz, 4));
259 if (cstr == NULL) {
260 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_SYMBOLS));
261 if (log)
262 log->Printf("Failed to parse note name lacking nul terminator");
Ed Mastec113ff82013-12-02 17:49:13 +0000263
Kate Stoneb9c1b512016-09-06 20:57:50 +0000264 return false;
265 }
266 n_name = cstr;
267 return true;
Ed Mastec113ff82013-12-02 17:49:13 +0000268}
269
Kate Stoneb9c1b512016-09-06 20:57:50 +0000270static uint32_t kalimbaVariantFromElfFlags(const elf::elf_word e_flags) {
271 const uint32_t dsp_rev = e_flags & 0xFF;
272 uint32_t kal_arch_variant = LLDB_INVALID_CPUTYPE;
273 switch (dsp_rev) {
274 // TODO(mg11) Support more variants
275 case 10:
276 kal_arch_variant = llvm::Triple::KalimbaSubArch_v3;
277 break;
278 case 14:
279 kal_arch_variant = llvm::Triple::KalimbaSubArch_v4;
280 break;
281 case 17:
282 case 20:
283 kal_arch_variant = llvm::Triple::KalimbaSubArch_v5;
284 break;
285 default:
286 break;
287 }
288 return kal_arch_variant;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000289}
290
Nitesh Jain706c5202017-03-31 11:06:25 +0000291static uint32_t mipsVariantFromElfFlags (const elf::ELFHeader &header) {
292 const uint32_t mips_arch = header.e_flags & llvm::ELF::EF_MIPS_ARCH;
293 uint32_t endian = header.e_ident[EI_DATA];
Kate Stoneb9c1b512016-09-06 20:57:50 +0000294 uint32_t arch_variant = ArchSpec::eMIPSSubType_unknown;
Nitesh Jain706c5202017-03-31 11:06:25 +0000295 uint32_t fileclass = header.e_ident[EI_CLASS];
296
Adrian Prantl05097242018-04-30 16:49:04 +0000297 // If there aren't any elf flags available (e.g core elf file) then return
298 // default
Nitesh Jain706c5202017-03-31 11:06:25 +0000299 // 32 or 64 bit arch (without any architecture revision) based on object file's class.
300 if (header.e_type == ET_CORE) {
301 switch (fileclass) {
302 case llvm::ELF::ELFCLASS32:
303 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
304 : ArchSpec::eMIPSSubType_mips32;
305 case llvm::ELF::ELFCLASS64:
306 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
307 : ArchSpec::eMIPSSubType_mips64;
308 default:
309 return arch_variant;
310 }
311 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000312
Kate Stoneb9c1b512016-09-06 20:57:50 +0000313 switch (mips_arch) {
314 case llvm::ELF::EF_MIPS_ARCH_1:
315 case llvm::ELF::EF_MIPS_ARCH_2:
316 case llvm::ELF::EF_MIPS_ARCH_32:
317 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32el
318 : ArchSpec::eMIPSSubType_mips32;
319 case llvm::ELF::EF_MIPS_ARCH_32R2:
320 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r2el
321 : ArchSpec::eMIPSSubType_mips32r2;
322 case llvm::ELF::EF_MIPS_ARCH_32R6:
323 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips32r6el
324 : ArchSpec::eMIPSSubType_mips32r6;
325 case llvm::ELF::EF_MIPS_ARCH_3:
326 case llvm::ELF::EF_MIPS_ARCH_4:
327 case llvm::ELF::EF_MIPS_ARCH_5:
328 case llvm::ELF::EF_MIPS_ARCH_64:
329 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64el
330 : ArchSpec::eMIPSSubType_mips64;
331 case llvm::ELF::EF_MIPS_ARCH_64R2:
332 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r2el
333 : ArchSpec::eMIPSSubType_mips64r2;
334 case llvm::ELF::EF_MIPS_ARCH_64R6:
335 return (endian == ELFDATA2LSB) ? ArchSpec::eMIPSSubType_mips64r6el
336 : ArchSpec::eMIPSSubType_mips64r6;
337 default:
338 break;
339 }
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000340
Kate Stoneb9c1b512016-09-06 20:57:50 +0000341 return arch_variant;
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000342}
343
Kate Stoneb9c1b512016-09-06 20:57:50 +0000344static uint32_t subTypeFromElfHeader(const elf::ELFHeader &header) {
345 if (header.e_machine == llvm::ELF::EM_MIPS)
Nitesh Jain706c5202017-03-31 11:06:25 +0000346 return mipsVariantFromElfFlags(header);
Mohit K. Bhakkad3df471c2015-03-17 11:43:56 +0000347
Kate Stoneb9c1b512016-09-06 20:57:50 +0000348 return llvm::ELF::EM_CSR_KALIMBA == header.e_machine
349 ? kalimbaVariantFromElfFlags(header.e_flags)
350 : LLDB_INVALID_CPUTYPE;
Matthew Gardiner5f675792014-08-27 12:09:39 +0000351}
352
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000353//! The kalimba toolchain identifies a code section as being
354//! one with the SHT_PROGBITS set in the section sh_type and the top
355//! bit in the 32-bit address field set.
356static lldb::SectionType
Kate Stoneb9c1b512016-09-06 20:57:50 +0000357kalimbaSectionType(const elf::ELFHeader &header,
358 const elf::ELFSectionHeader &sect_hdr) {
359 if (llvm::ELF::EM_CSR_KALIMBA != header.e_machine) {
Matthew Gardiner6e7b0a02014-10-15 08:21:54 +0000360 return eSectionTypeOther;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000361 }
362
363 if (llvm::ELF::SHT_NOBITS == sect_hdr.sh_type) {
364 return eSectionTypeZeroFill;
365 }
366
367 if (llvm::ELF::SHT_PROGBITS == sect_hdr.sh_type) {
368 const lldb::addr_t KAL_CODE_BIT = 1 << 31;
369 return KAL_CODE_BIT & sect_hdr.sh_addr ? eSectionTypeCode
370 : eSectionTypeData;
371 }
372
373 return eSectionTypeOther;
Matthew Gardinerf03e6d842014-09-29 08:02:24 +0000374}
375
Todd Fiala4339f3a2014-03-25 19:29:09 +0000376// Arbitrary constant used as UUID prefix for core files.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000377const uint32_t ObjectFileELF::g_core_uuid_magic(0xE210C);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000378
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000379//------------------------------------------------------------------
380// Static methods.
381//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000382void ObjectFileELF::Initialize() {
383 PluginManager::RegisterPlugin(GetPluginNameStatic(),
384 GetPluginDescriptionStatic(), CreateInstance,
385 CreateMemoryInstance, GetModuleSpecifications);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000386}
387
Kate Stoneb9c1b512016-09-06 20:57:50 +0000388void ObjectFileELF::Terminate() {
389 PluginManager::UnregisterPlugin(CreateInstance);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000390}
391
Kate Stoneb9c1b512016-09-06 20:57:50 +0000392lldb_private::ConstString ObjectFileELF::GetPluginNameStatic() {
393 static ConstString g_name("elf");
394 return g_name;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000395}
396
Kate Stoneb9c1b512016-09-06 20:57:50 +0000397const char *ObjectFileELF::GetPluginDescriptionStatic() {
398 return "ELF object file reader.";
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000399}
400
Kate Stoneb9c1b512016-09-06 20:57:50 +0000401ObjectFile *ObjectFileELF::CreateInstance(const lldb::ModuleSP &module_sp,
402 DataBufferSP &data_sp,
403 lldb::offset_t data_offset,
404 const lldb_private::FileSpec *file,
405 lldb::offset_t file_offset,
406 lldb::offset_t length) {
407 if (!data_sp) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000408 data_sp = MapFileData(*file, length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000409 if (!data_sp)
410 return nullptr;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000411 data_offset = 0;
412 }
413
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000414 assert(data_sp);
415
416 if (data_sp->GetByteSize() <= (llvm::ELF::EI_NIDENT + data_offset))
417 return nullptr;
418
419 const uint8_t *magic = data_sp->GetBytes() + data_offset;
420 if (!ELFHeader::MagicBytesMatch(magic))
421 return nullptr;
422
423 // Update the data to contain the entire file if it doesn't already
424 if (data_sp->GetByteSize() < length) {
Pavel Labath50251fc2017-12-21 10:54:30 +0000425 data_sp = MapFileData(*file, length, file_offset);
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000426 if (!data_sp)
427 return nullptr;
428 data_offset = 0;
429 magic = data_sp->GetBytes();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000430 }
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000431
432 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
433 if (address_size == 4 || address_size == 8) {
434 std::unique_ptr<ObjectFileELF> objfile_ap(new ObjectFileELF(
435 module_sp, data_sp, data_offset, file, file_offset, length));
436 ArchSpec spec;
437 if (objfile_ap->GetArchitecture(spec) &&
438 objfile_ap->SetModulesArchitecture(spec))
439 return objfile_ap.release();
440 }
441
Kate Stoneb9c1b512016-09-06 20:57:50 +0000442 return NULL;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000443}
444
Kate Stoneb9c1b512016-09-06 20:57:50 +0000445ObjectFile *ObjectFileELF::CreateMemoryInstance(
446 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
447 const lldb::ProcessSP &process_sp, lldb::addr_t header_addr) {
448 if (data_sp && data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT)) {
449 const uint8_t *magic = data_sp->GetBytes();
450 if (ELFHeader::MagicBytesMatch(magic)) {
451 unsigned address_size = ELFHeader::AddressSizeInBytes(magic);
452 if (address_size == 4 || address_size == 8) {
Benjamin Kramere1a60742017-09-14 15:01:55 +0000453 std::unique_ptr<ObjectFileELF> objfile_ap(
Kate Stoneb9c1b512016-09-06 20:57:50 +0000454 new ObjectFileELF(module_sp, data_sp, process_sp, header_addr));
455 ArchSpec spec;
456 if (objfile_ap->GetArchitecture(spec) &&
457 objfile_ap->SetModulesArchitecture(spec))
458 return objfile_ap.release();
459 }
Andrew MacPherson17220c12014-03-05 10:12:43 +0000460 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000461 }
462 return NULL;
Greg Claytonc9660542012-02-05 02:38:54 +0000463}
464
Kate Stoneb9c1b512016-09-06 20:57:50 +0000465bool ObjectFileELF::MagicBytesMatch(DataBufferSP &data_sp,
466 lldb::addr_t data_offset,
467 lldb::addr_t data_length) {
468 if (data_sp &&
469 data_sp->GetByteSize() > (llvm::ELF::EI_NIDENT + data_offset)) {
470 const uint8_t *magic = data_sp->GetBytes() + data_offset;
471 return ELFHeader::MagicBytesMatch(magic);
472 }
473 return false;
Michael Sartain9f0013d2013-05-17 00:20:21 +0000474}
Greg Claytonc9660542012-02-05 02:38:54 +0000475
Michael Sartain9f4517a2013-07-03 01:52:14 +0000476/*
477 * crc function from http://svnweb.freebsd.org/base/head/sys/libkern/crc32.c
478 *
479 * COPYRIGHT (C) 1986 Gary S. Brown. You may use this program, or
480 * code or tables extracted from it, as desired without restriction.
481 */
Kate Stoneb9c1b512016-09-06 20:57:50 +0000482static uint32_t calc_crc32(uint32_t crc, const void *buf, size_t size) {
483 static const uint32_t g_crc32_tab[] = {
484 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
485 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
486 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
487 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
488 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
489 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
490 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
491 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
492 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
493 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
494 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
495 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
496 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
497 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
498 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
499 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
500 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
501 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
502 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
503 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
504 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
505 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
506 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
507 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
508 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
509 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
510 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
511 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
512 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
513 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
514 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
515 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
516 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
517 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
518 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
519 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
520 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
521 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
522 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
523 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
524 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
525 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
526 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d};
527 const uint8_t *p = (const uint8_t *)buf;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000528
Kate Stoneb9c1b512016-09-06 20:57:50 +0000529 crc = crc ^ ~0U;
530 while (size--)
531 crc = g_crc32_tab[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
532 return crc ^ ~0U;
Michael Sartain9f4517a2013-07-03 01:52:14 +0000533}
534
Kate Stoneb9c1b512016-09-06 20:57:50 +0000535static uint32_t calc_gnu_debuglink_crc32(const void *buf, size_t size) {
536 return calc_crc32(0U, buf, size);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000537}
538
Kate Stoneb9c1b512016-09-06 20:57:50 +0000539uint32_t ObjectFileELF::CalculateELFNotesSegmentsCRC32(
540 const ProgramHeaderColl &program_headers, DataExtractor &object_data) {
541 typedef ProgramHeaderCollConstIter Iter;
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
Kate Stoneb9c1b512016-09-06 20:57:50 +0000545 for (Iter I = program_headers.begin(); I != program_headers.end(); ++I) {
546 if (I->p_type == llvm::ELF::PT_NOTE) {
547 const elf_off ph_offset = I->p_offset;
548 const size_t ph_size = I->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(),
716 (file.GetByteSize() - file_offset) / 1024);
Todd Fiala4339f3a2014-03-25 19:29:09 +0000717
Kate Stoneb9c1b512016-09-06 20:57:50 +0000718 // For core files - which usually don't happen to have a
Zachary Turner3f4a4b32017-02-24 18:56:49 +0000719 // gnu_debuglink, and are pretty bulky - calculating whole
720 // contents crc32 would be too much of luxury. Thus we will need
721 // to fallback to something simpler.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000722 if (header.e_type == llvm::ELF::ET_CORE) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000723 ProgramHeaderColl program_headers;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000724 GetProgramHeaderInfo(program_headers, data, header);
Michael Sartainc836ae72013-05-23 20:57:03 +0000725
Kate Stoneb9c1b512016-09-06 20:57:50 +0000726 core_notes_crc =
727 CalculateELFNotesSegmentsCRC32(program_headers, data);
728 } else {
Pavel Labath4f033122018-02-05 17:25:40 +0000729 gnu_debuglink_crc = calc_gnu_debuglink_crc32(
730 data.GetDataStart(), data.GetByteSize());
Kate Stoneb9c1b512016-09-06 20:57:50 +0000731 }
732 }
733 if (gnu_debuglink_crc) {
734 // Use 4 bytes of crc from the .gnu_debuglink section.
735 uint32_t uuidt[4] = {gnu_debuglink_crc, 0, 0, 0};
736 uuid.SetBytes(uuidt, sizeof(uuidt));
737 } else if (core_notes_crc) {
738 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make
Adrian Prantl05097242018-04-30 16:49:04 +0000739 // it look different form .gnu_debuglink crc followed by 4 bytes
740 // of note segments crc.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000741 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
742 uuid.SetBytes(uuidt, sizeof(uuidt));
743 }
744 }
745
746 specs.Append(spec);
747 }
748 }
749 }
750 }
751
752 return specs.GetSize() - initial_count;
Greg Claytonf4d6de62013-04-24 22:29:28 +0000753}
754
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000755//------------------------------------------------------------------
756// PluginInterface protocol
757//------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +0000758lldb_private::ConstString ObjectFileELF::GetPluginName() {
759 return GetPluginNameStatic();
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000760}
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000761
Kate Stoneb9c1b512016-09-06 20:57:50 +0000762uint32_t ObjectFileELF::GetPluginVersion() { return m_plugin_version; }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000763//------------------------------------------------------------------
764// ObjectFile protocol
765//------------------------------------------------------------------
766
Kate Stoneb9c1b512016-09-06 20:57:50 +0000767ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
768 DataBufferSP &data_sp, lldb::offset_t data_offset,
769 const FileSpec *file, lldb::offset_t file_offset,
770 lldb::offset_t length)
771 : ObjectFile(module_sp, file, file_offset, length, data_sp, data_offset),
772 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
773 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
774 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
775 if (file)
776 m_file = *file;
777 ::memset(&m_header, 0, sizeof(m_header));
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000778}
779
Kate Stoneb9c1b512016-09-06 20:57:50 +0000780ObjectFileELF::ObjectFileELF(const lldb::ModuleSP &module_sp,
781 DataBufferSP &header_data_sp,
782 const lldb::ProcessSP &process_sp,
783 addr_t header_addr)
784 : ObjectFile(module_sp, process_sp, header_addr, header_data_sp),
785 m_header(), m_uuid(), m_gnu_debuglink_file(), m_gnu_debuglink_crc(0),
786 m_program_headers(), m_section_headers(), m_dynamic_symbols(),
787 m_filespec_ap(), m_entry_point_address(), m_arch_spec() {
788 ::memset(&m_header, 0, sizeof(m_header));
Andrew MacPherson17220c12014-03-05 10:12:43 +0000789}
790
Kate Stoneb9c1b512016-09-06 20:57:50 +0000791ObjectFileELF::~ObjectFileELF() {}
792
793bool ObjectFileELF::IsExecutable() const {
794 return ((m_header.e_type & ET_EXEC) != 0) || (m_header.e_entry != 0);
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000795}
796
Kate Stoneb9c1b512016-09-06 20:57:50 +0000797bool ObjectFileELF::SetLoadAddress(Target &target, lldb::addr_t value,
798 bool value_is_offset) {
799 ModuleSP module_sp = GetModule();
800 if (module_sp) {
801 size_t num_loaded_sections = 0;
802 SectionList *section_list = GetSectionList();
803 if (section_list) {
804 if (!value_is_offset) {
805 bool found_offset = false;
Kamil Rytarowski12801f12017-03-26 15:34:57 +0000806 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) {
Kate Stoneb9c1b512016-09-06 20:57:50 +0000807 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i);
808 if (header == nullptr)
809 continue;
Jim Ingham5aee1622010-08-09 23:31:02 +0000810
Kate Stoneb9c1b512016-09-06 20:57:50 +0000811 if (header->p_type != PT_LOAD || header->p_offset != 0)
812 continue;
Tamas Berghammerf2561842015-06-30 10:41:23 +0000813
Kate Stoneb9c1b512016-09-06 20:57:50 +0000814 value = value - header->p_vaddr;
815 found_offset = true;
816 break;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000817 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000818 if (!found_offset)
819 return false;
820 }
821
822 const size_t num_sections = section_list->GetSize();
823 size_t sect_idx = 0;
824
825 for (sect_idx = 0; sect_idx < num_sections; ++sect_idx) {
Adrian Prantl05097242018-04-30 16:49:04 +0000826 // Iterate through the object file sections to find all of the sections
827 // that have SHF_ALLOC in their flag bits.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000828 SectionSP section_sp(section_list->GetSectionAtIndex(sect_idx));
829 if (section_sp && section_sp->Test(SHF_ALLOC)) {
Pavel Labathec03d7e2018-02-28 20:42:29 +0000830 lldb::addr_t load_addr = section_sp->GetFileAddress();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000831 // We don't want to update the load address of a section with type
832 // eSectionTypeAbsoluteAddress as they already have the absolute load
Adrian Prantl05097242018-04-30 16:49:04 +0000833 // address already specified
Kate Stoneb9c1b512016-09-06 20:57:50 +0000834 if (section_sp->GetType() != eSectionTypeAbsoluteAddress)
835 load_addr += value;
836
837 // On 32-bit systems the load address have to fit into 4 bytes. The
Adrian Prantl05097242018-04-30 16:49:04 +0000838 // rest of the bytes are the overflow from the addition.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000839 if (GetAddressByteSize() == 4)
840 load_addr &= 0xFFFFFFFF;
841
842 if (target.GetSectionLoadList().SetSectionLoadAddress(section_sp,
843 load_addr))
844 ++num_loaded_sections;
845 }
846 }
847 return num_loaded_sections > 0;
Steve Pucci9e02dac2014-02-06 19:02:19 +0000848 }
Kate Stoneb9c1b512016-09-06 20:57:50 +0000849 }
850 return false;
851}
852
853ByteOrder ObjectFileELF::GetByteOrder() const {
854 if (m_header.e_ident[EI_DATA] == ELFDATA2MSB)
855 return eByteOrderBig;
856 if (m_header.e_ident[EI_DATA] == ELFDATA2LSB)
857 return eByteOrderLittle;
858 return eByteOrderInvalid;
859}
860
861uint32_t ObjectFileELF::GetAddressByteSize() const {
862 return m_data.GetAddressByteSize();
863}
864
865AddressClass ObjectFileELF::GetAddressClass(addr_t file_addr) {
866 Symtab *symtab = GetSymtab();
867 if (!symtab)
868 return eAddressClassUnknown;
869
Adrian Prantl05097242018-04-30 16:49:04 +0000870 // The address class is determined based on the symtab. Ask it from the
871 // object file what contains the symtab information.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000872 ObjectFile *symtab_objfile = symtab->GetObjectFile();
873 if (symtab_objfile != nullptr && symtab_objfile != this)
874 return symtab_objfile->GetAddressClass(file_addr);
875
876 auto res = ObjectFile::GetAddressClass(file_addr);
877 if (res != eAddressClassCode)
878 return res;
879
880 auto ub = m_address_class_map.upper_bound(file_addr);
881 if (ub == m_address_class_map.begin()) {
Adrian Prantl05097242018-04-30 16:49:04 +0000882 // No entry in the address class map before the address. Return default
883 // address class for an address in a code section.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000884 return eAddressClassCode;
885 }
886
887 // Move iterator to the address class entry preceding address
888 --ub;
889
890 return ub->second;
891}
892
893size_t ObjectFileELF::SectionIndex(const SectionHeaderCollIter &I) {
894 return std::distance(m_section_headers.begin(), I) + 1u;
895}
896
897size_t ObjectFileELF::SectionIndex(const SectionHeaderCollConstIter &I) const {
898 return std::distance(m_section_headers.begin(), I) + 1u;
899}
900
901bool ObjectFileELF::ParseHeader() {
902 lldb::offset_t offset = 0;
Pavel Labathdf1a0d12017-06-20 08:11:47 +0000903 return m_header.Parse(m_data, &offset);
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000904}
905
Kate Stoneb9c1b512016-09-06 20:57:50 +0000906bool ObjectFileELF::GetUUID(lldb_private::UUID *uuid) {
907 // Need to parse the section list to get the UUIDs, so make sure that's been
908 // done.
909 if (!ParseSectionHeaders() && GetType() != ObjectFile::eTypeCoreFile)
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000910 return false;
Kate Stoneb9c1b512016-09-06 20:57:50 +0000911
912 if (m_uuid.IsValid()) {
913 // We have the full build id uuid.
914 *uuid = m_uuid;
915 return true;
916 } else if (GetType() == ObjectFile::eTypeCoreFile) {
917 uint32_t core_notes_crc = 0;
918
919 if (!ParseProgramHeaders())
920 return false;
921
922 core_notes_crc = CalculateELFNotesSegmentsCRC32(m_program_headers, m_data);
923
924 if (core_notes_crc) {
Adrian Prantl05097242018-04-30 16:49:04 +0000925 // Use 8 bytes - first 4 bytes for *magic* prefix, mainly to make it look
926 // different form .gnu_debuglink crc - followed by 4 bytes of note
Kate Stoneb9c1b512016-09-06 20:57:50 +0000927 // segments crc.
928 uint32_t uuidt[4] = {g_core_uuid_magic, core_notes_crc, 0, 0};
929 m_uuid.SetBytes(uuidt, sizeof(uuidt));
930 }
931 } else {
932 if (!m_gnu_debuglink_crc)
933 m_gnu_debuglink_crc =
934 calc_gnu_debuglink_crc32(m_data.GetDataStart(), m_data.GetByteSize());
935 if (m_gnu_debuglink_crc) {
936 // Use 4 bytes of crc from the .gnu_debuglink section.
937 uint32_t uuidt[4] = {m_gnu_debuglink_crc, 0, 0, 0};
938 m_uuid.SetBytes(uuidt, sizeof(uuidt));
939 }
940 }
941
942 if (m_uuid.IsValid()) {
943 *uuid = m_uuid;
944 return true;
945 }
946
947 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +0000948}
949
Kate Stoneb9c1b512016-09-06 20:57:50 +0000950lldb_private::FileSpecList ObjectFileELF::GetDebugSymbolFilePaths() {
951 FileSpecList file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000952
Kate Stoneb9c1b512016-09-06 20:57:50 +0000953 if (!m_gnu_debuglink_file.empty()) {
Malcolm Parsons771ef6d2016-11-02 20:34:10 +0000954 FileSpec file_spec(m_gnu_debuglink_file, false);
Kate Stoneb9c1b512016-09-06 20:57:50 +0000955 file_spec_list.Append(file_spec);
956 }
957 return file_spec_list;
Michael Sartaina7499c92013-07-01 19:45:50 +0000958}
959
Kate Stoneb9c1b512016-09-06 20:57:50 +0000960uint32_t ObjectFileELF::GetDependentModules(FileSpecList &files) {
961 size_t num_modules = ParseDependentModules();
962 uint32_t num_specs = 0;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000963
Kate Stoneb9c1b512016-09-06 20:57:50 +0000964 for (unsigned i = 0; i < num_modules; ++i) {
965 if (files.AppendIfUnique(m_filespec_ap->GetFileSpecAtIndex(i)))
966 num_specs++;
967 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000968
Kate Stoneb9c1b512016-09-06 20:57:50 +0000969 return num_specs;
Stephen Wilsonf325ba92010-07-13 23:07:23 +0000970}
971
Kate Stoneb9c1b512016-09-06 20:57:50 +0000972Address ObjectFileELF::GetImageInfoAddress(Target *target) {
973 if (!ParseDynamicSymbols())
Stephen Wilson2ab0a582011-01-15 00:08:44 +0000974 return Address();
Kate Stoneb9c1b512016-09-06 20:57:50 +0000975
976 SectionList *section_list = GetSectionList();
977 if (!section_list)
978 return Address();
979
980 // Find the SHT_DYNAMIC (.dynamic) section.
981 SectionSP dynsym_section_sp(
982 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true));
983 if (!dynsym_section_sp)
984 return Address();
985 assert(dynsym_section_sp->GetObjectFile() == this);
986
987 user_id_t dynsym_id = dynsym_section_sp->GetID();
988 const ELFSectionHeaderInfo *dynsym_hdr = GetSectionHeaderByIndex(dynsym_id);
989 if (!dynsym_hdr)
990 return Address();
991
992 for (size_t i = 0; i < m_dynamic_symbols.size(); ++i) {
993 ELFDynamic &symbol = m_dynamic_symbols[i];
994
995 if (symbol.d_tag == DT_DEBUG) {
Adrian Prantl05097242018-04-30 16:49:04 +0000996 // Compute the offset as the number of previous entries plus the size of
997 // d_tag.
Kate Stoneb9c1b512016-09-06 20:57:50 +0000998 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
999 return Address(dynsym_section_sp, offset);
1000 }
1001 // MIPS executables uses DT_MIPS_RLD_MAP_REL to support PIE. DT_MIPS_RLD_MAP
1002 // exists in non-PIE.
1003 else if ((symbol.d_tag == DT_MIPS_RLD_MAP ||
1004 symbol.d_tag == DT_MIPS_RLD_MAP_REL) &&
1005 target) {
1006 addr_t offset = i * dynsym_hdr->sh_entsize + GetAddressByteSize();
1007 addr_t dyn_base = dynsym_section_sp->GetLoadBaseAddress(target);
1008 if (dyn_base == LLDB_INVALID_ADDRESS)
1009 return Address();
1010
Zachary Turner97206d52017-05-12 04:51:55 +00001011 Status error;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001012 if (symbol.d_tag == DT_MIPS_RLD_MAP) {
1013 // DT_MIPS_RLD_MAP tag stores an absolute address of the debug pointer.
1014 Address addr;
1015 if (target->ReadPointerFromMemory(dyn_base + offset, false, error,
1016 addr))
1017 return addr;
1018 }
1019 if (symbol.d_tag == DT_MIPS_RLD_MAP_REL) {
1020 // DT_MIPS_RLD_MAP_REL tag stores the offset to the debug pointer,
1021 // relative to the address of the tag.
1022 uint64_t rel_offset;
1023 rel_offset = target->ReadUnsignedIntegerFromMemory(
1024 dyn_base + offset, false, GetAddressByteSize(), UINT64_MAX, error);
1025 if (error.Success() && rel_offset != UINT64_MAX) {
1026 Address addr;
1027 addr_t debug_ptr_address =
1028 dyn_base + (offset - GetAddressByteSize()) + rel_offset;
1029 addr.SetOffset(debug_ptr_address);
1030 return addr;
1031 }
1032 }
1033 }
1034 }
1035
1036 return Address();
Stephen Wilson2ab0a582011-01-15 00:08:44 +00001037}
1038
Kate Stoneb9c1b512016-09-06 20:57:50 +00001039lldb_private::Address ObjectFileELF::GetEntryPointAddress() {
1040 if (m_entry_point_address.IsValid())
Stephen Wilsond126c8c2011-03-08 04:12:15 +00001041 return m_entry_point_address;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001042
1043 if (!ParseHeader() || !IsExecutable())
1044 return m_entry_point_address;
1045
1046 SectionList *section_list = GetSectionList();
1047 addr_t offset = m_header.e_entry;
1048
1049 if (!section_list)
1050 m_entry_point_address.SetOffset(offset);
1051 else
1052 m_entry_point_address.ResolveAddressUsingFileSections(offset, section_list);
1053 return m_entry_point_address;
Jim Ingham672e6f52011-03-07 23:44:08 +00001054}
1055
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001056//----------------------------------------------------------------------
1057// ParseDependentModules
1058//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001059size_t ObjectFileELF::ParseDependentModules() {
1060 if (m_filespec_ap.get())
Stephen Wilsonf325ba92010-07-13 23:07:23 +00001061 return m_filespec_ap->GetSize();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001062
1063 m_filespec_ap.reset(new FileSpecList());
1064
1065 if (!ParseSectionHeaders())
1066 return 0;
1067
1068 SectionList *section_list = GetSectionList();
1069 if (!section_list)
1070 return 0;
1071
1072 // Find the SHT_DYNAMIC section.
1073 Section *dynsym =
1074 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
1075 .get();
1076 if (!dynsym)
1077 return 0;
1078 assert(dynsym->GetObjectFile() == this);
1079
1080 const ELFSectionHeaderInfo *header = GetSectionHeaderByIndex(dynsym->GetID());
1081 if (!header)
1082 return 0;
1083 // sh_link: section header index of string table used by entries in the
1084 // section.
1085 Section *dynstr = section_list->FindSectionByID(header->sh_link + 1).get();
1086 if (!dynstr)
1087 return 0;
1088
1089 DataExtractor dynsym_data;
1090 DataExtractor dynstr_data;
1091 if (ReadSectionData(dynsym, dynsym_data) &&
1092 ReadSectionData(dynstr, dynstr_data)) {
1093 ELFDynamic symbol;
1094 const lldb::offset_t section_size = dynsym_data.GetByteSize();
1095 lldb::offset_t offset = 0;
1096
1097 // The only type of entries we are concerned with are tagged DT_NEEDED,
1098 // yielding the name of a required library.
1099 while (offset < section_size) {
1100 if (!symbol.Parse(dynsym_data, &offset))
1101 break;
1102
1103 if (symbol.d_tag != DT_NEEDED)
1104 continue;
1105
1106 uint32_t str_index = static_cast<uint32_t>(symbol.d_val);
1107 const char *lib_name = dynstr_data.PeekCStr(str_index);
1108 m_filespec_ap->Append(FileSpec(lib_name, true));
1109 }
1110 }
1111
1112 return m_filespec_ap->GetSize();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001113}
1114
1115//----------------------------------------------------------------------
Todd Fiala4339f3a2014-03-25 19:29:09 +00001116// GetProgramHeaderInfo
1117//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001118size_t ObjectFileELF::GetProgramHeaderInfo(ProgramHeaderColl &program_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001119 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001120 const ELFHeader &header) {
1121 // We have already parsed the program headers
1122 if (!program_headers.empty())
Todd Fiala4339f3a2014-03-25 19:29:09 +00001123 return program_headers.size();
1124
Kate Stoneb9c1b512016-09-06 20:57:50 +00001125 // If there are no program headers to read we are done.
1126 if (header.e_phnum == 0)
1127 return 0;
1128
1129 program_headers.resize(header.e_phnum);
1130 if (program_headers.size() != header.e_phnum)
1131 return 0;
1132
1133 const size_t ph_size = header.e_phnum * header.e_phentsize;
1134 const elf_off ph_offset = header.e_phoff;
1135 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001136 if (data.SetData(object_data, ph_offset, ph_size) != ph_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001137 return 0;
1138
1139 uint32_t idx;
1140 lldb::offset_t offset;
1141 for (idx = 0, offset = 0; idx < header.e_phnum; ++idx) {
1142 if (program_headers[idx].Parse(data, &offset) == false)
1143 break;
1144 }
1145
1146 if (idx < program_headers.size())
1147 program_headers.resize(idx);
1148
1149 return program_headers.size();
Todd Fiala4339f3a2014-03-25 19:29:09 +00001150}
1151
1152//----------------------------------------------------------------------
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001153// ParseProgramHeaders
1154//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001155size_t ObjectFileELF::ParseProgramHeaders() {
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001156 return GetProgramHeaderInfo(m_program_headers, m_data, m_header);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00001157}
1158
Zachary Turner97206d52017-05-12 04:51:55 +00001159lldb_private::Status
Kate Stoneb9c1b512016-09-06 20:57:50 +00001160ObjectFileELF::RefineModuleDetailsFromNote(lldb_private::DataExtractor &data,
1161 lldb_private::ArchSpec &arch_spec,
1162 lldb_private::UUID &uuid) {
1163 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
Zachary Turner97206d52017-05-12 04:51:55 +00001164 Status error;
Todd Fialab91de782014-06-27 16:52:49 +00001165
Kate Stoneb9c1b512016-09-06 20:57:50 +00001166 lldb::offset_t offset = 0;
Michael Sartainc836ae72013-05-23 20:57:03 +00001167
Kate Stoneb9c1b512016-09-06 20:57:50 +00001168 while (true) {
1169 // Parse the note header. If this fails, bail out.
1170 const lldb::offset_t note_offset = offset;
1171 ELFNote note = ELFNote();
1172 if (!note.Parse(data, &offset)) {
1173 // We're done.
1174 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001175 }
Todd Fialab91de782014-06-27 16:52:49 +00001176
Kate Stoneb9c1b512016-09-06 20:57:50 +00001177 if (log)
1178 log->Printf("ObjectFileELF::%s parsing note name='%s', type=%" PRIu32,
1179 __FUNCTION__, note.n_name.c_str(), note.n_type);
1180
1181 // Process FreeBSD ELF notes.
1182 if ((note.n_name == LLDB_NT_OWNER_FREEBSD) &&
1183 (note.n_type == LLDB_NT_FREEBSD_ABI_TAG) &&
1184 (note.n_descsz == LLDB_NT_FREEBSD_ABI_SIZE)) {
1185 // Pull out the min version info.
1186 uint32_t version_info;
1187 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1188 error.SetErrorString("failed to read FreeBSD ABI note payload");
1189 return error;
1190 }
1191
1192 // Convert the version info into a major/minor number.
1193 const uint32_t version_major = version_info / 100000;
1194 const uint32_t version_minor = (version_info / 1000) % 100;
1195
1196 char os_name[32];
1197 snprintf(os_name, sizeof(os_name), "freebsd%" PRIu32 ".%" PRIu32,
1198 version_major, version_minor);
1199
1200 // Set the elf OS version to FreeBSD. Also clear the vendor.
1201 arch_spec.GetTriple().setOSName(os_name);
1202 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1203
1204 if (log)
1205 log->Printf("ObjectFileELF::%s detected FreeBSD %" PRIu32 ".%" PRIu32
1206 ".%" PRIu32,
1207 __FUNCTION__, version_major, version_minor,
1208 static_cast<uint32_t>(version_info % 1000));
1209 }
1210 // Process GNU ELF notes.
1211 else if (note.n_name == LLDB_NT_OWNER_GNU) {
1212 switch (note.n_type) {
1213 case LLDB_NT_GNU_ABI_TAG:
1214 if (note.n_descsz == LLDB_NT_GNU_ABI_SIZE) {
1215 // Pull out the min OS version supporting the ABI.
1216 uint32_t version_info[4];
1217 if (data.GetU32(&offset, &version_info[0], note.n_descsz / 4) ==
1218 nullptr) {
1219 error.SetErrorString("failed to read GNU ABI note payload");
1220 return error;
1221 }
1222
1223 // Set the OS per the OS field.
1224 switch (version_info[0]) {
1225 case LLDB_NT_GNU_ABI_OS_LINUX:
1226 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1227 arch_spec.GetTriple().setVendor(
1228 llvm::Triple::VendorType::UnknownVendor);
1229 if (log)
1230 log->Printf(
1231 "ObjectFileELF::%s detected Linux, min version %" PRIu32
1232 ".%" PRIu32 ".%" PRIu32,
1233 __FUNCTION__, version_info[1], version_info[2],
1234 version_info[3]);
1235 // FIXME we have the minimal version number, we could be propagating
1236 // that. version_info[1] = OS Major, version_info[2] = OS Minor,
1237 // version_info[3] = Revision.
1238 break;
1239 case LLDB_NT_GNU_ABI_OS_HURD:
1240 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1241 arch_spec.GetTriple().setVendor(
1242 llvm::Triple::VendorType::UnknownVendor);
1243 if (log)
1244 log->Printf("ObjectFileELF::%s detected Hurd (unsupported), min "
1245 "version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1246 __FUNCTION__, version_info[1], version_info[2],
1247 version_info[3]);
1248 break;
1249 case LLDB_NT_GNU_ABI_OS_SOLARIS:
1250 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Solaris);
1251 arch_spec.GetTriple().setVendor(
1252 llvm::Triple::VendorType::UnknownVendor);
1253 if (log)
1254 log->Printf(
1255 "ObjectFileELF::%s detected Solaris, min version %" PRIu32
1256 ".%" PRIu32 ".%" PRIu32,
1257 __FUNCTION__, version_info[1], version_info[2],
1258 version_info[3]);
1259 break;
1260 default:
1261 if (log)
1262 log->Printf(
1263 "ObjectFileELF::%s unrecognized OS in note, id %" PRIu32
1264 ", min version %" PRIu32 ".%" PRIu32 ".%" PRIu32,
1265 __FUNCTION__, version_info[0], version_info[1],
1266 version_info[2], version_info[3]);
1267 break;
1268 }
1269 }
1270 break;
1271
1272 case LLDB_NT_GNU_BUILD_ID_TAG:
1273 // Only bother processing this if we don't already have the uuid set.
1274 if (!uuid.IsValid()) {
1275 // 16 bytes is UUID|MD5, 20 bytes is SHA1. Other linkers may produce a
1276 // build-id of a different
1277 // length. Accept it as long as it's at least 4 bytes as it will be
1278 // better than our own crc32.
1279 if (note.n_descsz >= 4 && note.n_descsz <= 20) {
1280 uint8_t uuidbuf[20];
1281 if (data.GetU8(&offset, &uuidbuf, note.n_descsz) == nullptr) {
1282 error.SetErrorString("failed to read GNU_BUILD_ID note payload");
1283 return error;
1284 }
1285
1286 // Save the build id as the UUID for the module.
1287 uuid.SetBytes(uuidbuf, note.n_descsz);
1288 }
1289 }
1290 break;
1291 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001292 if (arch_spec.IsMIPS() &&
1293 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
1294 // The note.n_name == LLDB_NT_OWNER_GNU is valid for Linux platform
1295 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001296 }
1297 // Process NetBSD ELF notes.
1298 else if ((note.n_name == LLDB_NT_OWNER_NETBSD) &&
1299 (note.n_type == LLDB_NT_NETBSD_ABI_TAG) &&
1300 (note.n_descsz == LLDB_NT_NETBSD_ABI_SIZE)) {
1301 // Pull out the min version info.
1302 uint32_t version_info;
1303 if (data.GetU32(&offset, &version_info, 1) == nullptr) {
1304 error.SetErrorString("failed to read NetBSD ABI note payload");
1305 return error;
1306 }
1307
1308 // Set the elf OS version to NetBSD. Also clear the vendor.
1309 arch_spec.GetTriple().setOS(llvm::Triple::OSType::NetBSD);
1310 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1311
1312 if (log)
1313 log->Printf(
1314 "ObjectFileELF::%s detected NetBSD, min version constant %" PRIu32,
1315 __FUNCTION__, version_info);
1316 }
Kamil Rytarowski12801f12017-03-26 15:34:57 +00001317 // Process OpenBSD ELF notes.
1318 else if (note.n_name == LLDB_NT_OWNER_OPENBSD) {
1319 // Set the elf OS version to OpenBSD. Also clear the vendor.
1320 arch_spec.GetTriple().setOS(llvm::Triple::OSType::OpenBSD);
1321 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::UnknownVendor);
1322 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001323 // Process CSR kalimba notes
1324 else if ((note.n_type == LLDB_NT_GNU_ABI_TAG) &&
1325 (note.n_name == LLDB_NT_OWNER_CSR)) {
1326 arch_spec.GetTriple().setOS(llvm::Triple::OSType::UnknownOS);
1327 arch_spec.GetTriple().setVendor(llvm::Triple::VendorType::CSR);
1328
1329 // TODO At some point the description string could be processed.
Adrian Prantl05097242018-04-30 16:49:04 +00001330 // It could provide a steer towards the kalimba variant which this ELF
1331 // targets.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001332 if (note.n_descsz) {
1333 const char *cstr =
1334 data.GetCStr(&offset, llvm::alignTo(note.n_descsz, 4));
1335 (void)cstr;
1336 }
1337 } else if (note.n_name == LLDB_NT_OWNER_ANDROID) {
1338 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1339 arch_spec.GetTriple().setEnvironment(
1340 llvm::Triple::EnvironmentType::Android);
1341 } else if (note.n_name == LLDB_NT_OWNER_LINUX) {
1342 // This is sometimes found in core files and usually contains extended
1343 // register info
1344 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1345 } else if (note.n_name == LLDB_NT_OWNER_CORE) {
Adrian Prantl05097242018-04-30 16:49:04 +00001346 // Parse the NT_FILE to look for stuff in paths to shared libraries As
1347 // the contents look like this in a 64 bit ELF core file: count =
1348 // 0x000000000000000a (10) page_size = 0x0000000000001000 (4096) Index
1349 // start end file_ofs path =====
1350 // ------------------ ------------------ ------------------
1351 // ------------------------------------- [ 0] 0x0000000000400000
1352 // 0x0000000000401000 0x0000000000000000 /tmp/a.out [ 1]
1353 // 0x0000000000600000 0x0000000000601000 0x0000000000000000 /tmp/a.out [
1354 // 2] 0x0000000000601000 0x0000000000602000 0x0000000000000001 /tmp/a.out
Kate Stoneb9c1b512016-09-06 20:57:50 +00001355 // [ 3] 0x00007fa79c9ed000 0x00007fa79cba8000 0x0000000000000000
Adrian Prantl05097242018-04-30 16:49:04 +00001356 // /lib/x86_64-linux-gnu/libc-2.19.so [ 4] 0x00007fa79cba8000
1357 // 0x00007fa79cda7000 0x00000000000001bb /lib/x86_64-linux-
1358 // gnu/libc-2.19.so [ 5] 0x00007fa79cda7000 0x00007fa79cdab000
1359 // 0x00000000000001ba /lib/x86_64-linux-gnu/libc-2.19.so [ 6]
1360 // 0x00007fa79cdab000 0x00007fa79cdad000 0x00000000000001be /lib/x86_64
1361 // -linux-gnu/libc-2.19.so [ 7] 0x00007fa79cdb2000 0x00007fa79cdd5000
1362 // 0x0000000000000000 /lib/x86_64-linux-gnu/ld-2.19.so [ 8]
1363 // 0x00007fa79cfd4000 0x00007fa79cfd5000 0x0000000000000022 /lib/x86_64
1364 // -linux-gnu/ld-2.19.so [ 9] 0x00007fa79cfd5000 0x00007fa79cfd6000
1365 // 0x0000000000000023 /lib/x86_64-linux-gnu/ld-2.19.so In the 32 bit ELFs
1366 // the count, page_size, start, end, file_ofs are uint32_t For reference:
1367 // see readelf source code (in binutils).
Kate Stoneb9c1b512016-09-06 20:57:50 +00001368 if (note.n_type == NT_FILE) {
1369 uint64_t count = data.GetAddress(&offset);
1370 const char *cstr;
1371 data.GetAddress(&offset); // Skip page size
1372 offset += count * 3 *
1373 data.GetAddressByteSize(); // Skip all start/end/file_ofs
1374 for (size_t i = 0; i < count; ++i) {
1375 cstr = data.GetCStr(&offset);
1376 if (cstr == nullptr) {
1377 error.SetErrorStringWithFormat("ObjectFileELF::%s trying to read "
1378 "at an offset after the end "
1379 "(GetCStr returned nullptr)",
1380 __FUNCTION__);
1381 return error;
1382 }
1383 llvm::StringRef path(cstr);
Richard Chamberlaina0c82e12016-10-13 12:11:00 +00001384 if (path.contains("/lib/x86_64-linux-gnu") || path.contains("/lib/i386-linux-gnu")) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001385 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
1386 break;
1387 }
1388 }
Nitesh Jain706c5202017-03-31 11:06:25 +00001389 if (arch_spec.IsMIPS() &&
1390 arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS)
Adrian Prantl05097242018-04-30 16:49:04 +00001391 // In case of MIPSR6, the LLDB_NT_OWNER_GNU note is missing for some
1392 // cases (e.g. compile with -nostdlib) Hence set OS to Linux
Nitesh Jain706c5202017-03-31 11:06:25 +00001393 arch_spec.GetTriple().setOS(llvm::Triple::OSType::Linux);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001394 }
1395 }
1396
Adrian Prantl05097242018-04-30 16:49:04 +00001397 // Calculate the offset of the next note just in case "offset" has been
1398 // used to poke at the contents of the note data
Kate Stoneb9c1b512016-09-06 20:57:50 +00001399 offset = note_offset + note.GetByteSize();
1400 }
1401
1402 return error;
Michael Sartainc836ae72013-05-23 20:57:03 +00001403}
Michael Sartaina7499c92013-07-01 19:45:50 +00001404
Kate Stoneb9c1b512016-09-06 20:57:50 +00001405void ObjectFileELF::ParseARMAttributes(DataExtractor &data, uint64_t length,
1406 ArchSpec &arch_spec) {
1407 lldb::offset_t Offset = 0;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001408
Kate Stoneb9c1b512016-09-06 20:57:50 +00001409 uint8_t FormatVersion = data.GetU8(&Offset);
1410 if (FormatVersion != llvm::ARMBuildAttrs::Format_Version)
1411 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001412
Kate Stoneb9c1b512016-09-06 20:57:50 +00001413 Offset = Offset + sizeof(uint32_t); // Section Length
1414 llvm::StringRef VendorName = data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001415
Kate Stoneb9c1b512016-09-06 20:57:50 +00001416 if (VendorName != "aeabi")
1417 return;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001418
Kate Stoneb9c1b512016-09-06 20:57:50 +00001419 if (arch_spec.GetTriple().getEnvironment() ==
1420 llvm::Triple::UnknownEnvironment)
1421 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001422
Kate Stoneb9c1b512016-09-06 20:57:50 +00001423 while (Offset < length) {
1424 uint8_t Tag = data.GetU8(&Offset);
1425 uint32_t Size = data.GetU32(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001426
Kate Stoneb9c1b512016-09-06 20:57:50 +00001427 if (Tag != llvm::ARMBuildAttrs::File || Size == 0)
1428 continue;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001429
Kate Stoneb9c1b512016-09-06 20:57:50 +00001430 while (Offset < length) {
1431 uint64_t Tag = data.GetULEB128(&Offset);
1432 switch (Tag) {
1433 default:
1434 if (Tag < 32)
1435 data.GetULEB128(&Offset);
1436 else if (Tag % 2 == 0)
1437 data.GetULEB128(&Offset);
1438 else
1439 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001440
Kate Stoneb9c1b512016-09-06 20:57:50 +00001441 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001442
Kate Stoneb9c1b512016-09-06 20:57:50 +00001443 case llvm::ARMBuildAttrs::CPU_raw_name:
1444 case llvm::ARMBuildAttrs::CPU_name:
1445 data.GetCStr(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001446
Kate Stoneb9c1b512016-09-06 20:57:50 +00001447 break;
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001448
Kate Stoneb9c1b512016-09-06 20:57:50 +00001449 case llvm::ARMBuildAttrs::ABI_VFP_args: {
1450 uint64_t VFPArgs = data.GetULEB128(&Offset);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001451
Kate Stoneb9c1b512016-09-06 20:57:50 +00001452 if (VFPArgs == llvm::ARMBuildAttrs::BaseAAPCS) {
1453 if (arch_spec.GetTriple().getEnvironment() ==
1454 llvm::Triple::UnknownEnvironment ||
1455 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABIHF)
1456 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABI);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001457
Kate Stoneb9c1b512016-09-06 20:57:50 +00001458 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1459 } else if (VFPArgs == llvm::ARMBuildAttrs::HardFPAAPCS) {
1460 if (arch_spec.GetTriple().getEnvironment() ==
1461 llvm::Triple::UnknownEnvironment ||
1462 arch_spec.GetTriple().getEnvironment() == llvm::Triple::EABI)
1463 arch_spec.GetTriple().setEnvironment(llvm::Triple::EABIHF);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001464
Kate Stoneb9c1b512016-09-06 20:57:50 +00001465 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001466 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001467
1468 break;
1469 }
1470 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001471 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001472 }
Saleem Abdulrasoold2d15042016-04-23 16:00:15 +00001473}
Todd Fialab91de782014-06-27 16:52:49 +00001474
Michael Sartaina7499c92013-07-01 19:45:50 +00001475//----------------------------------------------------------------------
1476// GetSectionHeaderInfo
1477//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001478size_t ObjectFileELF::GetSectionHeaderInfo(SectionHeaderColl &section_headers,
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001479 DataExtractor &object_data,
Kate Stoneb9c1b512016-09-06 20:57:50 +00001480 const elf::ELFHeader &header,
1481 lldb_private::UUID &uuid,
1482 std::string &gnu_debuglink_file,
1483 uint32_t &gnu_debuglink_crc,
1484 ArchSpec &arch_spec) {
1485 // Don't reparse the section headers if we already did that.
1486 if (!section_headers.empty())
1487 return section_headers.size();
Todd Fiala6477ea82014-07-11 15:13:33 +00001488
Kate Stoneb9c1b512016-09-06 20:57:50 +00001489 // Only initialize the arch_spec to okay defaults if they're not already set.
1490 // We'll refine this with note data as we parse the notes.
1491 if (arch_spec.GetTriple().getOS() == llvm::Triple::OSType::UnknownOS) {
1492 llvm::Triple::OSType ostype;
1493 llvm::Triple::OSType spec_ostype;
1494 const uint32_t sub_type = subTypeFromElfHeader(header);
1495 arch_spec.SetArchitecture(eArchTypeELF, header.e_machine, sub_type,
1496 header.e_ident[EI_OSABI]);
Alexander Shaposhnikova08ba422016-12-05 18:42:21 +00001497
Adrian Prantl05097242018-04-30 16:49:04 +00001498 // Validate if it is ok to remove GetOsFromOSABI. Note, that now the OS is
1499 // determined based on EI_OSABI flag and the info extracted from ELF notes
1500 // (see RefineModuleDetailsFromNote). However in some cases that still
1501 // might be not enough: for example a shared library might not have any
1502 // notes at all and have EI_OSABI flag set to System V, as result the OS
1503 // will be set to UnknownOS.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001504 GetOsFromOSABI(header.e_ident[EI_OSABI], ostype);
1505 spec_ostype = arch_spec.GetTriple().getOS();
1506 assert(spec_ostype == ostype);
Hafiz Abid Qadeerb1554312017-01-20 10:24:03 +00001507 UNUSED_IF_ASSERT_DISABLED(spec_ostype);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001508 }
1509
1510 if (arch_spec.GetMachine() == llvm::Triple::mips ||
1511 arch_spec.GetMachine() == llvm::Triple::mipsel ||
1512 arch_spec.GetMachine() == llvm::Triple::mips64 ||
1513 arch_spec.GetMachine() == llvm::Triple::mips64el) {
1514 switch (header.e_flags & llvm::ELF::EF_MIPS_ARCH_ASE) {
1515 case llvm::ELF::EF_MIPS_MICROMIPS:
1516 arch_spec.SetFlags(ArchSpec::eMIPSAse_micromips);
1517 break;
1518 case llvm::ELF::EF_MIPS_ARCH_ASE_M16:
1519 arch_spec.SetFlags(ArchSpec::eMIPSAse_mips16);
1520 break;
1521 case llvm::ELF::EF_MIPS_ARCH_ASE_MDMX:
1522 arch_spec.SetFlags(ArchSpec::eMIPSAse_mdmx);
1523 break;
1524 default:
1525 break;
Todd Fialab91de782014-06-27 16:52:49 +00001526 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001527 }
Todd Fialab91de782014-06-27 16:52:49 +00001528
Kate Stoneb9c1b512016-09-06 20:57:50 +00001529 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1530 arch_spec.GetMachine() == llvm::Triple::thumb) {
1531 if (header.e_flags & llvm::ELF::EF_ARM_SOFT_FLOAT)
1532 arch_spec.SetFlags(ArchSpec::eARM_abi_soft_float);
1533 else if (header.e_flags & llvm::ELF::EF_ARM_VFP_FLOAT)
1534 arch_spec.SetFlags(ArchSpec::eARM_abi_hard_float);
1535 }
Jaydeep Patil501a7812015-07-16 03:51:55 +00001536
Kate Stoneb9c1b512016-09-06 20:57:50 +00001537 // If there are no section headers we are done.
1538 if (header.e_shnum == 0)
Michael Sartaina7499c92013-07-01 19:45:50 +00001539 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001540
1541 Log *log(lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES));
1542
1543 section_headers.resize(header.e_shnum);
1544 if (section_headers.size() != header.e_shnum)
1545 return 0;
1546
1547 const size_t sh_size = header.e_shnum * header.e_shentsize;
1548 const elf_off sh_offset = header.e_shoff;
1549 DataExtractor sh_data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001550 if (sh_data.SetData(object_data, sh_offset, sh_size) != sh_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001551 return 0;
1552
1553 uint32_t idx;
1554 lldb::offset_t offset;
1555 for (idx = 0, offset = 0; idx < header.e_shnum; ++idx) {
1556 if (section_headers[idx].Parse(sh_data, &offset) == false)
1557 break;
1558 }
1559 if (idx < section_headers.size())
1560 section_headers.resize(idx);
1561
1562 const unsigned strtab_idx = header.e_shstrndx;
1563 if (strtab_idx && strtab_idx < section_headers.size()) {
1564 const ELFSectionHeaderInfo &sheader = section_headers[strtab_idx];
1565 const size_t byte_size = sheader.sh_size;
1566 const Elf64_Off offset = sheader.sh_offset;
1567 lldb_private::DataExtractor shstr_data;
1568
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001569 if (shstr_data.SetData(object_data, offset, byte_size) == byte_size) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001570 for (SectionHeaderCollIter I = section_headers.begin();
1571 I != section_headers.end(); ++I) {
1572 static ConstString g_sect_name_gnu_debuglink(".gnu_debuglink");
1573 const ELFSectionHeaderInfo &sheader = *I;
1574 const uint64_t section_size =
1575 sheader.sh_type == SHT_NOBITS ? 0 : sheader.sh_size;
1576 ConstString name(shstr_data.PeekCStr(I->sh_name));
1577
1578 I->section_name = name;
1579
1580 if (arch_spec.IsMIPS()) {
1581 uint32_t arch_flags = arch_spec.GetFlags();
1582 DataExtractor data;
1583 if (sheader.sh_type == SHT_MIPS_ABIFLAGS) {
1584
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001585 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1586 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001587 // MIPS ASE Mask is at offset 12 in MIPS.abiflags section
1588 lldb::offset_t offset = 12; // MIPS ABI Flags Version: 0
1589 arch_flags |= data.GetU32(&offset);
1590
1591 // The floating point ABI is at offset 7
1592 offset = 7;
1593 switch (data.GetU8(&offset)) {
1594 case llvm::Mips::Val_GNU_MIPS_ABI_FP_ANY:
1595 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_ANY;
1596 break;
1597 case llvm::Mips::Val_GNU_MIPS_ABI_FP_DOUBLE:
1598 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_DOUBLE;
1599 break;
1600 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SINGLE:
1601 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SINGLE;
1602 break;
1603 case llvm::Mips::Val_GNU_MIPS_ABI_FP_SOFT:
1604 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_SOFT;
1605 break;
1606 case llvm::Mips::Val_GNU_MIPS_ABI_FP_OLD_64:
1607 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_OLD_64;
1608 break;
1609 case llvm::Mips::Val_GNU_MIPS_ABI_FP_XX:
1610 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_XX;
1611 break;
1612 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64:
1613 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64;
1614 break;
1615 case llvm::Mips::Val_GNU_MIPS_ABI_FP_64A:
1616 arch_flags |= lldb_private::ArchSpec::eMIPS_ABI_FP_64A;
1617 break;
1618 }
1619 }
1620 }
1621 // Settings appropriate ArchSpec ABI Flags
1622 switch (header.e_flags & llvm::ELF::EF_MIPS_ABI) {
1623 case llvm::ELF::EF_MIPS_ABI_O32:
1624 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O32;
1625 break;
1626 case EF_MIPS_ABI_O64:
1627 arch_flags |= lldb_private::ArchSpec::eMIPSABI_O64;
1628 break;
1629 case EF_MIPS_ABI_EABI32:
1630 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI32;
1631 break;
1632 case EF_MIPS_ABI_EABI64:
1633 arch_flags |= lldb_private::ArchSpec::eMIPSABI_EABI64;
1634 break;
1635 default:
1636 // ABI Mask doesn't cover N32 and N64 ABI.
1637 if (header.e_ident[EI_CLASS] == llvm::ELF::ELFCLASS64)
1638 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N64;
Mehdi Aminid16a6e32017-06-23 18:20:13 +00001639 else if (header.e_flags & llvm::ELF::EF_MIPS_ABI2)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001640 arch_flags |= lldb_private::ArchSpec::eMIPSABI_N32;
1641 break;
1642 }
1643 arch_spec.SetFlags(arch_flags);
1644 }
1645
1646 if (arch_spec.GetMachine() == llvm::Triple::arm ||
1647 arch_spec.GetMachine() == llvm::Triple::thumb) {
1648 DataExtractor data;
1649
1650 if (sheader.sh_type == SHT_ARM_ATTRIBUTES && section_size != 0 &&
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001651 data.SetData(object_data, sheader.sh_offset, section_size) == section_size)
Kate Stoneb9c1b512016-09-06 20:57:50 +00001652 ParseARMAttributes(data, section_size, arch_spec);
1653 }
1654
1655 if (name == g_sect_name_gnu_debuglink) {
1656 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001657 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1658 section_size) == section_size)) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00001659 lldb::offset_t gnu_debuglink_offset = 0;
1660 gnu_debuglink_file = data.GetCStr(&gnu_debuglink_offset);
1661 gnu_debuglink_offset = llvm::alignTo(gnu_debuglink_offset, 4);
1662 data.GetU32(&gnu_debuglink_offset, &gnu_debuglink_crc, 1);
1663 }
1664 }
1665
1666 // Process ELF note section entries.
1667 bool is_note_header = (sheader.sh_type == SHT_NOTE);
1668
1669 // The section header ".note.android.ident" is stored as a
1670 // PROGBITS type header but it is actually a note header.
1671 static ConstString g_sect_name_android_ident(".note.android.ident");
1672 if (!is_note_header && name == g_sect_name_android_ident)
1673 is_note_header = true;
1674
1675 if (is_note_header) {
1676 // Allow notes to refine module info.
1677 DataExtractor data;
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001678 if (section_size && (data.SetData(object_data, sheader.sh_offset,
1679 section_size) == section_size)) {
Zachary Turner97206d52017-05-12 04:51:55 +00001680 Status error = RefineModuleDetailsFromNote(data, arch_spec, uuid);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001681 if (error.Fail()) {
1682 if (log)
1683 log->Printf("ObjectFileELF::%s ELF note processing failed: %s",
1684 __FUNCTION__, error.AsCString());
1685 }
1686 }
1687 }
1688 }
1689
1690 // Make any unknown triple components to be unspecified unknowns.
1691 if (arch_spec.GetTriple().getVendor() == llvm::Triple::UnknownVendor)
1692 arch_spec.GetTriple().setVendorName(llvm::StringRef());
1693 if (arch_spec.GetTriple().getOS() == llvm::Triple::UnknownOS)
1694 arch_spec.GetTriple().setOSName(llvm::StringRef());
1695
1696 return section_headers.size();
1697 }
1698 }
1699
1700 section_headers.clear();
1701 return 0;
Michael Sartaina7499c92013-07-01 19:45:50 +00001702}
1703
Kate Stoneb9c1b512016-09-06 20:57:50 +00001704size_t ObjectFileELF::GetProgramHeaderCount() { return ParseProgramHeaders(); }
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001705
1706const elf::ELFProgramHeader *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001707ObjectFileELF::GetProgramHeaderByIndex(lldb::user_id_t id) {
1708 if (!id || !ParseProgramHeaders())
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001709 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001710
1711 if (--id < m_program_headers.size())
1712 return &m_program_headers[id];
1713
1714 return NULL;
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001715}
1716
Kate Stoneb9c1b512016-09-06 20:57:50 +00001717DataExtractor ObjectFileELF::GetSegmentDataByIndex(lldb::user_id_t id) {
1718 const elf::ELFProgramHeader *segment_header = GetProgramHeaderByIndex(id);
1719 if (segment_header == NULL)
1720 return DataExtractor();
1721 return DataExtractor(m_data, segment_header->p_offset,
1722 segment_header->p_filesz);
Ashok Thirumurthi4822d922013-07-11 20:39:00 +00001723}
1724
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001725llvm::StringRef
Kate Stoneb9c1b512016-09-06 20:57:50 +00001726ObjectFileELF::StripLinkerSymbolAnnotations(llvm::StringRef symbol_name) const {
1727 size_t pos = symbol_name.find('@');
Pavel Labath4d35d6b2017-05-02 10:17:30 +00001728 return symbol_name.substr(0, pos);
Pavel Labathc6ae7ea2015-03-04 10:25:22 +00001729}
1730
Michael Sartaina7499c92013-07-01 19:45:50 +00001731//----------------------------------------------------------------------
1732// ParseSectionHeaders
1733//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00001734size_t ObjectFileELF::ParseSectionHeaders() {
Pavel Labathdf1a0d12017-06-20 08:11:47 +00001735 return GetSectionHeaderInfo(m_section_headers, m_data, m_header, m_uuid,
1736 m_gnu_debuglink_file, m_gnu_debuglink_crc,
1737 m_arch_spec);
Michael Sartaina7499c92013-07-01 19:45:50 +00001738}
1739
Michael Sartaina7499c92013-07-01 19:45:50 +00001740const ObjectFileELF::ELFSectionHeaderInfo *
Kate Stoneb9c1b512016-09-06 20:57:50 +00001741ObjectFileELF::GetSectionHeaderByIndex(lldb::user_id_t id) {
1742 if (!id || !ParseSectionHeaders())
Michael Sartaina7499c92013-07-01 19:45:50 +00001743 return NULL;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001744
1745 if (--id < m_section_headers.size())
1746 return &m_section_headers[id];
1747
1748 return NULL;
Michael Sartaina7499c92013-07-01 19:45:50 +00001749}
1750
Kate Stoneb9c1b512016-09-06 20:57:50 +00001751lldb::user_id_t ObjectFileELF::GetSectionIndexByName(const char *name) {
1752 if (!name || !name[0] || !ParseSectionHeaders())
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001753 return 0;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001754 for (size_t i = 1; i < m_section_headers.size(); ++i)
1755 if (m_section_headers[i].section_name == ConstString(name))
1756 return i;
1757 return 0;
Tamas Berghammer85fadd92015-05-08 09:40:05 +00001758}
1759
Kate Stoneb9c1b512016-09-06 20:57:50 +00001760void ObjectFileELF::CreateSections(SectionList &unified_section_list) {
1761 if (!m_sections_ap.get() && ParseSectionHeaders()) {
1762 m_sections_ap.reset(new SectionList());
Andrew MacPherson17220c12014-03-05 10:12:43 +00001763
Ed Masted13f6912017-10-02 14:35:07 +00001764 // Object files frequently have 0 for every section address, meaning we
1765 // need to compute synthetic addresses in order for "file addresses" from
1766 // different sections to not overlap
1767 bool synthaddrs = (CalculateType() == ObjectFile::Type::eTypeObjectFile);
1768 uint64_t nextaddr = 0;
1769
Andrew MacPherson17220c12014-03-05 10:12:43 +00001770 for (SectionHeaderCollIter I = m_section_headers.begin();
Kate Stoneb9c1b512016-09-06 20:57:50 +00001771 I != m_section_headers.end(); ++I) {
1772 const ELFSectionHeaderInfo &header = *I;
1773
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001774 ConstString &name = I->section_name;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001775 const uint64_t file_size =
1776 header.sh_type == SHT_NOBITS ? 0 : header.sh_size;
1777 const uint64_t vm_size = header.sh_flags & SHF_ALLOC ? header.sh_size : 0;
1778
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001779 static ConstString g_sect_name_text(".text");
1780 static ConstString g_sect_name_data(".data");
1781 static ConstString g_sect_name_bss(".bss");
1782 static ConstString g_sect_name_tdata(".tdata");
1783 static ConstString g_sect_name_tbss(".tbss");
1784 static ConstString g_sect_name_dwarf_debug_abbrev(".debug_abbrev");
1785 static ConstString g_sect_name_dwarf_debug_addr(".debug_addr");
1786 static ConstString g_sect_name_dwarf_debug_aranges(".debug_aranges");
1787 static ConstString g_sect_name_dwarf_debug_cu_index(".debug_cu_index");
1788 static ConstString g_sect_name_dwarf_debug_frame(".debug_frame");
1789 static ConstString g_sect_name_dwarf_debug_info(".debug_info");
1790 static ConstString g_sect_name_dwarf_debug_line(".debug_line");
1791 static ConstString g_sect_name_dwarf_debug_loc(".debug_loc");
1792 static ConstString g_sect_name_dwarf_debug_macinfo(".debug_macinfo");
1793 static ConstString g_sect_name_dwarf_debug_macro(".debug_macro");
1794 static ConstString g_sect_name_dwarf_debug_pubnames(".debug_pubnames");
1795 static ConstString g_sect_name_dwarf_debug_pubtypes(".debug_pubtypes");
1796 static ConstString g_sect_name_dwarf_debug_ranges(".debug_ranges");
1797 static ConstString g_sect_name_dwarf_debug_str(".debug_str");
1798 static ConstString g_sect_name_dwarf_debug_str_offsets(
1799 ".debug_str_offsets");
1800 static ConstString g_sect_name_dwarf_debug_abbrev_dwo(
1801 ".debug_abbrev.dwo");
1802 static ConstString g_sect_name_dwarf_debug_info_dwo(".debug_info.dwo");
1803 static ConstString g_sect_name_dwarf_debug_line_dwo(".debug_line.dwo");
1804 static ConstString g_sect_name_dwarf_debug_macro_dwo(".debug_macro.dwo");
1805 static ConstString g_sect_name_dwarf_debug_loc_dwo(".debug_loc.dwo");
1806 static ConstString g_sect_name_dwarf_debug_str_dwo(".debug_str.dwo");
1807 static ConstString g_sect_name_dwarf_debug_str_offsets_dwo(
1808 ".debug_str_offsets.dwo");
1809 static ConstString g_sect_name_dwarf_debug_types(".debug_types");
1810 static ConstString g_sect_name_eh_frame(".eh_frame");
1811 static ConstString g_sect_name_arm_exidx(".ARM.exidx");
1812 static ConstString g_sect_name_arm_extab(".ARM.extab");
1813 static ConstString g_sect_name_go_symtab(".gosymtab");
1814 static ConstString g_sect_name_dwarf_gnu_debugaltlink(".gnu_debugaltlink");
1815
1816 SectionType sect_type = eSectionTypeOther;
1817
1818 bool is_thread_specific = false;
1819
1820 if (name == g_sect_name_text)
1821 sect_type = eSectionTypeCode;
1822 else if (name == g_sect_name_data)
1823 sect_type = eSectionTypeData;
1824 else if (name == g_sect_name_bss)
1825 sect_type = eSectionTypeZeroFill;
1826 else if (name == g_sect_name_tdata) {
1827 sect_type = eSectionTypeData;
1828 is_thread_specific = true;
1829 } else if (name == g_sect_name_tbss) {
1830 sect_type = eSectionTypeZeroFill;
1831 is_thread_specific = true;
1832 }
1833 // .debug_abbrev – Abbreviations used in the .debug_info section
1834 // .debug_aranges – Lookup table for mapping addresses to compilation
1835 // units .debug_frame – Call frame information .debug_info – The core
1836 // DWARF information section .debug_line – Line number information
1837 // .debug_loc – Location lists used in DW_AT_location attributes
1838 // .debug_macinfo – Macro information .debug_pubnames – Lookup table
1839 // for mapping object and function names to compilation units
1840 // .debug_pubtypes – Lookup table for mapping type names to compilation
1841 // units .debug_ranges – Address ranges used in DW_AT_ranges attributes
1842 // .debug_str – String table used in .debug_info MISSING?
1843 // .gnu_debugdata - "mini debuginfo / MiniDebugInfo" section,
1844 // http://sourceware.org/gdb/onlinedocs/gdb/MiniDebugInfo.html MISSING?
1845 // .debug-index - http://src.chromium.org/viewvc/chrome/trunk/src/build
1846 // /gdb-add-index?pathrev=144644 MISSING? .debug_types - Type
1847 // descriptions from DWARF 4? See
1848 // http://gcc.gnu.org/wiki/DwarfSeparateTypeInfo
1849 else if (name == g_sect_name_dwarf_debug_abbrev)
1850 sect_type = eSectionTypeDWARFDebugAbbrev;
1851 else if (name == g_sect_name_dwarf_debug_addr)
1852 sect_type = eSectionTypeDWARFDebugAddr;
1853 else if (name == g_sect_name_dwarf_debug_aranges)
1854 sect_type = eSectionTypeDWARFDebugAranges;
1855 else if (name == g_sect_name_dwarf_debug_cu_index)
1856 sect_type = eSectionTypeDWARFDebugCuIndex;
1857 else if (name == g_sect_name_dwarf_debug_frame)
1858 sect_type = eSectionTypeDWARFDebugFrame;
1859 else if (name == g_sect_name_dwarf_debug_info)
1860 sect_type = eSectionTypeDWARFDebugInfo;
1861 else if (name == g_sect_name_dwarf_debug_line)
1862 sect_type = eSectionTypeDWARFDebugLine;
1863 else if (name == g_sect_name_dwarf_debug_loc)
1864 sect_type = eSectionTypeDWARFDebugLoc;
1865 else if (name == g_sect_name_dwarf_debug_macinfo)
1866 sect_type = eSectionTypeDWARFDebugMacInfo;
1867 else if (name == g_sect_name_dwarf_debug_macro)
1868 sect_type = eSectionTypeDWARFDebugMacro;
1869 else if (name == g_sect_name_dwarf_debug_pubnames)
1870 sect_type = eSectionTypeDWARFDebugPubNames;
1871 else if (name == g_sect_name_dwarf_debug_pubtypes)
1872 sect_type = eSectionTypeDWARFDebugPubTypes;
1873 else if (name == g_sect_name_dwarf_debug_ranges)
1874 sect_type = eSectionTypeDWARFDebugRanges;
1875 else if (name == g_sect_name_dwarf_debug_str)
1876 sect_type = eSectionTypeDWARFDebugStr;
1877 else if (name == g_sect_name_dwarf_debug_types)
1878 sect_type = eSectionTypeDWARFDebugTypes;
1879 else if (name == g_sect_name_dwarf_debug_str_offsets)
1880 sect_type = eSectionTypeDWARFDebugStrOffsets;
1881 else if (name == g_sect_name_dwarf_debug_abbrev_dwo)
1882 sect_type = eSectionTypeDWARFDebugAbbrev;
1883 else if (name == g_sect_name_dwarf_debug_info_dwo)
1884 sect_type = eSectionTypeDWARFDebugInfo;
1885 else if (name == g_sect_name_dwarf_debug_line_dwo)
1886 sect_type = eSectionTypeDWARFDebugLine;
1887 else if (name == g_sect_name_dwarf_debug_macro_dwo)
1888 sect_type = eSectionTypeDWARFDebugMacro;
1889 else if (name == g_sect_name_dwarf_debug_loc_dwo)
1890 sect_type = eSectionTypeDWARFDebugLoc;
1891 else if (name == g_sect_name_dwarf_debug_str_dwo)
1892 sect_type = eSectionTypeDWARFDebugStr;
1893 else if (name == g_sect_name_dwarf_debug_str_offsets_dwo)
1894 sect_type = eSectionTypeDWARFDebugStrOffsets;
1895 else if (name == g_sect_name_eh_frame)
1896 sect_type = eSectionTypeEHFrame;
1897 else if (name == g_sect_name_arm_exidx)
1898 sect_type = eSectionTypeARMexidx;
1899 else if (name == g_sect_name_arm_extab)
1900 sect_type = eSectionTypeARMextab;
1901 else if (name == g_sect_name_go_symtab)
1902 sect_type = eSectionTypeGoSymtab;
1903 else if (name == g_sect_name_dwarf_gnu_debugaltlink)
1904 sect_type = eSectionTypeDWARFGNUDebugAltLink;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001905
1906 const uint32_t permissions =
Ilia K4f730dc2016-09-12 05:25:33 +00001907 ((header.sh_flags & SHF_ALLOC) ? ePermissionsReadable : 0u) |
1908 ((header.sh_flags & SHF_WRITE) ? ePermissionsWritable : 0u) |
1909 ((header.sh_flags & SHF_EXECINSTR) ? ePermissionsExecutable : 0u);
Kate Stoneb9c1b512016-09-06 20:57:50 +00001910 switch (header.sh_type) {
1911 case SHT_SYMTAB:
1912 assert(sect_type == eSectionTypeOther);
1913 sect_type = eSectionTypeELFSymbolTable;
1914 break;
1915 case SHT_DYNSYM:
1916 assert(sect_type == eSectionTypeOther);
1917 sect_type = eSectionTypeELFDynamicSymbols;
1918 break;
1919 case SHT_RELA:
1920 case SHT_REL:
1921 assert(sect_type == eSectionTypeOther);
1922 sect_type = eSectionTypeELFRelocationEntries;
1923 break;
1924 case SHT_DYNAMIC:
1925 assert(sect_type == eSectionTypeOther);
1926 sect_type = eSectionTypeELFDynamicLinkInfo;
1927 break;
1928 }
1929
1930 if (eSectionTypeOther == sect_type) {
1931 // the kalimba toolchain assumes that ELF section names are free-form.
Adrian Prantl05097242018-04-30 16:49:04 +00001932 // It does support linkscripts which (can) give rise to various
1933 // arbitrarily named sections being "Code" or "Data".
Kate Stoneb9c1b512016-09-06 20:57:50 +00001934 sect_type = kalimbaSectionType(m_header, header);
1935 }
1936
Pavel Labathedb01272018-04-30 13:23:47 +00001937 // In common case ELF code section can have arbitrary name (for example,
1938 // we can specify it using section attribute for particular function) so
1939 // assume that section is a code section if it has SHF_EXECINSTR flag set
1940 // and has SHT_PROGBITS type.
1941 if (eSectionTypeOther == sect_type &&
1942 llvm::ELF::SHT_PROGBITS == header.sh_type &&
1943 (header.sh_flags & SHF_EXECINSTR)) {
1944 sect_type = eSectionTypeCode;
1945 }
1946
Kate Stoneb9c1b512016-09-06 20:57:50 +00001947 const uint32_t target_bytes_size =
1948 (eSectionTypeData == sect_type || eSectionTypeZeroFill == sect_type)
1949 ? m_arch_spec.GetDataByteSize()
1950 : eSectionTypeCode == sect_type ? m_arch_spec.GetCodeByteSize()
1951 : 1;
Kate Stoneb9c1b512016-09-06 20:57:50 +00001952 elf::elf_xword log2align =
1953 (header.sh_addralign == 0) ? 0 : llvm::Log2_64(header.sh_addralign);
Ed Masted13f6912017-10-02 14:35:07 +00001954
1955 uint64_t addr = header.sh_addr;
1956
1957 if ((header.sh_flags & SHF_ALLOC) && synthaddrs) {
1958 nextaddr =
1959 (nextaddr + header.sh_addralign - 1) & ~(header.sh_addralign - 1);
1960 addr = nextaddr;
1961 nextaddr += vm_size;
1962 }
1963
Kate Stoneb9c1b512016-09-06 20:57:50 +00001964 SectionSP section_sp(new Section(
1965 GetModule(), // Module to which this section belongs.
1966 this, // ObjectFile to which this section belongs and should read
1967 // section data from.
1968 SectionIndex(I), // Section ID.
Davide Italiano1e6a01f2018-05-12 01:25:48 +00001969 name, // Section name.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001970 sect_type, // Section type.
Ed Masted13f6912017-10-02 14:35:07 +00001971 addr, // VM address.
Kate Stoneb9c1b512016-09-06 20:57:50 +00001972 vm_size, // VM size in bytes of this section.
1973 header.sh_offset, // Offset of this section in the file.
1974 file_size, // Size of the section as found in the file.
1975 log2align, // Alignment of the section
1976 header.sh_flags, // Flags for this section.
1977 target_bytes_size)); // Number of host bytes per target byte
1978
1979 section_sp->SetPermissions(permissions);
1980 if (is_thread_specific)
1981 section_sp->SetIsThreadSpecific(is_thread_specific);
1982 m_sections_ap->AddSection(section_sp);
Andrew MacPherson17220c12014-03-05 10:12:43 +00001983 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00001984 }
1985
Pavel Labath3ef4eeb2018-03-09 12:30:09 +00001986 // For eTypeDebugInfo files, the Symbol Vendor will take care of updating the
1987 // unified section list.
1988 if (GetType() != eTypeDebugInfo)
1989 unified_section_list = *m_sections_ap;
Greg Clayton3046e662013-07-10 01:23:25 +00001990}
1991
Kate Stoneb9c1b512016-09-06 20:57:50 +00001992// Find the arm/aarch64 mapping symbol character in the given symbol name.
Adrian Prantl05097242018-04-30 16:49:04 +00001993// Mapping symbols have the form of "$<char>[.<any>]*". Additionally we
1994// recognize cases when the mapping symbol prefixed by an arbitrary string
1995// because if a symbol prefix added to each symbol in the object file with
Kate Stoneb9c1b512016-09-06 20:57:50 +00001996// objcopy then the mapping symbols are also prefixed.
1997static char FindArmAarch64MappingSymbol(const char *symbol_name) {
1998 if (!symbol_name)
1999 return '\0';
2000
2001 const char *dollar_pos = ::strchr(symbol_name, '$');
2002 if (!dollar_pos || dollar_pos[1] == '\0')
2003 return '\0';
2004
2005 if (dollar_pos[2] == '\0' || dollar_pos[2] == '.')
2006 return dollar_pos[1];
2007 return '\0';
2008}
2009
2010#define STO_MIPS_ISA (3 << 6)
2011#define STO_MICROMIPS (2 << 6)
2012#define IS_MICROMIPS(ST_OTHER) (((ST_OTHER)&STO_MIPS_ISA) == STO_MICROMIPS)
2013
2014// private
2015unsigned ObjectFileELF::ParseSymbols(Symtab *symtab, user_id_t start_id,
2016 SectionList *section_list,
2017 const size_t num_symbols,
2018 const DataExtractor &symtab_data,
2019 const DataExtractor &strtab_data) {
2020 ELFSymbol symbol;
2021 lldb::offset_t offset = 0;
2022
2023 static ConstString text_section_name(".text");
2024 static ConstString init_section_name(".init");
2025 static ConstString fini_section_name(".fini");
2026 static ConstString ctors_section_name(".ctors");
2027 static ConstString dtors_section_name(".dtors");
2028
2029 static ConstString data_section_name(".data");
2030 static ConstString rodata_section_name(".rodata");
2031 static ConstString rodata1_section_name(".rodata1");
2032 static ConstString data2_section_name(".data1");
2033 static ConstString bss_section_name(".bss");
2034 static ConstString opd_section_name(".opd"); // For ppc64
2035
2036 // On Android the oatdata and the oatexec symbols in the oat and odex files
Adrian Prantl05097242018-04-30 16:49:04 +00002037 // covers the full .text section what causes issues with displaying unusable
2038 // symbol name to the user and very slow unwinding speed because the
2039 // instruction emulation based unwind plans try to emulate all instructions
2040 // in these symbols. Don't add these symbols to the symbol list as they have
2041 // no use for the debugger and they are causing a lot of trouble. Filtering
2042 // can't be restricted to Android because this special object file don't
2043 // contain the note section specifying the environment to Android but the
2044 // custom extension and file name makes it highly unlikely that this will
2045 // collide with anything else.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002046 ConstString file_extension = m_file.GetFileNameExtension();
2047 bool skip_oatdata_oatexec = file_extension == ConstString("oat") ||
2048 file_extension == ConstString("odex");
2049
2050 ArchSpec arch;
2051 GetArchitecture(arch);
2052 ModuleSP module_sp(GetModule());
2053 SectionList *module_section_list =
2054 module_sp ? module_sp->GetSectionList() : nullptr;
2055
2056 // Local cache to avoid doing a FindSectionByName for each symbol. The "const
Adrian Prantl05097242018-04-30 16:49:04 +00002057 // char*" key must came from a ConstString object so they can be compared by
2058 // pointer
Kate Stoneb9c1b512016-09-06 20:57:50 +00002059 std::unordered_map<const char *, lldb::SectionSP> section_name_to_section;
2060
2061 unsigned i;
2062 for (i = 0; i < num_symbols; ++i) {
2063 if (symbol.Parse(symtab_data, &offset) == false)
2064 break;
2065
2066 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2067 if (!symbol_name)
2068 symbol_name = "";
2069
2070 // No need to add non-section symbols that have no names
2071 if (symbol.getType() != STT_SECTION &&
2072 (symbol_name == nullptr || symbol_name[0] == '\0'))
2073 continue;
2074
2075 // Skipping oatdata and oatexec sections if it is requested. See details
Adrian Prantl05097242018-04-30 16:49:04 +00002076 // above the definition of skip_oatdata_oatexec for the reasons.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002077 if (skip_oatdata_oatexec && (::strcmp(symbol_name, "oatdata") == 0 ||
2078 ::strcmp(symbol_name, "oatexec") == 0))
2079 continue;
2080
2081 SectionSP symbol_section_sp;
2082 SymbolType symbol_type = eSymbolTypeInvalid;
2083 Elf64_Half section_idx = symbol.st_shndx;
2084
2085 switch (section_idx) {
2086 case SHN_ABS:
2087 symbol_type = eSymbolTypeAbsolute;
2088 break;
2089 case SHN_UNDEF:
2090 symbol_type = eSymbolTypeUndefined;
2091 break;
2092 default:
2093 symbol_section_sp = section_list->GetSectionAtIndex(section_idx);
2094 break;
2095 }
2096
2097 // If a symbol is undefined do not process it further even if it has a STT
2098 // type
2099 if (symbol_type != eSymbolTypeUndefined) {
2100 switch (symbol.getType()) {
2101 default:
2102 case STT_NOTYPE:
2103 // The symbol's type is not specified.
2104 break;
2105
2106 case STT_OBJECT:
Adrian Prantl05097242018-04-30 16:49:04 +00002107 // The symbol is associated with a data object, such as a variable, an
2108 // array, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002109 symbol_type = eSymbolTypeData;
2110 break;
2111
2112 case STT_FUNC:
2113 // The symbol is associated with a function or other executable code.
2114 symbol_type = eSymbolTypeCode;
2115 break;
2116
2117 case STT_SECTION:
2118 // The symbol is associated with a section. Symbol table entries of
Adrian Prantl05097242018-04-30 16:49:04 +00002119 // this type exist primarily for relocation and normally have STB_LOCAL
2120 // binding.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002121 break;
2122
2123 case STT_FILE:
Adrian Prantl05097242018-04-30 16:49:04 +00002124 // Conventionally, the symbol's name gives the name of the source file
2125 // associated with the object file. A file symbol has STB_LOCAL
Kate Stoneb9c1b512016-09-06 20:57:50 +00002126 // binding, its section index is SHN_ABS, and it precedes the other
2127 // STB_LOCAL symbols for the file, if it is present.
2128 symbol_type = eSymbolTypeSourceFile;
2129 break;
2130
2131 case STT_GNU_IFUNC:
2132 // The symbol is associated with an indirect function. The actual
2133 // function will be resolved if it is referenced.
2134 symbol_type = eSymbolTypeResolver;
2135 break;
2136 }
2137 }
2138
2139 if (symbol_type == eSymbolTypeInvalid && symbol.getType() != STT_SECTION) {
2140 if (symbol_section_sp) {
2141 const ConstString &sect_name = symbol_section_sp->GetName();
2142 if (sect_name == text_section_name || sect_name == init_section_name ||
2143 sect_name == fini_section_name || sect_name == ctors_section_name ||
2144 sect_name == dtors_section_name) {
2145 symbol_type = eSymbolTypeCode;
2146 } else if (sect_name == data_section_name ||
2147 sect_name == data2_section_name ||
2148 sect_name == rodata_section_name ||
2149 sect_name == rodata1_section_name ||
2150 sect_name == bss_section_name) {
2151 symbol_type = eSymbolTypeData;
2152 }
2153 }
2154 }
2155
2156 int64_t symbol_value_offset = 0;
2157 uint32_t additional_flags = 0;
2158
2159 if (arch.IsValid()) {
2160 if (arch.GetMachine() == llvm::Triple::arm) {
2161 if (symbol.getBinding() == STB_LOCAL) {
2162 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2163 if (symbol_type == eSymbolTypeCode) {
2164 switch (mapping_symbol) {
2165 case 'a':
2166 // $a[.<any>]* - marks an ARM instruction sequence
2167 m_address_class_map[symbol.st_value] = eAddressClassCode;
2168 break;
2169 case 'b':
2170 case 't':
2171 // $b[.<any>]* - marks a THUMB BL instruction sequence
2172 // $t[.<any>]* - marks a THUMB instruction sequence
2173 m_address_class_map[symbol.st_value] =
2174 eAddressClassCodeAlternateISA;
2175 break;
2176 case 'd':
2177 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2178 m_address_class_map[symbol.st_value] = eAddressClassData;
2179 break;
2180 }
2181 }
2182 if (mapping_symbol)
2183 continue;
2184 }
2185 } else if (arch.GetMachine() == llvm::Triple::aarch64) {
2186 if (symbol.getBinding() == STB_LOCAL) {
2187 char mapping_symbol = FindArmAarch64MappingSymbol(symbol_name);
2188 if (symbol_type == eSymbolTypeCode) {
2189 switch (mapping_symbol) {
2190 case 'x':
2191 // $x[.<any>]* - marks an A64 instruction sequence
2192 m_address_class_map[symbol.st_value] = eAddressClassCode;
2193 break;
2194 case 'd':
2195 // $d[.<any>]* - marks a data item sequence (e.g. lit pool)
2196 m_address_class_map[symbol.st_value] = eAddressClassData;
2197 break;
2198 }
2199 }
2200 if (mapping_symbol)
2201 continue;
2202 }
2203 }
2204
2205 if (arch.GetMachine() == llvm::Triple::arm) {
2206 if (symbol_type == eSymbolTypeCode) {
2207 if (symbol.st_value & 1) {
Adrian Prantl05097242018-04-30 16:49:04 +00002208 // Subtracting 1 from the address effectively unsets the low order
2209 // bit, which results in the address actually pointing to the
2210 // beginning of the symbol. This delta will be used below in
2211 // conjunction with symbol.st_value to produce the final
2212 // symbol_value that we store in the symtab.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002213 symbol_value_offset = -1;
2214 m_address_class_map[symbol.st_value ^ 1] =
2215 eAddressClassCodeAlternateISA;
2216 } else {
2217 // This address is ARM
2218 m_address_class_map[symbol.st_value] = eAddressClassCode;
2219 }
2220 }
2221 }
2222
2223 /*
2224 * MIPS:
2225 * The bit #0 of an address is used for ISA mode (1 for microMIPS, 0 for
2226 * MIPS).
2227 * This allows processor to switch between microMIPS and MIPS without any
2228 * need
2229 * for special mode-control register. However, apart from .debug_line,
2230 * none of
2231 * the ELF/DWARF sections set the ISA bit (for symbol or section). Use
2232 * st_other
2233 * flag to check whether the symbol is microMIPS and then set the address
2234 * class
2235 * accordingly.
2236 */
2237 const llvm::Triple::ArchType llvm_arch = arch.GetMachine();
2238 if (llvm_arch == llvm::Triple::mips ||
2239 llvm_arch == llvm::Triple::mipsel ||
2240 llvm_arch == llvm::Triple::mips64 ||
2241 llvm_arch == llvm::Triple::mips64el) {
2242 if (IS_MICROMIPS(symbol.st_other))
2243 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2244 else if ((symbol.st_value & 1) && (symbol_type == eSymbolTypeCode)) {
2245 symbol.st_value = symbol.st_value & (~1ull);
2246 m_address_class_map[symbol.st_value] = eAddressClassCodeAlternateISA;
2247 } else {
2248 if (symbol_type == eSymbolTypeCode)
2249 m_address_class_map[symbol.st_value] = eAddressClassCode;
2250 else if (symbol_type == eSymbolTypeData)
2251 m_address_class_map[symbol.st_value] = eAddressClassData;
2252 else
2253 m_address_class_map[symbol.st_value] = eAddressClassUnknown;
2254 }
2255 }
2256 }
2257
2258 // symbol_value_offset may contain 0 for ARM symbols or -1 for THUMB
Adrian Prantl05097242018-04-30 16:49:04 +00002259 // symbols. See above for more details.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002260 uint64_t symbol_value = symbol.st_value + symbol_value_offset;
2261
2262 if (symbol_section_sp == nullptr && section_idx == SHN_ABS &&
2263 symbol.st_size != 0) {
2264 // We don't have a section for a symbol with non-zero size. Create a new
Adrian Prantl05097242018-04-30 16:49:04 +00002265 // section for it so the address range covered by the symbol is also
2266 // covered by the module (represented through the section list). It is
2267 // needed so module lookup for the addresses covered by this symbol will
2268 // be successfull. This case happens for absolute symbols.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002269 ConstString fake_section_name(std::string(".absolute.") + symbol_name);
2270 symbol_section_sp =
2271 std::make_shared<Section>(module_sp, this, SHN_ABS, fake_section_name,
2272 eSectionTypeAbsoluteAddress, symbol_value,
2273 symbol.st_size, 0, 0, 0, SHF_ALLOC);
2274
2275 module_section_list->AddSection(symbol_section_sp);
2276 section_list->AddSection(symbol_section_sp);
2277 }
2278
2279 if (symbol_section_sp &&
2280 CalculateType() != ObjectFile::Type::eTypeObjectFile)
2281 symbol_value -= symbol_section_sp->GetFileAddress();
2282
2283 if (symbol_section_sp && module_section_list &&
2284 module_section_list != section_list) {
2285 const ConstString &sect_name = symbol_section_sp->GetName();
2286 auto section_it = section_name_to_section.find(sect_name.GetCString());
2287 if (section_it == section_name_to_section.end())
2288 section_it =
2289 section_name_to_section
2290 .emplace(sect_name.GetCString(),
2291 module_section_list->FindSectionByName(sect_name))
2292 .first;
Pavel Labathefddda3d2017-05-02 12:40:31 +00002293 if (section_it->second)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002294 symbol_section_sp = section_it->second;
2295 }
2296
2297 bool is_global = symbol.getBinding() == STB_GLOBAL;
2298 uint32_t flags = symbol.st_other << 8 | symbol.st_info | additional_flags;
2299 bool is_mangled = (symbol_name[0] == '_' && symbol_name[1] == 'Z');
2300
2301 llvm::StringRef symbol_ref(symbol_name);
2302
2303 // Symbol names may contain @VERSION suffixes. Find those and strip them
2304 // temporarily.
2305 size_t version_pos = symbol_ref.find('@');
2306 bool has_suffix = version_pos != llvm::StringRef::npos;
2307 llvm::StringRef symbol_bare = symbol_ref.substr(0, version_pos);
2308 Mangled mangled(ConstString(symbol_bare), is_mangled);
2309
2310 // Now append the suffix back to mangled and unmangled names. Only do it if
Adrian Prantl05097242018-04-30 16:49:04 +00002311 // the demangling was successful (string is not empty).
Kate Stoneb9c1b512016-09-06 20:57:50 +00002312 if (has_suffix) {
2313 llvm::StringRef suffix = symbol_ref.substr(version_pos);
2314
2315 llvm::StringRef mangled_name = mangled.GetMangledName().GetStringRef();
2316 if (!mangled_name.empty())
2317 mangled.SetMangledName(ConstString((mangled_name + suffix).str()));
2318
2319 ConstString demangled =
2320 mangled.GetDemangledName(lldb::eLanguageTypeUnknown);
2321 llvm::StringRef demangled_name = demangled.GetStringRef();
2322 if (!demangled_name.empty())
2323 mangled.SetDemangledName(ConstString((demangled_name + suffix).str()));
2324 }
2325
2326 // In ELF all symbol should have a valid size but it is not true for some
Adrian Prantl05097242018-04-30 16:49:04 +00002327 // function symbols coming from hand written assembly. As none of the
2328 // function symbol should have 0 size we try to calculate the size for
2329 // these symbols in the symtab with saying that their original size is not
2330 // valid.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002331 bool symbol_size_valid =
2332 symbol.st_size != 0 || symbol.getType() != STT_FUNC;
2333
2334 Symbol dc_symbol(
2335 i + start_id, // ID is the original symbol table index.
2336 mangled,
2337 symbol_type, // Type of this symbol
2338 is_global, // Is this globally visible?
2339 false, // Is this symbol debug info?
2340 false, // Is this symbol a trampoline?
2341 false, // Is this symbol artificial?
2342 AddressRange(symbol_section_sp, // Section in which this symbol is
2343 // defined or null.
2344 symbol_value, // Offset in section or symbol value.
2345 symbol.st_size), // Size in bytes of this symbol.
2346 symbol_size_valid, // Symbol size is valid
2347 has_suffix, // Contains linker annotations?
2348 flags); // Symbol flags.
2349 symtab->AddSymbol(dc_symbol);
2350 }
2351 return i;
2352}
2353
2354unsigned ObjectFileELF::ParseSymbolTable(Symtab *symbol_table,
2355 user_id_t start_id,
2356 lldb_private::Section *symtab) {
2357 if (symtab->GetObjectFile() != this) {
2358 // If the symbol table section is owned by a different object file, have it
Adrian Prantl05097242018-04-30 16:49:04 +00002359 // do the parsing.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002360 ObjectFileELF *obj_file_elf =
2361 static_cast<ObjectFileELF *>(symtab->GetObjectFile());
2362 return obj_file_elf->ParseSymbolTable(symbol_table, start_id, symtab);
2363 }
2364
2365 // Get section list for this object file.
2366 SectionList *section_list = m_sections_ap.get();
2367 if (!section_list)
2368 return 0;
2369
2370 user_id_t symtab_id = symtab->GetID();
2371 const ELFSectionHeaderInfo *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2372 assert(symtab_hdr->sh_type == SHT_SYMTAB ||
2373 symtab_hdr->sh_type == SHT_DYNSYM);
2374
Adrian Prantl05097242018-04-30 16:49:04 +00002375 // sh_link: section header index of associated string table. Section ID's are
2376 // ones based.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002377 user_id_t strtab_id = symtab_hdr->sh_link + 1;
2378 Section *strtab = section_list->FindSectionByID(strtab_id).get();
2379
2380 if (symtab && strtab) {
2381 assert(symtab->GetObjectFile() == this);
2382 assert(strtab->GetObjectFile() == this);
2383
2384 DataExtractor symtab_data;
2385 DataExtractor strtab_data;
2386 if (ReadSectionData(symtab, symtab_data) &&
2387 ReadSectionData(strtab, strtab_data)) {
2388 size_t num_symbols = symtab_data.GetByteSize() / symtab_hdr->sh_entsize;
2389
2390 return ParseSymbols(symbol_table, start_id, section_list, num_symbols,
2391 symtab_data, strtab_data);
2392 }
2393 }
2394
2395 return 0;
2396}
2397
2398size_t ObjectFileELF::ParseDynamicSymbols() {
2399 if (m_dynamic_symbols.size())
2400 return m_dynamic_symbols.size();
2401
2402 SectionList *section_list = GetSectionList();
2403 if (!section_list)
2404 return 0;
2405
2406 // Find the SHT_DYNAMIC section.
2407 Section *dynsym =
2408 section_list->FindSectionByType(eSectionTypeELFDynamicLinkInfo, true)
2409 .get();
2410 if (!dynsym)
2411 return 0;
2412 assert(dynsym->GetObjectFile() == this);
2413
2414 ELFDynamic symbol;
2415 DataExtractor dynsym_data;
2416 if (ReadSectionData(dynsym, dynsym_data)) {
2417 const lldb::offset_t section_size = dynsym_data.GetByteSize();
2418 lldb::offset_t cursor = 0;
2419
2420 while (cursor < section_size) {
2421 if (!symbol.Parse(dynsym_data, &cursor))
2422 break;
2423
2424 m_dynamic_symbols.push_back(symbol);
2425 }
2426 }
2427
2428 return m_dynamic_symbols.size();
2429}
2430
2431const ELFDynamic *ObjectFileELF::FindDynamicSymbol(unsigned tag) {
2432 if (!ParseDynamicSymbols())
2433 return NULL;
2434
2435 DynamicSymbolCollIter I = m_dynamic_symbols.begin();
2436 DynamicSymbolCollIter E = m_dynamic_symbols.end();
2437 for (; I != E; ++I) {
2438 ELFDynamic *symbol = &*I;
2439
2440 if (symbol->d_tag == tag)
2441 return symbol;
2442 }
2443
2444 return NULL;
2445}
2446
2447unsigned ObjectFileELF::PLTRelocationType() {
2448 // DT_PLTREL
2449 // This member specifies the type of relocation entry to which the
2450 // procedure linkage table refers. The d_val member holds DT_REL or
2451 // DT_RELA, as appropriate. All relocations in a procedure linkage table
2452 // must use the same relocation.
2453 const ELFDynamic *symbol = FindDynamicSymbol(DT_PLTREL);
2454
2455 if (symbol)
2456 return symbol->d_val;
2457
2458 return 0;
2459}
2460
Adrian Prantl05097242018-04-30 16:49:04 +00002461// Returns the size of the normal plt entries and the offset of the first
2462// normal plt entry. The 0th entry in the plt table is usually a resolution
2463// entry which have different size in some architectures then the rest of the
2464// plt entries.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002465static std::pair<uint64_t, uint64_t>
2466GetPltEntrySizeAndOffset(const ELFSectionHeader *rel_hdr,
2467 const ELFSectionHeader *plt_hdr) {
2468 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2469
Adrian Prantl05097242018-04-30 16:49:04 +00002470 // Clang 3.3 sets entsize to 4 for 32-bit binaries, but the plt entries are
2471 // 16 bytes. So round the entsize up by the alignment if addralign is set.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002472 elf_xword plt_entsize =
2473 plt_hdr->sh_addralign
2474 ? llvm::alignTo(plt_hdr->sh_entsize, plt_hdr->sh_addralign)
2475 : plt_hdr->sh_entsize;
2476
2477 // Some linkers e.g ld for arm, fill plt_hdr->sh_entsize field incorrectly.
2478 // PLT entries relocation code in general requires multiple instruction and
2479 // should be greater than 4 bytes in most cases. Try to guess correct size
2480 // just in case.
2481 if (plt_entsize <= 4) {
2482 // The linker haven't set the plt_hdr->sh_entsize field. Try to guess the
Adrian Prantl05097242018-04-30 16:49:04 +00002483 // size of the plt entries based on the number of entries and the size of
2484 // the plt section with the assumption that the size of the 0th entry is at
2485 // least as big as the size of the normal entries and it isn't much bigger
2486 // then that.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002487 if (plt_hdr->sh_addralign)
2488 plt_entsize = plt_hdr->sh_size / plt_hdr->sh_addralign /
2489 (num_relocations + 1) * plt_hdr->sh_addralign;
2490 else
2491 plt_entsize = plt_hdr->sh_size / (num_relocations + 1);
2492 }
2493
2494 elf_xword plt_offset = plt_hdr->sh_size - num_relocations * plt_entsize;
2495
2496 return std::make_pair(plt_entsize, plt_offset);
2497}
2498
2499static unsigned ParsePLTRelocations(
2500 Symtab *symbol_table, user_id_t start_id, unsigned rel_type,
2501 const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2502 const ELFSectionHeader *plt_hdr, const ELFSectionHeader *sym_hdr,
2503 const lldb::SectionSP &plt_section_sp, DataExtractor &rel_data,
2504 DataExtractor &symtab_data, DataExtractor &strtab_data) {
2505 ELFRelocation rel(rel_type);
2506 ELFSymbol symbol;
2507 lldb::offset_t offset = 0;
2508
2509 uint64_t plt_offset, plt_entsize;
2510 std::tie(plt_entsize, plt_offset) =
2511 GetPltEntrySizeAndOffset(rel_hdr, plt_hdr);
2512 const elf_xword num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2513
2514 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2515 reloc_info_fn reloc_type;
2516 reloc_info_fn reloc_symbol;
2517
2518 if (hdr->Is32Bit()) {
2519 reloc_type = ELFRelocation::RelocType32;
2520 reloc_symbol = ELFRelocation::RelocSymbol32;
2521 } else {
2522 reloc_type = ELFRelocation::RelocType64;
2523 reloc_symbol = ELFRelocation::RelocSymbol64;
2524 }
2525
2526 unsigned slot_type = hdr->GetRelocationJumpSlotType();
2527 unsigned i;
2528 for (i = 0; i < num_relocations; ++i) {
2529 if (rel.Parse(rel_data, &offset) == false)
2530 break;
2531
2532 if (reloc_type(rel) != slot_type)
2533 continue;
2534
2535 lldb::offset_t symbol_offset = reloc_symbol(rel) * sym_hdr->sh_entsize;
2536 if (!symbol.Parse(symtab_data, &symbol_offset))
2537 break;
2538
2539 const char *symbol_name = strtab_data.PeekCStr(symbol.st_name);
2540 bool is_mangled =
2541 symbol_name ? (symbol_name[0] == '_' && symbol_name[1] == 'Z') : false;
2542 uint64_t plt_index = plt_offset + i * plt_entsize;
2543
2544 Symbol jump_symbol(
2545 i + start_id, // Symbol table index
2546 symbol_name, // symbol name.
2547 is_mangled, // is the symbol name mangled?
2548 eSymbolTypeTrampoline, // Type of this symbol
2549 false, // Is this globally visible?
2550 false, // Is this symbol debug info?
2551 true, // Is this symbol a trampoline?
2552 true, // Is this symbol artificial?
2553 plt_section_sp, // Section in which this symbol is defined or null.
2554 plt_index, // Offset in section or symbol value.
2555 plt_entsize, // Size in bytes of this symbol.
2556 true, // Size is valid
2557 false, // Contains linker annotations?
2558 0); // Symbol flags.
2559
2560 symbol_table->AddSymbol(jump_symbol);
2561 }
2562
2563 return i;
2564}
2565
2566unsigned
2567ObjectFileELF::ParseTrampolineSymbols(Symtab *symbol_table, user_id_t start_id,
2568 const ELFSectionHeaderInfo *rel_hdr,
2569 user_id_t rel_id) {
2570 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2571
2572 // The link field points to the associated symbol table.
2573 user_id_t symtab_id = rel_hdr->sh_link;
2574
2575 // If the link field doesn't point to the appropriate symbol name table then
2576 // try to find it by name as some compiler don't fill in the link fields.
2577 if (!symtab_id)
2578 symtab_id = GetSectionIndexByName(".dynsym");
2579
2580 // Get PLT section. We cannot use rel_hdr->sh_info, since current linkers
2581 // point that to the .got.plt or .got section instead of .plt.
2582 user_id_t plt_id = GetSectionIndexByName(".plt");
2583
2584 if (!symtab_id || !plt_id)
2585 return 0;
2586
2587 // Section ID's are ones based;
2588 symtab_id++;
2589 plt_id++;
2590
2591 const ELFSectionHeaderInfo *plt_hdr = GetSectionHeaderByIndex(plt_id);
2592 if (!plt_hdr)
2593 return 0;
2594
2595 const ELFSectionHeaderInfo *sym_hdr = GetSectionHeaderByIndex(symtab_id);
2596 if (!sym_hdr)
2597 return 0;
2598
2599 SectionList *section_list = m_sections_ap.get();
2600 if (!section_list)
2601 return 0;
2602
2603 Section *rel_section = section_list->FindSectionByID(rel_id).get();
2604 if (!rel_section)
2605 return 0;
2606
2607 SectionSP plt_section_sp(section_list->FindSectionByID(plt_id));
2608 if (!plt_section_sp)
2609 return 0;
2610
2611 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2612 if (!symtab)
2613 return 0;
2614
2615 // sh_link points to associated string table.
2616 Section *strtab = section_list->FindSectionByID(sym_hdr->sh_link + 1).get();
2617 if (!strtab)
2618 return 0;
2619
2620 DataExtractor rel_data;
2621 if (!ReadSectionData(rel_section, rel_data))
2622 return 0;
2623
2624 DataExtractor symtab_data;
2625 if (!ReadSectionData(symtab, symtab_data))
2626 return 0;
2627
2628 DataExtractor strtab_data;
2629 if (!ReadSectionData(strtab, strtab_data))
2630 return 0;
2631
2632 unsigned rel_type = PLTRelocationType();
2633 if (!rel_type)
2634 return 0;
2635
2636 return ParsePLTRelocations(symbol_table, start_id, rel_type, &m_header,
2637 rel_hdr, plt_hdr, sym_hdr, plt_section_sp,
2638 rel_data, symtab_data, strtab_data);
2639}
2640
Ed Masted13f6912017-10-02 14:35:07 +00002641unsigned ObjectFileELF::ApplyRelocations(
Kate Stoneb9c1b512016-09-06 20:57:50 +00002642 Symtab *symtab, const ELFHeader *hdr, const ELFSectionHeader *rel_hdr,
2643 const ELFSectionHeader *symtab_hdr, const ELFSectionHeader *debug_hdr,
2644 DataExtractor &rel_data, DataExtractor &symtab_data,
2645 DataExtractor &debug_data, Section *rel_section) {
2646 ELFRelocation rel(rel_hdr->sh_type);
2647 lldb::addr_t offset = 0;
2648 const unsigned num_relocations = rel_hdr->sh_size / rel_hdr->sh_entsize;
2649 typedef unsigned (*reloc_info_fn)(const ELFRelocation &rel);
2650 reloc_info_fn reloc_type;
2651 reloc_info_fn reloc_symbol;
2652
2653 if (hdr->Is32Bit()) {
2654 reloc_type = ELFRelocation::RelocType32;
2655 reloc_symbol = ELFRelocation::RelocSymbol32;
2656 } else {
2657 reloc_type = ELFRelocation::RelocType64;
2658 reloc_symbol = ELFRelocation::RelocSymbol64;
2659 }
2660
2661 for (unsigned i = 0; i < num_relocations; ++i) {
2662 if (rel.Parse(rel_data, &offset) == false)
2663 break;
2664
2665 Symbol *symbol = NULL;
2666
2667 if (hdr->Is32Bit()) {
2668 switch (reloc_type(rel)) {
2669 case R_386_32:
2670 case R_386_PC32:
2671 default:
Zachary Turnera6d54642017-12-02 00:15:29 +00002672 // FIXME: This asserts with this input:
2673 //
2674 // foo.cpp
2675 // int main(int argc, char **argv) { return 0; }
2676 //
2677 // clang++.exe --target=i686-unknown-linux-gnu -g -c foo.cpp -o foo.o
2678 //
2679 // and running this on the foo.o module.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002680 assert(false && "unexpected relocation type");
2681 }
2682 } else {
2683 switch (reloc_type(rel)) {
2684 case R_X86_64_64: {
2685 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2686 if (symbol) {
2687 addr_t value = symbol->GetAddressRef().GetFileAddress();
2688 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2689 uint64_t *dst = reinterpret_cast<uint64_t *>(
2690 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2691 ELFRelocation::RelocOffset64(rel));
2692 *dst = value + ELFRelocation::RelocAddend64(rel);
2693 }
2694 break;
2695 }
2696 case R_X86_64_32:
2697 case R_X86_64_32S: {
2698 symbol = symtab->FindSymbolByID(reloc_symbol(rel));
2699 if (symbol) {
2700 addr_t value = symbol->GetAddressRef().GetFileAddress();
2701 value += ELFRelocation::RelocAddend32(rel);
2702 assert(
2703 (reloc_type(rel) == R_X86_64_32 && (value <= UINT32_MAX)) ||
2704 (reloc_type(rel) == R_X86_64_32S &&
2705 ((int64_t)value <= INT32_MAX && (int64_t)value >= INT32_MIN)));
2706 uint32_t truncated_addr = (value & 0xFFFFFFFF);
2707 DataBufferSP &data_buffer_sp = debug_data.GetSharedDataBuffer();
2708 uint32_t *dst = reinterpret_cast<uint32_t *>(
2709 data_buffer_sp->GetBytes() + rel_section->GetFileOffset() +
2710 ELFRelocation::RelocOffset32(rel));
2711 *dst = truncated_addr;
2712 }
2713 break;
2714 }
2715 case R_X86_64_PC32:
2716 default:
2717 assert(false && "unexpected relocation type");
2718 }
2719 }
2720 }
2721
2722 return 0;
2723}
2724
2725unsigned ObjectFileELF::RelocateDebugSections(const ELFSectionHeader *rel_hdr,
Ed Masted13f6912017-10-02 14:35:07 +00002726 user_id_t rel_id,
2727 lldb_private::Symtab *thetab) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00002728 assert(rel_hdr->sh_type == SHT_RELA || rel_hdr->sh_type == SHT_REL);
2729
2730 // Parse in the section list if needed.
2731 SectionList *section_list = GetSectionList();
2732 if (!section_list)
2733 return 0;
2734
2735 // Section ID's are ones based.
2736 user_id_t symtab_id = rel_hdr->sh_link + 1;
2737 user_id_t debug_id = rel_hdr->sh_info + 1;
2738
2739 const ELFSectionHeader *symtab_hdr = GetSectionHeaderByIndex(symtab_id);
2740 if (!symtab_hdr)
2741 return 0;
2742
2743 const ELFSectionHeader *debug_hdr = GetSectionHeaderByIndex(debug_id);
2744 if (!debug_hdr)
2745 return 0;
2746
2747 Section *rel = section_list->FindSectionByID(rel_id).get();
2748 if (!rel)
2749 return 0;
2750
2751 Section *symtab = section_list->FindSectionByID(symtab_id).get();
2752 if (!symtab)
2753 return 0;
2754
2755 Section *debug = section_list->FindSectionByID(debug_id).get();
2756 if (!debug)
2757 return 0;
2758
2759 DataExtractor rel_data;
2760 DataExtractor symtab_data;
2761 DataExtractor debug_data;
2762
Ed Masted13f6912017-10-02 14:35:07 +00002763 if (GetData(rel->GetFileOffset(), rel->GetFileSize(), rel_data) &&
2764 GetData(symtab->GetFileOffset(), symtab->GetFileSize(), symtab_data) &&
2765 GetData(debug->GetFileOffset(), debug->GetFileSize(), debug_data)) {
2766 ApplyRelocations(thetab, &m_header, rel_hdr, symtab_hdr, debug_hdr,
2767 rel_data, symtab_data, debug_data, debug);
Kate Stoneb9c1b512016-09-06 20:57:50 +00002768 }
2769
2770 return 0;
2771}
2772
2773Symtab *ObjectFileELF::GetSymtab() {
2774 ModuleSP module_sp(GetModule());
2775 if (!module_sp)
2776 return NULL;
2777
2778 // We always want to use the main object file so we (hopefully) only have one
Adrian Prantl05097242018-04-30 16:49:04 +00002779 // cached copy of our symtab, dynamic sections, etc.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002780 ObjectFile *module_obj_file = module_sp->GetObjectFile();
2781 if (module_obj_file && module_obj_file != this)
2782 return module_obj_file->GetSymtab();
2783
2784 if (m_symtab_ap.get() == NULL) {
2785 SectionList *section_list = module_sp->GetSectionList();
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002786 if (!section_list)
Kate Stoneb9c1b512016-09-06 20:57:50 +00002787 return NULL;
Ashok Thirumurthi35729bb2013-09-24 15:34:13 +00002788
Kate Stoneb9c1b512016-09-06 20:57:50 +00002789 uint64_t symbol_id = 0;
2790 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002791
Kate Stoneb9c1b512016-09-06 20:57:50 +00002792 // Sharable objects and dynamic executables usually have 2 distinct symbol
2793 // tables, one named ".symtab", and the other ".dynsym". The dynsym is a
Adrian Prantl05097242018-04-30 16:49:04 +00002794 // smaller version of the symtab that only contains global symbols. The
2795 // information found in the dynsym is therefore also found in the symtab,
2796 // while the reverse is not necessarily true.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002797 Section *symtab =
2798 section_list->FindSectionByType(eSectionTypeELFSymbolTable, true).get();
2799 if (!symtab) {
2800 // The symtab section is non-allocable and can be stripped, so if it
Adrian Prantl05097242018-04-30 16:49:04 +00002801 // doesn't exist then use the dynsym section which should always be
2802 // there.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002803 symtab =
2804 section_list->FindSectionByType(eSectionTypeELFDynamicSymbols, true)
2805 .get();
2806 }
2807 if (symtab) {
2808 m_symtab_ap.reset(new Symtab(symtab->GetObjectFile()));
2809 symbol_id += ParseSymbolTable(m_symtab_ap.get(), symbol_id, symtab);
2810 }
2811
2812 // DT_JMPREL
2813 // If present, this entry's d_ptr member holds the address of
2814 // relocation
2815 // entries associated solely with the procedure linkage table.
2816 // Separating
2817 // these relocation entries lets the dynamic linker ignore them during
2818 // process initialization, if lazy binding is enabled. If this entry is
2819 // present, the related entries of types DT_PLTRELSZ and DT_PLTREL must
2820 // also be present.
2821 const ELFDynamic *symbol = FindDynamicSymbol(DT_JMPREL);
2822 if (symbol) {
2823 // Synthesize trampoline symbols to help navigate the PLT.
2824 addr_t addr = symbol->d_ptr;
2825 Section *reloc_section =
2826 section_list->FindSectionContainingFileAddress(addr).get();
2827 if (reloc_section) {
2828 user_id_t reloc_id = reloc_section->GetID();
2829 const ELFSectionHeaderInfo *reloc_header =
2830 GetSectionHeaderByIndex(reloc_id);
2831 assert(reloc_header);
2832
2833 if (m_symtab_ap == nullptr)
2834 m_symtab_ap.reset(new Symtab(reloc_section->GetObjectFile()));
2835
2836 ParseTrampolineSymbols(m_symtab_ap.get(), symbol_id, reloc_header,
2837 reloc_id);
2838 }
2839 }
2840
2841 DWARFCallFrameInfo *eh_frame = GetUnwindTable().GetEHFrameInfo();
2842 if (eh_frame) {
2843 if (m_symtab_ap == nullptr)
2844 m_symtab_ap.reset(new Symtab(this));
2845 ParseUnwindSymbols(m_symtab_ap.get(), eh_frame);
2846 }
2847
2848 // If we still don't have any symtab then create an empty instance to avoid
Adrian Prantl05097242018-04-30 16:49:04 +00002849 // do the section lookup next time.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002850 if (m_symtab_ap == nullptr)
2851 m_symtab_ap.reset(new Symtab(this));
2852
2853 m_symtab_ap->CalculateSymbolSizes();
2854 }
2855
Ed Masted13f6912017-10-02 14:35:07 +00002856 return m_symtab_ap.get();
2857}
2858
2859void ObjectFileELF::RelocateSection(lldb_private::Section *section)
2860{
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002861 static const char *debug_prefix = ".debug";
Ed Masted13f6912017-10-02 14:35:07 +00002862
Adrian Prantl05097242018-04-30 16:49:04 +00002863 // Set relocated bit so we stop getting called, regardless of whether we
2864 // actually relocate.
Ed Masted13f6912017-10-02 14:35:07 +00002865 section->SetIsRelocated(true);
2866
2867 // We only relocate in ELF relocatable files
2868 if (CalculateType() != eTypeObjectFile)
2869 return;
2870
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002871 const char *section_name = section->GetName().GetCString();
Ed Masted13f6912017-10-02 14:35:07 +00002872 // Can't relocate that which can't be named
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002873 if (section_name == nullptr)
Ed Masted13f6912017-10-02 14:35:07 +00002874 return;
2875
2876 // We don't relocate non-debug sections at the moment
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002877 if (strncmp(section_name, debug_prefix, strlen(debug_prefix)))
Ed Masted13f6912017-10-02 14:35:07 +00002878 return;
2879
2880 // Relocation section names to look for
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002881 std::string needle = std::string(".rel") + section_name;
2882 std::string needlea = std::string(".rela") + section_name;
Ed Masted13f6912017-10-02 14:35:07 +00002883
Kate Stoneb9c1b512016-09-06 20:57:50 +00002884 for (SectionHeaderCollIter I = m_section_headers.begin();
2885 I != m_section_headers.end(); ++I) {
2886 if (I->sh_type == SHT_RELA || I->sh_type == SHT_REL) {
Ed Masted13f6912017-10-02 14:35:07 +00002887 const char *hay_name = I->section_name.GetCString();
2888 if (hay_name == nullptr)
2889 continue;
2890 if (needle == hay_name || needlea == hay_name) {
2891 const ELFSectionHeader &reloc_header = *I;
2892 user_id_t reloc_id = SectionIndex(I);
2893 RelocateDebugSections(&reloc_header, reloc_id, GetSymtab());
2894 break;
Kate Stoneb9c1b512016-09-06 20:57:50 +00002895 }
2896 }
2897 }
Tamas Berghammer6b63b142016-02-18 11:12:18 +00002898}
Tamas Berghammer5bfd4d02016-02-10 12:10:58 +00002899
Kate Stoneb9c1b512016-09-06 20:57:50 +00002900void ObjectFileELF::ParseUnwindSymbols(Symtab *symbol_table,
2901 DWARFCallFrameInfo *eh_frame) {
2902 SectionList *section_list = GetSectionList();
2903 if (!section_list)
2904 return;
2905
2906 // First we save the new symbols into a separate list and add them to the
Adrian Prantl05097242018-04-30 16:49:04 +00002907 // symbol table after we colleced all symbols we want to add. This is
Davide Italiano1e6a01f2018-05-12 01:25:48 +00002908 // neccessary because adding a new symbol invalidates the internal index of
Adrian Prantl05097242018-04-30 16:49:04 +00002909 // the symtab what causing the next lookup to be slow because it have to
2910 // recalculate the index first.
Kate Stoneb9c1b512016-09-06 20:57:50 +00002911 std::vector<Symbol> new_symbols;
2912
2913 eh_frame->ForEachFDEEntries([this, symbol_table, section_list, &new_symbols](
2914 lldb::addr_t file_addr, uint32_t size, dw_offset_t) {
2915 Symbol *symbol = symbol_table->FindSymbolAtFileAddress(file_addr);
2916 if (symbol) {
2917 if (!symbol->GetByteSizeIsValid()) {
2918 symbol->SetByteSize(size);
2919 symbol->SetSizeIsSynthesized(true);
2920 }
2921 } else {
2922 SectionSP section_sp =
2923 section_list->FindSectionContainingFileAddress(file_addr);
2924 if (section_sp) {
2925 addr_t offset = file_addr - section_sp->GetFileAddress();
2926 const char *symbol_name = GetNextSyntheticSymbolName().GetCString();
2927 uint64_t symbol_id = symbol_table->GetNumSymbols();
2928 Symbol eh_symbol(
2929 symbol_id, // Symbol table index.
2930 symbol_name, // Symbol name.
2931 false, // Is the symbol name mangled?
2932 eSymbolTypeCode, // Type of this symbol.
2933 true, // Is this globally visible?
2934 false, // Is this symbol debug info?
2935 false, // Is this symbol a trampoline?
2936 true, // Is this symbol artificial?
2937 section_sp, // Section in which this symbol is defined or null.
2938 offset, // Offset in section or symbol value.
2939 0, // Size: Don't specify the size as an FDE can
2940 false, // Size is valid: cover multiple symbols.
2941 false, // Contains linker annotations?
2942 0); // Symbol flags.
2943 new_symbols.push_back(eh_symbol);
2944 }
2945 }
2946 return true;
2947 });
2948
2949 for (const Symbol &s : new_symbols)
2950 symbol_table->AddSymbol(s);
2951}
2952
2953bool ObjectFileELF::IsStripped() {
2954 // TODO: determine this for ELF
2955 return false;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002956}
2957
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002958//===----------------------------------------------------------------------===//
2959// Dump
2960//
2961// Dump the specifics of the runtime file container (such as any headers
2962// segments, sections, etc).
2963//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00002964void ObjectFileELF::Dump(Stream *s) {
2965 ModuleSP module_sp(GetModule());
2966 if (!module_sp) {
2967 return;
2968 }
Adrian McCarthy543725c2016-04-04 21:21:49 +00002969
Kate Stoneb9c1b512016-09-06 20:57:50 +00002970 std::lock_guard<std::recursive_mutex> guard(module_sp->GetMutex());
2971 s->Printf("%p: ", static_cast<void *>(this));
2972 s->Indent();
2973 s->PutCString("ObjectFileELF");
Adrian McCarthy543725c2016-04-04 21:21:49 +00002974
Kate Stoneb9c1b512016-09-06 20:57:50 +00002975 ArchSpec header_arch;
2976 GetArchitecture(header_arch);
Adrian McCarthy543725c2016-04-04 21:21:49 +00002977
Kate Stoneb9c1b512016-09-06 20:57:50 +00002978 *s << ", file = '" << m_file
2979 << "', arch = " << header_arch.GetArchitectureName() << "\n";
Adrian McCarthy543725c2016-04-04 21:21:49 +00002980
Kate Stoneb9c1b512016-09-06 20:57:50 +00002981 DumpELFHeader(s, m_header);
2982 s->EOL();
2983 DumpELFProgramHeaders(s);
2984 s->EOL();
2985 DumpELFSectionHeaders(s);
2986 s->EOL();
2987 SectionList *section_list = GetSectionList();
2988 if (section_list)
2989 section_list->Dump(s, NULL, true, UINT32_MAX);
2990 Symtab *symtab = GetSymtab();
2991 if (symtab)
2992 symtab->Dump(s, NULL, eSortOrderNone);
2993 s->EOL();
2994 DumpDependentModules(s);
2995 s->EOL();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00002996}
2997
2998//----------------------------------------------------------------------
2999// DumpELFHeader
3000//
3001// Dump the ELF header to the specified output stream
3002//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003003void ObjectFileELF::DumpELFHeader(Stream *s, const ELFHeader &header) {
3004 s->PutCString("ELF Header\n");
3005 s->Printf("e_ident[EI_MAG0 ] = 0x%2.2x\n", header.e_ident[EI_MAG0]);
3006 s->Printf("e_ident[EI_MAG1 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG1],
3007 header.e_ident[EI_MAG1]);
3008 s->Printf("e_ident[EI_MAG2 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG2],
3009 header.e_ident[EI_MAG2]);
3010 s->Printf("e_ident[EI_MAG3 ] = 0x%2.2x '%c'\n", header.e_ident[EI_MAG3],
3011 header.e_ident[EI_MAG3]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003012
Kate Stoneb9c1b512016-09-06 20:57:50 +00003013 s->Printf("e_ident[EI_CLASS ] = 0x%2.2x\n", header.e_ident[EI_CLASS]);
3014 s->Printf("e_ident[EI_DATA ] = 0x%2.2x ", header.e_ident[EI_DATA]);
3015 DumpELFHeader_e_ident_EI_DATA(s, header.e_ident[EI_DATA]);
3016 s->Printf("\ne_ident[EI_VERSION] = 0x%2.2x\n", header.e_ident[EI_VERSION]);
3017 s->Printf("e_ident[EI_PAD ] = 0x%2.2x\n", header.e_ident[EI_PAD]);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003018
Kate Stoneb9c1b512016-09-06 20:57:50 +00003019 s->Printf("e_type = 0x%4.4x ", header.e_type);
3020 DumpELFHeader_e_type(s, header.e_type);
3021 s->Printf("\ne_machine = 0x%4.4x\n", header.e_machine);
3022 s->Printf("e_version = 0x%8.8x\n", header.e_version);
3023 s->Printf("e_entry = 0x%8.8" PRIx64 "\n", header.e_entry);
3024 s->Printf("e_phoff = 0x%8.8" PRIx64 "\n", header.e_phoff);
3025 s->Printf("e_shoff = 0x%8.8" PRIx64 "\n", header.e_shoff);
3026 s->Printf("e_flags = 0x%8.8x\n", header.e_flags);
3027 s->Printf("e_ehsize = 0x%4.4x\n", header.e_ehsize);
3028 s->Printf("e_phentsize = 0x%4.4x\n", header.e_phentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00003029 s->Printf("e_phnum = 0x%8.8x\n", header.e_phnum);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003030 s->Printf("e_shentsize = 0x%4.4x\n", header.e_shentsize);
Pavel Labath23ccc292017-01-31 23:09:46 +00003031 s->Printf("e_shnum = 0x%8.8x\n", header.e_shnum);
3032 s->Printf("e_shstrndx = 0x%8.8x\n", header.e_shstrndx);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003033}
3034
3035//----------------------------------------------------------------------
3036// DumpELFHeader_e_type
3037//
3038// Dump an token value for the ELF header member e_type
3039//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003040void ObjectFileELF::DumpELFHeader_e_type(Stream *s, elf_half e_type) {
3041 switch (e_type) {
3042 case ET_NONE:
3043 *s << "ET_NONE";
3044 break;
3045 case ET_REL:
3046 *s << "ET_REL";
3047 break;
3048 case ET_EXEC:
3049 *s << "ET_EXEC";
3050 break;
3051 case ET_DYN:
3052 *s << "ET_DYN";
3053 break;
3054 case ET_CORE:
3055 *s << "ET_CORE";
3056 break;
3057 default:
3058 break;
3059 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003060}
3061
3062//----------------------------------------------------------------------
3063// DumpELFHeader_e_ident_EI_DATA
3064//
3065// Dump an token value for the ELF header member e_ident[EI_DATA]
3066//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003067void ObjectFileELF::DumpELFHeader_e_ident_EI_DATA(Stream *s,
3068 unsigned char ei_data) {
3069 switch (ei_data) {
3070 case ELFDATANONE:
3071 *s << "ELFDATANONE";
3072 break;
3073 case ELFDATA2LSB:
3074 *s << "ELFDATA2LSB - Little Endian";
3075 break;
3076 case ELFDATA2MSB:
3077 *s << "ELFDATA2MSB - Big Endian";
3078 break;
3079 default:
3080 break;
3081 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003082}
3083
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003084//----------------------------------------------------------------------
3085// DumpELFProgramHeader
3086//
3087// Dump a single ELF program header to the specified output stream
3088//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003089void ObjectFileELF::DumpELFProgramHeader(Stream *s,
3090 const ELFProgramHeader &ph) {
3091 DumpELFProgramHeader_p_type(s, ph.p_type);
3092 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, ph.p_offset,
3093 ph.p_vaddr, ph.p_paddr);
3094 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64 " %8.8x (", ph.p_filesz, ph.p_memsz,
3095 ph.p_flags);
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003096
Kate Stoneb9c1b512016-09-06 20:57:50 +00003097 DumpELFProgramHeader_p_flags(s, ph.p_flags);
3098 s->Printf(") %8.8" PRIx64, ph.p_align);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003099}
3100
3101//----------------------------------------------------------------------
3102// DumpELFProgramHeader_p_type
3103//
Adrian Prantl05097242018-04-30 16:49:04 +00003104// Dump an token value for the ELF program header member p_type which describes
3105// the type of the program header
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003106// ----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003107void ObjectFileELF::DumpELFProgramHeader_p_type(Stream *s, elf_word p_type) {
3108 const int kStrWidth = 15;
3109 switch (p_type) {
3110 CASE_AND_STREAM(s, PT_NULL, kStrWidth);
3111 CASE_AND_STREAM(s, PT_LOAD, kStrWidth);
3112 CASE_AND_STREAM(s, PT_DYNAMIC, kStrWidth);
3113 CASE_AND_STREAM(s, PT_INTERP, kStrWidth);
3114 CASE_AND_STREAM(s, PT_NOTE, kStrWidth);
3115 CASE_AND_STREAM(s, PT_SHLIB, kStrWidth);
3116 CASE_AND_STREAM(s, PT_PHDR, kStrWidth);
3117 CASE_AND_STREAM(s, PT_TLS, kStrWidth);
Filipe Cabecinhas477d86d2013-05-23 23:01:14 +00003118 CASE_AND_STREAM(s, PT_GNU_EH_FRAME, kStrWidth);
Kate Stoneb9c1b512016-09-06 20:57:50 +00003119 default:
3120 s->Printf("0x%8.8x%*s", p_type, kStrWidth - 10, "");
3121 break;
3122 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003123}
3124
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003125//----------------------------------------------------------------------
3126// DumpELFProgramHeader_p_flags
3127//
3128// Dump an token value for the ELF program header member p_flags
3129//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003130void ObjectFileELF::DumpELFProgramHeader_p_flags(Stream *s, elf_word p_flags) {
3131 *s << ((p_flags & PF_X) ? "PF_X" : " ")
3132 << (((p_flags & PF_X) && (p_flags & PF_W)) ? '+' : ' ')
3133 << ((p_flags & PF_W) ? "PF_W" : " ")
3134 << (((p_flags & PF_W) && (p_flags & PF_R)) ? '+' : ' ')
3135 << ((p_flags & PF_R) ? "PF_R" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003136}
3137
3138//----------------------------------------------------------------------
3139// DumpELFProgramHeaders
3140//
3141// Dump all of the ELF program header to the specified output stream
3142//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003143void ObjectFileELF::DumpELFProgramHeaders(Stream *s) {
3144 if (!ParseProgramHeaders())
3145 return;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003146
Kate Stoneb9c1b512016-09-06 20:57:50 +00003147 s->PutCString("Program Headers\n");
3148 s->PutCString("IDX p_type p_offset p_vaddr p_paddr "
3149 "p_filesz p_memsz p_flags p_align\n");
3150 s->PutCString("==== --------------- -------- -------- -------- "
3151 "-------- -------- ------------------------- --------\n");
Ed Maste3a8ab6e2015-02-23 15:33:11 +00003152
Kate Stoneb9c1b512016-09-06 20:57:50 +00003153 uint32_t idx = 0;
3154 for (ProgramHeaderCollConstIter I = m_program_headers.begin();
3155 I != m_program_headers.end(); ++I, ++idx) {
3156 s->Printf("[%2u] ", idx);
3157 ObjectFileELF::DumpELFProgramHeader(s, *I);
3158 s->EOL();
3159 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003160}
3161
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003162//----------------------------------------------------------------------
3163// DumpELFSectionHeader
3164//
3165// Dump a single ELF section header to the specified output stream
3166//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003167void ObjectFileELF::DumpELFSectionHeader(Stream *s,
3168 const ELFSectionHeaderInfo &sh) {
3169 s->Printf("%8.8x ", sh.sh_name);
3170 DumpELFSectionHeader_sh_type(s, sh.sh_type);
3171 s->Printf(" %8.8" PRIx64 " (", sh.sh_flags);
3172 DumpELFSectionHeader_sh_flags(s, sh.sh_flags);
3173 s->Printf(") %8.8" PRIx64 " %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addr,
3174 sh.sh_offset, sh.sh_size);
3175 s->Printf(" %8.8x %8.8x", sh.sh_link, sh.sh_info);
3176 s->Printf(" %8.8" PRIx64 " %8.8" PRIx64, sh.sh_addralign, sh.sh_entsize);
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003177}
3178
3179//----------------------------------------------------------------------
3180// DumpELFSectionHeader_sh_type
3181//
3182// Dump an token value for the ELF section header member sh_type which
3183// describes the type of the section
3184//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003185void ObjectFileELF::DumpELFSectionHeader_sh_type(Stream *s, elf_word sh_type) {
3186 const int kStrWidth = 12;
3187 switch (sh_type) {
3188 CASE_AND_STREAM(s, SHT_NULL, kStrWidth);
3189 CASE_AND_STREAM(s, SHT_PROGBITS, kStrWidth);
3190 CASE_AND_STREAM(s, SHT_SYMTAB, kStrWidth);
3191 CASE_AND_STREAM(s, SHT_STRTAB, kStrWidth);
3192 CASE_AND_STREAM(s, SHT_RELA, kStrWidth);
3193 CASE_AND_STREAM(s, SHT_HASH, kStrWidth);
3194 CASE_AND_STREAM(s, SHT_DYNAMIC, kStrWidth);
3195 CASE_AND_STREAM(s, SHT_NOTE, kStrWidth);
3196 CASE_AND_STREAM(s, SHT_NOBITS, kStrWidth);
3197 CASE_AND_STREAM(s, SHT_REL, kStrWidth);
3198 CASE_AND_STREAM(s, SHT_SHLIB, kStrWidth);
3199 CASE_AND_STREAM(s, SHT_DYNSYM, kStrWidth);
3200 CASE_AND_STREAM(s, SHT_LOPROC, kStrWidth);
3201 CASE_AND_STREAM(s, SHT_HIPROC, kStrWidth);
3202 CASE_AND_STREAM(s, SHT_LOUSER, kStrWidth);
3203 CASE_AND_STREAM(s, SHT_HIUSER, kStrWidth);
3204 default:
3205 s->Printf("0x%8.8x%*s", sh_type, kStrWidth - 10, "");
3206 break;
3207 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003208}
3209
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003210//----------------------------------------------------------------------
3211// DumpELFSectionHeader_sh_flags
3212//
3213// Dump an token value for the ELF section header member sh_flags
3214//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003215void ObjectFileELF::DumpELFSectionHeader_sh_flags(Stream *s,
3216 elf_xword sh_flags) {
3217 *s << ((sh_flags & SHF_WRITE) ? "WRITE" : " ")
3218 << (((sh_flags & SHF_WRITE) && (sh_flags & SHF_ALLOC)) ? '+' : ' ')
3219 << ((sh_flags & SHF_ALLOC) ? "ALLOC" : " ")
3220 << (((sh_flags & SHF_ALLOC) && (sh_flags & SHF_EXECINSTR)) ? '+' : ' ')
3221 << ((sh_flags & SHF_EXECINSTR) ? "EXECINSTR" : " ");
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003222}
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003223
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003224//----------------------------------------------------------------------
3225// DumpELFSectionHeaders
3226//
3227// Dump all of the ELF section header to the specified output stream
3228//----------------------------------------------------------------------
Kate Stoneb9c1b512016-09-06 20:57:50 +00003229void ObjectFileELF::DumpELFSectionHeaders(Stream *s) {
3230 if (!ParseSectionHeaders())
3231 return;
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003232
Kate Stoneb9c1b512016-09-06 20:57:50 +00003233 s->PutCString("Section Headers\n");
3234 s->PutCString("IDX name type flags "
3235 "addr offset size link info addralgn "
3236 "entsize Name\n");
3237 s->PutCString("==== -------- ------------ -------------------------------- "
3238 "-------- -------- -------- -------- -------- -------- "
3239 "-------- ====================\n");
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003240
Kate Stoneb9c1b512016-09-06 20:57:50 +00003241 uint32_t idx = 0;
3242 for (SectionHeaderCollConstIter I = m_section_headers.begin();
3243 I != m_section_headers.end(); ++I, ++idx) {
3244 s->Printf("[%2u] ", idx);
3245 ObjectFileELF::DumpELFSectionHeader(s, *I);
3246 const char *section_name = I->section_name.AsCString("");
3247 if (section_name)
3248 *s << ' ' << section_name << "\n";
3249 }
Stephen Wilsonf325ba92010-07-13 23:07:23 +00003250}
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003251
Kate Stoneb9c1b512016-09-06 20:57:50 +00003252void ObjectFileELF::DumpDependentModules(lldb_private::Stream *s) {
3253 size_t num_modules = ParseDependentModules();
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003254
Kate Stoneb9c1b512016-09-06 20:57:50 +00003255 if (num_modules > 0) {
3256 s->PutCString("Dependent Modules:\n");
3257 for (unsigned i = 0; i < num_modules; ++i) {
3258 const FileSpec &spec = m_filespec_ap->GetFileSpecAtIndex(i);
3259 s->Printf(" %s\n", spec.GetFilename().GetCString());
3260 }
3261 }
3262}
3263
3264bool ObjectFileELF::GetArchitecture(ArchSpec &arch) {
3265 if (!ParseHeader())
3266 return false;
3267
3268 if (m_section_headers.empty()) {
3269 // Allow elf notes to be parsed which may affect the detected architecture.
3270 ParseSectionHeaders();
3271 }
3272
3273 if (CalculateType() == eTypeCoreFile &&
3274 m_arch_spec.TripleOSIsUnspecifiedUnknown()) {
3275 // Core files don't have section headers yet they have PT_NOTE program
Adrian Prantl05097242018-04-30 16:49:04 +00003276 // headers that might shed more light on the architecture
Kate Stoneb9c1b512016-09-06 20:57:50 +00003277 if (ParseProgramHeaders()) {
Kamil Rytarowski12801f12017-03-26 15:34:57 +00003278 for (size_t i = 1, count = GetProgramHeaderCount(); i <= count; ++i) {
Kate Stoneb9c1b512016-09-06 20:57:50 +00003279 const elf::ELFProgramHeader *header = GetProgramHeaderByIndex(i);
3280 if (header && header->p_type == PT_NOTE && header->p_offset != 0 &&
3281 header->p_filesz > 0) {
3282 DataExtractor data;
3283 if (data.SetData(m_data, header->p_offset, header->p_filesz) ==
3284 header->p_filesz) {
3285 lldb_private::UUID uuid;
3286 RefineModuleDetailsFromNote(data, m_arch_spec, uuid);
3287 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003288 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003289 }
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003290 }
Kate Stoneb9c1b512016-09-06 20:57:50 +00003291 }
3292 arch = m_arch_spec;
3293 return true;
Chris Lattner30fdc8d2010-06-08 16:52:24 +00003294}
3295
Kate Stoneb9c1b512016-09-06 20:57:50 +00003296ObjectFile::Type ObjectFileELF::CalculateType() {
3297 switch (m_header.e_type) {
3298 case llvm::ELF::ET_NONE:
3299 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003300 return eTypeUnknown;
Kate Stoneb9c1b512016-09-06 20:57:50 +00003301
3302 case llvm::ELF::ET_REL:
3303 // 1 - Relocatable file
3304 return eTypeObjectFile;
3305
3306 case llvm::ELF::ET_EXEC:
3307 // 2 - Executable file
3308 return eTypeExecutable;
3309
3310 case llvm::ELF::ET_DYN:
3311 // 3 - Shared object file
3312 return eTypeSharedLibrary;
3313
3314 case ET_CORE:
3315 // 4 - Core file
3316 return eTypeCoreFile;
3317
3318 default:
3319 break;
3320 }
3321 return eTypeUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003322}
3323
Kate Stoneb9c1b512016-09-06 20:57:50 +00003324ObjectFile::Strata ObjectFileELF::CalculateStrata() {
3325 switch (m_header.e_type) {
3326 case llvm::ELF::ET_NONE:
3327 // 0 - No file type
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003328 return eStrataUnknown;
Greg Clayton9e00b6a652011-07-09 00:41:34 +00003329
Kate Stoneb9c1b512016-09-06 20:57:50 +00003330 case llvm::ELF::ET_REL:
3331 // 1 - Relocatable file
3332 return eStrataUnknown;
3333
3334 case llvm::ELF::ET_EXEC:
3335 // 2 - Executable file
3336 // TODO: is there any way to detect that an executable is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003337 // related executable by inspecting the program headers, section headers,
3338 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003339 return eStrataUser;
3340
3341 case llvm::ELF::ET_DYN:
3342 // 3 - Shared object file
3343 // TODO: is there any way to detect that an shared library is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003344 // related executable by inspecting the program headers, section headers,
3345 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003346 return eStrataUnknown;
3347
3348 case ET_CORE:
3349 // 4 - Core file
3350 // TODO: is there any way to detect that an core file is a kernel
Adrian Prantl05097242018-04-30 16:49:04 +00003351 // related executable by inspecting the program headers, section headers,
3352 // symbols, or any other flag bits???
Kate Stoneb9c1b512016-09-06 20:57:50 +00003353 return eStrataUnknown;
3354
3355 default:
3356 break;
3357 }
3358 return eStrataUnknown;
3359}
Pavel Labathe2867bc2017-12-15 14:23:58 +00003360
3361size_t ObjectFileELF::ReadSectionData(Section *section,
3362 lldb::offset_t section_offset, void *dst,
3363 size_t dst_len) {
3364 // If some other objectfile owns this data, pass this to them.
3365 if (section->GetObjectFile() != this)
3366 return section->GetObjectFile()->ReadSectionData(section, section_offset,
3367 dst, dst_len);
3368
3369 if (!section->Test(SHF_COMPRESSED))
3370 return ObjectFile::ReadSectionData(section, section_offset, dst, dst_len);
3371
3372 // For compressed sections we need to read to full data to be able to
3373 // decompress.
3374 DataExtractor data;
3375 ReadSectionData(section, data);
3376 return data.CopyData(section_offset, dst_len, dst);
3377}
3378
3379size_t ObjectFileELF::ReadSectionData(Section *section,
3380 DataExtractor &section_data) {
3381 // If some other objectfile owns this data, pass this to them.
3382 if (section->GetObjectFile() != this)
3383 return section->GetObjectFile()->ReadSectionData(section, section_data);
3384
3385 Log *log = lldb_private::GetLogIfAllCategoriesSet(LIBLLDB_LOG_MODULES);
3386
3387 size_t result = ObjectFile::ReadSectionData(section, section_data);
3388 if (result == 0 || !section->Test(SHF_COMPRESSED))
3389 return result;
3390
3391 auto Decompressor = llvm::object::Decompressor::create(
3392 section->GetName().GetStringRef(),
3393 {reinterpret_cast<const char *>(section_data.GetDataStart()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003394 size_t(section_data.GetByteSize())},
Pavel Labathe2867bc2017-12-15 14:23:58 +00003395 GetByteOrder() == eByteOrderLittle, GetAddressByteSize() == 8);
3396 if (!Decompressor) {
Pavel Labathc561a6a2018-01-30 12:19:34 +00003397 LLDB_LOG_ERROR(log, Decompressor.takeError(),
3398 "Unable to initialize decompressor for section {0}",
3399 section->GetName());
Pavel Labathe2867bc2017-12-15 14:23:58 +00003400 return result;
3401 }
3402 auto buffer_sp =
3403 std::make_shared<DataBufferHeap>(Decompressor->getDecompressedSize(), 0);
3404 if (auto Error = Decompressor->decompress(
3405 {reinterpret_cast<char *>(buffer_sp->GetBytes()),
Pavel Labath4c2eb8b2017-12-15 14:39:12 +00003406 size_t(buffer_sp->GetByteSize())})) {
Pavel Labathc561a6a2018-01-30 12:19:34 +00003407 LLDB_LOG_ERROR(log, std::move(Error), "Decompression of section {0} failed",
3408 section->GetName());
Pavel Labathe2867bc2017-12-15 14:23:58 +00003409 return result;
3410 }
3411 section_data.SetData(buffer_sp);
3412 return buffer_sp->GetByteSize();
3413}
Pavel Labath16064d32018-03-20 11:56:24 +00003414
3415bool ObjectFileELF::AnySegmentHasPhysicalAddress() {
3416 size_t header_count = ParseProgramHeaders();
3417 for (size_t i = 1; i <= header_count; ++i) {
3418 auto header = GetProgramHeaderByIndex(i);
3419 if (header->p_paddr != 0)
3420 return true;
3421 }
3422 return false;
3423}
3424
3425std::vector<ObjectFile::LoadableData>
3426ObjectFileELF::GetLoadableData(Target &target) {
Adrian Prantl05097242018-04-30 16:49:04 +00003427 // Create a list of loadable data from loadable segments, using physical
3428 // addresses if they aren't all null
Pavel Labath16064d32018-03-20 11:56:24 +00003429 std::vector<LoadableData> loadables;
3430 size_t header_count = ParseProgramHeaders();
3431 bool should_use_paddr = AnySegmentHasPhysicalAddress();
3432 for (size_t i = 1; i <= header_count; ++i) {
3433 LoadableData loadable;
3434 auto header = GetProgramHeaderByIndex(i);
3435 if (header->p_type != llvm::ELF::PT_LOAD)
3436 continue;
3437 loadable.Dest = should_use_paddr ? header->p_paddr : header->p_vaddr;
3438 if (loadable.Dest == LLDB_INVALID_ADDRESS)
3439 continue;
3440 if (header->p_filesz == 0)
3441 continue;
3442 auto segment_data = GetSegmentDataByIndex(i);
3443 loadable.Contents = llvm::ArrayRef<uint8_t>(segment_data.GetDataStart(),
3444 segment_data.GetByteSize());
3445 loadables.push_back(loadable);
3446 }
3447 return loadables;
3448}