blob: 28d7382fca5eb7de4e9206201f40b87ff83db0ac [file] [log] [blame]
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00001/* Report modules by examining dynamic linker data structures.
Mark Wielaardf5920352015-05-22 18:31:58 +02002 Copyright (C) 2008-2015 Red Hat, Inc.
Mark Wielaardde2ed972012-06-05 17:15:16 +02003 This file is part of elfutils.
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00004
Mark Wielaardde2ed972012-06-05 17:15:16 +02005 This file is free software; you can redistribute it and/or modify
6 it under the terms of either
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00007
Mark Wielaardde2ed972012-06-05 17:15:16 +02008 * the GNU Lesser General Public License as published by the Free
9 Software Foundation; either version 3 of the License, or (at
10 your option) any later version
11
12 or
13
14 * the GNU General Public License as published by the Free
15 Software Foundation; either version 2 of the License, or (at
16 your option) any later version
17
18 or both in parallel, as here.
19
20 elfutils is distributed in the hope that it will be useful, but
Roland McGrathb4d6f0f2008-08-25 22:55:17 +000021 WITHOUT ANY WARRANTY; without even the implied warranty of
22 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23 General Public License for more details.
24
Mark Wielaardde2ed972012-06-05 17:15:16 +020025 You should have received copies of the GNU General Public License and
26 the GNU Lesser General Public License along with this program. If
27 not, see <http://www.gnu.org/licenses/>. */
Roland McGrathb4d6f0f2008-08-25 22:55:17 +000028
29#include <config.h>
30#include "libdwflP.h"
Roland McGrath3999ce12013-01-07 14:53:37 -080031#include "../libdw/memory-access.h"
Mark Wielaard9efa9e62013-04-27 20:50:32 +020032#include "system.h"
Roland McGrathb4d6f0f2008-08-25 22:55:17 +000033
34#include <byteswap.h>
35#include <endian.h>
Jan Kratochvil8ff86292013-05-30 13:21:20 +020036#include <fcntl.h>
Roland McGrathb4d6f0f2008-08-25 22:55:17 +000037
38/* This element is always provided and always has a constant value.
39 This makes it an easy thing to scan for to discern the format. */
40#define PROBE_TYPE AT_PHENT
41#define PROBE_VAL32 sizeof (Elf32_Phdr)
42#define PROBE_VAL64 sizeof (Elf64_Phdr)
43
Roland McGrathb4d6f0f2008-08-25 22:55:17 +000044
Chih-Hung Hsiehe3bfee62015-11-17 14:45:15 -080045static inline bool
46do_check64 (size_t i, const Elf64_auxv_t (*a64)[], uint_fast8_t *elfdata)
47{
48 /* The AUXV pointer might not even be naturally aligned for 64-bit
49 data, because note payloads in a core file are not aligned. */
50
51 uint64_t type = read_8ubyte_unaligned_noncvt (&(*a64)[i].a_type);
52 uint64_t val = read_8ubyte_unaligned_noncvt (&(*a64)[i].a_un.a_val);
53
54 if (type == BE64 (PROBE_TYPE)
55 && val == BE64 (PROBE_VAL64))
56 {
57 *elfdata = ELFDATA2MSB;
58 return true;
59 }
60
61 if (type == LE64 (PROBE_TYPE)
62 && val == LE64 (PROBE_VAL64))
63 {
64 *elfdata = ELFDATA2LSB;
65 return true;
66 }
67
68 return false;
69}
70
71#define check64(n) do_check64 (n, a64, elfdata)
72
73static inline bool
74do_check32 (size_t i, const Elf32_auxv_t (*a32)[], uint_fast8_t *elfdata)
75{
76 /* The AUXV pointer might not even be naturally aligned for 32-bit
77 data, because note payloads in a core file are not aligned. */
78
79 uint32_t type = read_4ubyte_unaligned_noncvt (&(*a32)[i].a_type);
80 uint32_t val = read_4ubyte_unaligned_noncvt (&(*a32)[i].a_un.a_val);
81
82 if (type == BE32 (PROBE_TYPE)
83 && val == BE32 (PROBE_VAL32))
84 {
85 *elfdata = ELFDATA2MSB;
86 return true;
87 }
88
89 if (type == LE32 (PROBE_TYPE)
90 && val == LE32 (PROBE_VAL32))
91 {
92 *elfdata = ELFDATA2LSB;
93 return true;
94 }
95
96 return false;
97}
98
99#define check32(n) do_check32 (n, a32, elfdata)
100
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000101/* Examine an auxv data block and determine its format.
102 Return true iff we figured it out. */
103static bool
104auxv_format_probe (const void *auxv, size_t size,
105 uint_fast8_t *elfclass, uint_fast8_t *elfdata)
106{
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700107 const Elf32_auxv_t (*a32)[size / sizeof (Elf32_auxv_t)] = (void *) auxv;
108 const Elf64_auxv_t (*a64)[size / sizeof (Elf64_auxv_t)] = (void *) auxv;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000109
Roland McGrath5ea349b2010-04-06 00:04:49 -0700110 for (size_t i = 0; i < size / sizeof (Elf64_auxv_t); ++i)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000111 {
112 if (check64 (i))
113 {
114 *elfclass = ELFCLASS64;
115 return true;
116 }
117
Roland McGrath5ea349b2010-04-06 00:04:49 -0700118 if (check32 (i * 2) || check32 (i * 2 + 1))
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000119 {
120 *elfclass = ELFCLASS32;
121 return true;
122 }
123 }
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000124
125 return false;
126}
127
128/* This is a Dwfl_Memory_Callback that wraps another memory callback.
129 If the underlying callback cannot fill the data, then this will
130 fall back to fetching data from module files. */
131
132struct integrated_memory_callback
133{
134 Dwfl_Memory_Callback *memory_callback;
135 void *memory_callback_arg;
136 void *buffer;
137};
138
139static bool
140integrated_memory_callback (Dwfl *dwfl, int ndx,
141 void **buffer, size_t *buffer_available,
142 GElf_Addr vaddr,
143 size_t minread,
144 void *arg)
145{
146 struct integrated_memory_callback *info = arg;
147
148 if (ndx == -1)
149 {
150 /* Called for cleanup. */
151 if (info->buffer != NULL)
152 {
153 /* The last probe buffer came from the underlying callback.
154 Let it do its cleanup. */
155 assert (*buffer == info->buffer); /* XXX */
156 *buffer = info->buffer;
157 info->buffer = NULL;
158 return (*info->memory_callback) (dwfl, ndx, buffer, buffer_available,
159 vaddr, minread,
160 info->memory_callback_arg);
161 }
162 *buffer = NULL;
163 *buffer_available = 0;
164 return false;
165 }
166
167 if (*buffer != NULL)
168 /* For a final-read request, we only use the underlying callback. */
169 return (*info->memory_callback) (dwfl, ndx, buffer, buffer_available,
170 vaddr, minread, info->memory_callback_arg);
171
172 /* Let the underlying callback try to fill this request. */
173 if ((*info->memory_callback) (dwfl, ndx, &info->buffer, buffer_available,
174 vaddr, minread, info->memory_callback_arg))
175 {
176 *buffer = info->buffer;
177 return true;
178 }
179
180 /* Now look for module text covering this address. */
181
182 Dwfl_Module *mod;
183 (void) INTUSE(dwfl_addrsegment) (dwfl, vaddr, &mod);
184 if (mod == NULL)
185 return false;
186
187 Dwarf_Addr bias;
188 Elf_Scn *scn = INTUSE(dwfl_module_address_section) (mod, &vaddr, &bias);
189 if (unlikely (scn == NULL))
190 {
191#if 0 // XXX would have to handle ndx=-1 cleanup calls passed down.
192 /* If we have no sections we can try to fill it from the module file
193 based on its phdr mappings. */
194 if (likely (mod->e_type != ET_REL) && mod->main.elf != NULL)
195 return INTUSE(dwfl_elf_phdr_memory_callback)
196 (dwfl, 0, buffer, buffer_available,
197 vaddr - mod->main.bias, minread, mod->main.elf);
198#endif
199 return false;
200 }
201
202 Elf_Data *data = elf_rawdata (scn, NULL);
203 if (unlikely (data == NULL))
204 // XXX throw error?
205 return false;
206
207 if (unlikely (data->d_size < vaddr))
208 return false;
209
210 /* Provide as much data as we have. */
211 void *contents = data->d_buf + vaddr;
212 size_t avail = data->d_size - vaddr;
213 if (unlikely (avail < minread))
214 return false;
215
216 /* If probing for a string, make sure it's terminated. */
217 if (minread == 0 && unlikely (memchr (contents, '\0', avail) == NULL))
218 return false;
219
220 /* We have it! */
221 *buffer = contents;
222 *buffer_available = avail;
223 return true;
224}
225
226static size_t
227addrsize (uint_fast8_t elfclass)
228{
229 return elfclass * 4;
230}
231
232/* Report a module for each struct link_map in the linked list at r_map
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200233 in the struct r_debug at R_DEBUG_VADDR. For r_debug_info description
Jan Kratochvil596d4302013-07-23 16:30:01 +0200234 see dwfl_link_map_report in libdwflP.h. If R_DEBUG_INFO is not NULL then no
235 modules get added to DWFL, caller has to add them from filled in
236 R_DEBUG_INFO.
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000237
238 For each link_map entry, if an existing module resides at its address,
239 this just modifies that module's name and suggested file name. If
240 no such module exists, this calls dwfl_report_elf on the l_name string.
241
242 Returns the number of modules found, or -1 for errors. */
243
244static int
245report_r_debug (uint_fast8_t elfclass, uint_fast8_t elfdata,
246 Dwfl *dwfl, GElf_Addr r_debug_vaddr,
247 Dwfl_Memory_Callback *memory_callback,
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200248 void *memory_callback_arg,
249 struct r_debug_info *r_debug_info)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000250{
251 /* Skip r_version, to aligned r_map field. */
252 GElf_Addr read_vaddr = r_debug_vaddr + addrsize (elfclass);
253
254 void *buffer = NULL;
255 size_t buffer_available = 0;
256 inline int release_buffer (int result)
257 {
258 if (buffer != NULL)
259 (void) (*memory_callback) (dwfl, -1, &buffer, &buffer_available, 0, 0,
260 memory_callback_arg);
261 return result;
262 }
263
264 GElf_Addr addrs[4];
265 inline bool read_addrs (GElf_Addr vaddr, size_t n)
266 {
267 size_t nb = n * addrsize (elfclass); /* Address words -> bytes to read. */
268
269 /* Read a new buffer if the old one doesn't cover these words. */
270 if (buffer == NULL
271 || vaddr < read_vaddr
272 || vaddr - read_vaddr + nb > buffer_available)
273 {
274 release_buffer (0);
275
276 read_vaddr = vaddr;
277 int segndx = INTUSE(dwfl_addrsegment) (dwfl, vaddr, NULL);
278 if (unlikely (segndx < 0)
279 || unlikely (! (*memory_callback) (dwfl, segndx,
280 &buffer, &buffer_available,
281 vaddr, nb, memory_callback_arg)))
282 return true;
283 }
284
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700285 Elf32_Addr (*a32)[n] = vaddr - read_vaddr + buffer;
286 Elf64_Addr (*a64)[n] = (void *) a32;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000287
288 if (elfclass == ELFCLASS32)
289 {
290 if (elfdata == ELFDATA2MSB)
291 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700292 addrs[i] = BE32 (read_4ubyte_unaligned_noncvt (&(*a32)[i]));
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000293 else
294 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700295 addrs[i] = LE32 (read_4ubyte_unaligned_noncvt (&(*a32)[i]));
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000296 }
297 else
298 {
299 if (elfdata == ELFDATA2MSB)
300 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700301 addrs[i] = BE64 (read_8ubyte_unaligned_noncvt (&(*a64)[i]));
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000302 else
303 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700304 addrs[i] = LE64 (read_8ubyte_unaligned_noncvt (&(*a64)[i]));
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000305 }
306
307 return false;
308 }
309
310 if (unlikely (read_addrs (read_vaddr, 1)))
311 return release_buffer (-1);
312
313 GElf_Addr next = addrs[0];
314
315 Dwfl_Module **lastmodp = &dwfl->modulelist;
316 int result = 0;
Roland McGrathbe139302010-04-14 12:54:45 -0700317
318 /* There can't be more elements in the link_map list than there are
319 segments. DWFL->lookup_elts is probably twice that number, so it
320 is certainly above the upper bound. If we iterate too many times,
321 there must be a loop in the pointers due to link_map clobberation. */
322 size_t iterations = 0;
323 while (next != 0 && ++iterations < dwfl->lookup_elts)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000324 {
325 if (read_addrs (next, 4))
326 return release_buffer (-1);
327
Jan Kratochvil475849f2014-07-24 20:47:17 +0200328 /* Unused: l_addr is the difference between the address in memory
329 and the ELF file when the core was created. We need to
330 recalculate the difference below because the ELF file we use
331 might be differently pre-linked. */
332 // GElf_Addr l_addr = addrs[0];
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000333 GElf_Addr l_name = addrs[1];
334 GElf_Addr l_ld = addrs[2];
335 next = addrs[3];
336
Roland McGrathcdb48e02009-11-05 11:34:08 -0800337 /* If a clobbered or truncated memory image has no useful pointer,
338 just skip this element. */
339 if (l_ld == 0)
340 continue;
341
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000342 /* Fetch the string at the l_name address. */
343 const char *name = NULL;
344 if (buffer != NULL
345 && read_vaddr <= l_name
346 && l_name + 1 - read_vaddr < buffer_available
347 && memchr (l_name - read_vaddr + buffer, '\0',
348 buffer_available - (l_name - read_vaddr)) != NULL)
349 name = l_name - read_vaddr + buffer;
350 else
351 {
352 release_buffer (0);
353 read_vaddr = l_name;
354 int segndx = INTUSE(dwfl_addrsegment) (dwfl, l_name, NULL);
355 if (likely (segndx >= 0)
356 && (*memory_callback) (dwfl, segndx,
357 &buffer, &buffer_available,
358 l_name, 0, memory_callback_arg))
359 name = buffer;
360 }
361
362 if (name != NULL && name[0] == '\0')
363 name = NULL;
364
Mark Wielaard355b4082015-12-01 22:16:00 +0100365 if (iterations == 1
366 && dwfl->user_core != NULL
367 && dwfl->user_core->executable_for_core != NULL)
368 name = dwfl->user_core->executable_for_core;
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200369
Jan Kratochvil596d4302013-07-23 16:30:01 +0200370 struct r_debug_info_module *r_debug_info_module = NULL;
371 if (r_debug_info != NULL)
372 {
373 /* Save link map information about valid shared library (or
374 executable) which has not been found on disk. */
375 const char *name1 = name == NULL ? "" : name;
376 r_debug_info_module = malloc (sizeof (*r_debug_info_module)
377 + strlen (name1) + 1);
Mark Wielaardf5920352015-05-22 18:31:58 +0200378 if (unlikely (r_debug_info_module == NULL))
Jan Kratochvil596d4302013-07-23 16:30:01 +0200379 return release_buffer (result);
380 r_debug_info_module->fd = -1;
381 r_debug_info_module->elf = NULL;
Jan Kratochvil596d4302013-07-23 16:30:01 +0200382 r_debug_info_module->l_ld = l_ld;
383 r_debug_info_module->start = 0;
384 r_debug_info_module->end = 0;
385 r_debug_info_module->disk_file_has_build_id = false;
386 strcpy (r_debug_info_module->name, name1);
387 r_debug_info_module->next = r_debug_info->module;
388 r_debug_info->module = r_debug_info_module;
389 }
390
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200391 Dwfl_Module *mod = NULL;
392 if (name != NULL)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000393 {
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200394 /* This code is mostly inlined dwfl_report_elf. */
395 // XXX hook for sysroot
Josh Stone34254542015-10-09 10:10:37 -0700396 int fd = open (name, O_RDONLY);
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200397 if (fd >= 0)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000398 {
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200399 Elf *elf;
400 Dwfl_Error error = __libdw_open_file (&fd, &elf, true, false);
Jan Kratochvil463e9832013-11-21 15:28:02 +0100401 GElf_Addr elf_dynamic_vaddr;
402 if (error == DWFL_E_NOERROR
403 && __libdwfl_dynamic_vaddr_get (elf, &elf_dynamic_vaddr))
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000404 {
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200405 const void *build_id_bits;
406 GElf_Addr build_id_elfaddr;
407 int build_id_len;
408 bool valid = true;
409
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200410 if (__libdwfl_find_elf_build_id (NULL, elf, &build_id_bits,
411 &build_id_elfaddr,
412 &build_id_len) > 0
413 && build_id_elfaddr != 0)
414 {
Jan Kratochvil596d4302013-07-23 16:30:01 +0200415 if (r_debug_info_module != NULL)
416 r_debug_info_module->disk_file_has_build_id = true;
Jan Kratochvil463e9832013-11-21 15:28:02 +0100417 GElf_Addr build_id_vaddr = (build_id_elfaddr
418 - elf_dynamic_vaddr + l_ld);
419
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200420 release_buffer (0);
421 int segndx = INTUSE(dwfl_addrsegment) (dwfl,
422 build_id_vaddr,
423 NULL);
424 if (! (*memory_callback) (dwfl, segndx,
425 &buffer, &buffer_available,
426 build_id_vaddr, build_id_len,
Mark Wielaard24b26ec2013-06-05 17:03:25 +0200427 memory_callback_arg))
Jan Kratochvil99a29492013-11-21 15:33:22 +0100428 {
429 /* File has valid build-id which cannot be read from
430 memory. This happens for core files without bit 4
431 (0x10) set in Linux /proc/PID/coredump_filter. */
432 }
Mark Wielaard24b26ec2013-06-05 17:03:25 +0200433 else
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200434 {
Mark Wielaard24b26ec2013-06-05 17:03:25 +0200435 if (memcmp (build_id_bits, buffer, build_id_len) != 0)
436 /* File has valid build-id which does not match
437 the one in memory. */
438 valid = false;
439 release_buffer (0);
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200440 }
441 }
442
443 if (valid)
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200444 {
Jan Kratochvil475849f2014-07-24 20:47:17 +0200445 // It is like l_addr but it handles differently prelinked
446 // files at core dumping vs. core loading time.
447 GElf_Addr base = l_ld - elf_dynamic_vaddr;
Jan Kratochvil596d4302013-07-23 16:30:01 +0200448 if (r_debug_info_module == NULL)
449 {
450 // XXX hook for sysroot
451 mod = __libdwfl_report_elf (dwfl, basename (name),
Jan Kratochvil475849f2014-07-24 20:47:17 +0200452 name, fd, elf, base,
Jan Kratochvil596d4302013-07-23 16:30:01 +0200453 true, true);
454 if (mod != NULL)
455 {
456 elf = NULL;
457 fd = -1;
458 }
459 }
Jan Kratochvil475849f2014-07-24 20:47:17 +0200460 else if (__libdwfl_elf_address_range (elf, base, true,
Jan Kratochvil596d4302013-07-23 16:30:01 +0200461 true, NULL, NULL,
462 &r_debug_info_module->start,
463 &r_debug_info_module->end,
464 NULL, NULL))
465 {
466 r_debug_info_module->elf = elf;
467 r_debug_info_module->fd = fd;
468 elf = NULL;
469 fd = -1;
470 }
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200471 }
Jan Kratochvil596d4302013-07-23 16:30:01 +0200472 if (elf != NULL)
473 elf_end (elf);
474 if (fd != -1)
475 close (fd);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000476 }
477 }
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000478 }
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000479
480 if (mod != NULL)
481 {
482 ++result;
483
484 /* Move this module to the end of the list, so that we end
485 up with a list in the same order as the link_map chain. */
486 if (mod->next != NULL)
487 {
488 if (*lastmodp != mod)
489 {
490 lastmodp = &dwfl->modulelist;
491 while (*lastmodp != mod)
492 lastmodp = &(*lastmodp)->next;
493 }
494 *lastmodp = mod->next;
495 mod->next = NULL;
496 while (*lastmodp != NULL)
497 lastmodp = &(*lastmodp)->next;
498 *lastmodp = mod;
499 }
500
501 lastmodp = &mod->next;
502 }
503 }
504
505 return release_buffer (result);
506}
507
508static GElf_Addr
509consider_executable (Dwfl_Module *mod, GElf_Addr at_phdr, GElf_Addr at_entry,
510 uint_fast8_t *elfclass, uint_fast8_t *elfdata,
511 Dwfl_Memory_Callback *memory_callback,
512 void *memory_callback_arg)
513{
514 GElf_Ehdr ehdr;
515 if (unlikely (gelf_getehdr (mod->main.elf, &ehdr) == NULL))
516 return 0;
517
518 if (at_entry != 0)
519 {
520 /* If we have an AT_ENTRY value, reject this executable if
521 its entry point address could not have supplied that. */
522
523 if (ehdr.e_entry == 0)
524 return 0;
525
526 if (mod->e_type == ET_EXEC)
527 {
528 if (ehdr.e_entry != at_entry)
529 return 0;
530 }
531 else
532 {
533 /* It could be a PIE. */
534 }
535 }
536
537 // XXX this could be saved in the file cache: phdr vaddr, DT_DEBUG d_val vaddr
538 /* Find the vaddr of the DT_DEBUG's d_ptr. This is the memory
539 address where &r_debug was written at runtime. */
540 GElf_Xword align = mod->dwfl->segment_align;
541 GElf_Addr d_val_vaddr = 0;
Mark Wielaard712c8fa2014-11-22 23:08:48 +0100542 size_t phnum;
543 if (elf_getphdrnum (mod->main.elf, &phnum) != 0)
544 return 0;
545
546 for (size_t i = 0; i < phnum; ++i)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000547 {
548 GElf_Phdr phdr_mem;
549 GElf_Phdr *phdr = gelf_getphdr (mod->main.elf, i, &phdr_mem);
550 if (phdr == NULL)
551 break;
552
553 if (phdr->p_align > 1 && (align == 0 || phdr->p_align < align))
554 align = phdr->p_align;
555
556 if (at_phdr != 0
557 && phdr->p_type == PT_LOAD
558 && (phdr->p_offset & -align) == (ehdr.e_phoff & -align))
559 {
560 /* This is the segment that would map the phdrs.
561 If we have an AT_PHDR value, reject this executable
562 if its phdr mapping could not have supplied that. */
563 if (mod->e_type == ET_EXEC)
564 {
565 if (ehdr.e_phoff - phdr->p_offset + phdr->p_vaddr != at_phdr)
566 return 0;
567 }
568 else
569 {
570 /* It could be a PIE. If the AT_PHDR value and our
571 phdr address don't match modulo ALIGN, then this
572 could not have been the right PIE. */
573 if (((ehdr.e_phoff - phdr->p_offset + phdr->p_vaddr) & -align)
574 != (at_phdr & -align))
575 return 0;
576
577 /* Calculate the bias applied to the PIE's p_vaddr values. */
578 GElf_Addr bias = (at_phdr - (ehdr.e_phoff - phdr->p_offset
579 + phdr->p_vaddr));
580
581 /* Final sanity check: if we have an AT_ENTRY value,
582 reject this PIE unless its biased e_entry matches. */
583 if (at_entry != 0 && at_entry != ehdr.e_entry + bias)
584 return 0;
585
586 /* If we're changing the module's address range,
587 we've just invalidated the module lookup table. */
Roland McGrath1743d7f2010-11-12 16:46:47 -0800588 GElf_Addr mod_bias = dwfl_adjusted_address (mod, 0);
589 if (bias != mod_bias)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000590 {
Roland McGrath1743d7f2010-11-12 16:46:47 -0800591 mod->low_addr -= mod_bias;
592 mod->high_addr -= mod_bias;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000593 mod->low_addr += bias;
594 mod->high_addr += bias;
595
596 free (mod->dwfl->lookup_module);
597 mod->dwfl->lookup_module = NULL;
598 }
599 }
600 }
601
602 if (phdr->p_type == PT_DYNAMIC)
603 {
604 Elf_Data *data = elf_getdata_rawchunk (mod->main.elf, phdr->p_offset,
605 phdr->p_filesz, ELF_T_DYN);
606 if (data == NULL)
607 continue;
608 const size_t entsize = gelf_fsize (mod->main.elf,
609 ELF_T_DYN, 1, EV_CURRENT);
610 const size_t n = data->d_size / entsize;
611 for (size_t j = 0; j < n; ++j)
612 {
613 GElf_Dyn dyn_mem;
614 GElf_Dyn *dyn = gelf_getdyn (data, j, &dyn_mem);
615 if (dyn != NULL && dyn->d_tag == DT_DEBUG)
616 {
617 d_val_vaddr = phdr->p_vaddr + entsize * j + entsize / 2;
618 break;
619 }
620 }
621 }
622 }
623
624 if (d_val_vaddr != 0)
625 {
626 /* Now we have the final address from which to read &r_debug. */
Roland McGrath1743d7f2010-11-12 16:46:47 -0800627 d_val_vaddr = dwfl_adjusted_address (mod, d_val_vaddr);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000628
629 void *buffer = NULL;
630 size_t buffer_available = addrsize (ehdr.e_ident[EI_CLASS]);
631
Roland McGrath45c01cd2009-02-10 17:03:19 -0800632 int segndx = INTUSE(dwfl_addrsegment) (mod->dwfl, d_val_vaddr, NULL);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000633
634 if ((*memory_callback) (mod->dwfl, segndx,
635 &buffer, &buffer_available,
636 d_val_vaddr, buffer_available,
637 memory_callback_arg))
638 {
639 const union
640 {
641 Elf32_Addr a32;
642 Elf64_Addr a64;
643 } *u = buffer;
644
645 GElf_Addr vaddr;
646 if (ehdr.e_ident[EI_CLASS] == ELFCLASS32)
647 vaddr = (ehdr.e_ident[EI_DATA] == ELFDATA2MSB
648 ? BE32 (u->a32) : LE32 (u->a32));
649 else
650 vaddr = (ehdr.e_ident[EI_DATA] == ELFDATA2MSB
651 ? BE64 (u->a64) : LE64 (u->a64));
652
653 (*memory_callback) (mod->dwfl, -1, &buffer, &buffer_available, 0, 0,
654 memory_callback_arg);
655
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000656 if (*elfclass == ELFCLASSNONE)
657 *elfclass = ehdr.e_ident[EI_CLASS];
658 else if (*elfclass != ehdr.e_ident[EI_CLASS])
659 return 0;
660
661 if (*elfdata == ELFDATANONE)
662 *elfdata = ehdr.e_ident[EI_DATA];
663 else if (*elfdata != ehdr.e_ident[EI_DATA])
664 return 0;
665
666 return vaddr;
667 }
668 }
669
670 return 0;
671}
672
673/* Try to find an existing executable module with a DT_DEBUG. */
674static GElf_Addr
675find_executable (Dwfl *dwfl, GElf_Addr at_phdr, GElf_Addr at_entry,
676 uint_fast8_t *elfclass, uint_fast8_t *elfdata,
677 Dwfl_Memory_Callback *memory_callback,
678 void *memory_callback_arg)
679{
680 for (Dwfl_Module *mod = dwfl->modulelist; mod != NULL; mod = mod->next)
681 if (mod->main.elf != NULL)
682 {
683 GElf_Addr r_debug_vaddr = consider_executable (mod, at_phdr, at_entry,
684 elfclass, elfdata,
685 memory_callback,
686 memory_callback_arg);
687 if (r_debug_vaddr != 0)
688 return r_debug_vaddr;
689 }
690
691 return 0;
692}
693
694
695int
696dwfl_link_map_report (Dwfl *dwfl, const void *auxv, size_t auxv_size,
697 Dwfl_Memory_Callback *memory_callback,
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200698 void *memory_callback_arg,
699 struct r_debug_info *r_debug_info)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000700{
701 GElf_Addr r_debug_vaddr = 0;
702
703 uint_fast8_t elfclass = ELFCLASSNONE;
704 uint_fast8_t elfdata = ELFDATANONE;
705 if (likely (auxv != NULL)
706 && likely (auxv_format_probe (auxv, auxv_size, &elfclass, &elfdata)))
707 {
708 GElf_Addr entry = 0;
709 GElf_Addr phdr = 0;
710 GElf_Xword phent = 0;
711 GElf_Xword phnum = 0;
712
Roland McGrath3999ce12013-01-07 14:53:37 -0800713#define READ_AUXV32(ptr) read_4ubyte_unaligned_noncvt (ptr)
714#define READ_AUXV64(ptr) read_8ubyte_unaligned_noncvt (ptr)
715#define AUXV_SCAN(NN, BL) do \
716 { \
717 const Elf##NN##_auxv_t *av = auxv; \
718 for (size_t i = 0; i < auxv_size / sizeof av[0]; ++i) \
719 { \
720 uint##NN##_t type = READ_AUXV##NN (&av[i].a_type); \
721 uint##NN##_t val = BL##NN (READ_AUXV##NN (&av[i].a_un.a_val)); \
722 if (type == BL##NN (AT_ENTRY)) \
723 entry = val; \
724 else if (type == BL##NN (AT_PHDR)) \
725 phdr = val; \
726 else if (type == BL##NN (AT_PHNUM)) \
727 phnum = val; \
728 else if (type == BL##NN (AT_PHENT)) \
729 phent = val; \
730 else if (type == BL##NN (AT_PAGESZ)) \
731 { \
732 if (val > 1 \
733 && (dwfl->segment_align == 0 \
734 || val < dwfl->segment_align)) \
735 dwfl->segment_align = val; \
736 } \
737 } \
738 } \
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000739 while (0)
740
741 if (elfclass == ELFCLASS32)
742 {
743 if (elfdata == ELFDATA2MSB)
744 AUXV_SCAN (32, BE);
745 else
746 AUXV_SCAN (32, LE);
747 }
748 else
749 {
750 if (elfdata == ELFDATA2MSB)
751 AUXV_SCAN (64, BE);
752 else
753 AUXV_SCAN (64, LE);
754 }
755
756 /* If we found the phdr dimensions, search phdrs for PT_DYNAMIC. */
757 GElf_Addr dyn_vaddr = 0;
758 GElf_Xword dyn_filesz = 0;
Roland McGrathd05c5962010-05-04 18:05:22 -0700759 GElf_Addr dyn_bias = (GElf_Addr) -1;
760
761 inline bool consider_phdr (GElf_Word type,
762 GElf_Addr vaddr, GElf_Xword filesz)
763 {
764 switch (type)
765 {
766 case PT_PHDR:
767 if (dyn_bias == (GElf_Addr) -1
768 /* Do a sanity check on the putative address. */
769 && ((vaddr & (dwfl->segment_align - 1))
770 == (phdr & (dwfl->segment_align - 1))))
771 {
772 dyn_bias = phdr - vaddr;
773 return dyn_vaddr != 0;
774 }
775 break;
776
777 case PT_DYNAMIC:
778 dyn_vaddr = vaddr;
779 dyn_filesz = filesz;
780 return dyn_bias != (GElf_Addr) -1;
781 }
782
783 return false;
784 }
785
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000786 if (phdr != 0 && phnum != 0)
787 {
788 Dwfl_Module *phdr_mod;
789 int phdr_segndx = INTUSE(dwfl_addrsegment) (dwfl, phdr, &phdr_mod);
790 Elf_Data in =
791 {
792 .d_type = ELF_T_PHDR,
793 .d_version = EV_CURRENT,
794 .d_size = phnum * phent,
795 .d_buf = NULL
796 };
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200797 bool in_ok = (*memory_callback) (dwfl, phdr_segndx, &in.d_buf,
798 &in.d_size, phdr, phnum * phent,
799 memory_callback_arg);
Mark Wielaard69d68dd2015-12-01 23:11:55 +0100800 bool in_from_exec = false;
Mark Wielaard355b4082015-12-01 22:16:00 +0100801 if (! in_ok
802 && dwfl->user_core != NULL
803 && dwfl->user_core->executable_for_core != NULL)
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200804 {
805 /* AUXV -> PHDR -> DYNAMIC
806 Both AUXV and DYNAMIC should be always present in a core file.
807 PHDR may be missing in core file, try to read it from
808 EXECUTABLE_FOR_CORE to find where DYNAMIC is located in the
809 core file. */
810
Mark Wielaard355b4082015-12-01 22:16:00 +0100811 int fd = open (dwfl->user_core->executable_for_core, O_RDONLY);
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200812 Elf *elf;
813 Dwfl_Error error = DWFL_E_ERRNO;
814 if (fd != -1)
815 error = __libdw_open_file (&fd, &elf, true, false);
816 if (error != DWFL_E_NOERROR)
817 {
818 __libdwfl_seterrno (error);
819 return false;
820 }
821 GElf_Ehdr ehdr_mem, *ehdr = gelf_getehdr (elf, &ehdr_mem);
822 if (ehdr == NULL)
823 {
824 elf_end (elf);
825 close (fd);
826 __libdwfl_seterrno (DWFL_E_LIBELF);
827 return false;
828 }
Mark Wielaard712c8fa2014-11-22 23:08:48 +0100829 size_t e_phnum;
830 if (elf_getphdrnum (elf, &e_phnum) != 0)
831 {
832 elf_end (elf);
833 close (fd);
834 __libdwfl_seterrno (DWFL_E_LIBELF);
835 return false;
836 }
837 if (e_phnum != phnum || ehdr->e_phentsize != phent)
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200838 {
839 elf_end (elf);
840 close (fd);
841 __libdwfl_seterrno (DWFL_E_BADELF);
842 return false;
843 }
844 off_t off = ehdr->e_phoff;
845 assert (in.d_buf == NULL);
846 assert (in.d_size == phnum * phent);
847 in.d_buf = malloc (in.d_size);
848 if (unlikely (in.d_buf == NULL))
849 {
850 elf_end (elf);
851 close (fd);
852 __libdwfl_seterrno (DWFL_E_NOMEM);
853 return false;
854 }
855 ssize_t nread = pread_retry (fd, in.d_buf, in.d_size, off);
856 elf_end (elf);
857 close (fd);
858 if (nread != (ssize_t) in.d_size)
859 {
860 free (in.d_buf);
861 __libdwfl_seterrno (DWFL_E_ERRNO);
862 return false;
863 }
864 in_ok = true;
Mark Wielaard69d68dd2015-12-01 23:11:55 +0100865 in_from_exec = true;
Jan Kratochvil8ff86292013-05-30 13:21:20 +0200866 }
867 if (in_ok)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000868 {
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700869 if (unlikely (phnum > SIZE_MAX / phent))
870 {
871 __libdwfl_seterrno (DWFL_E_NOMEM);
872 return false;
873 }
874 size_t nbytes = phnum * phent;
875 void *buf = malloc (nbytes);
876 Elf32_Phdr (*p32)[phnum] = buf;
877 Elf64_Phdr (*p64)[phnum] = buf;
Mark Wielaardf5920352015-05-22 18:31:58 +0200878 if (unlikely (buf == NULL))
879 {
880 __libdwfl_seterrno (DWFL_E_NOMEM);
881 return false;
882 }
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000883 Elf_Data out =
884 {
885 .d_type = ELF_T_PHDR,
886 .d_version = EV_CURRENT,
887 .d_size = phnum * phent,
Mark Wielaardf5920352015-05-22 18:31:58 +0200888 .d_buf = buf
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000889 };
890 in.d_size = out.d_size;
891 if (likely ((elfclass == ELFCLASS32
892 ? elf32_xlatetom : elf64_xlatetom)
893 (&out, &in, elfdata) != NULL))
894 {
895 /* We are looking for PT_DYNAMIC. */
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000896 if (elfclass == ELFCLASS32)
897 {
898 for (size_t i = 0; i < phnum; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700899 if (consider_phdr ((*p32)[i].p_type,
900 (*p32)[i].p_vaddr,
901 (*p32)[i].p_filesz))
Roland McGrathd05c5962010-05-04 18:05:22 -0700902 break;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000903 }
904 else
905 {
906 for (size_t i = 0; i < phnum; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700907 if (consider_phdr ((*p64)[i].p_type,
908 (*p64)[i].p_vaddr,
909 (*p64)[i].p_filesz))
Roland McGrathd05c5962010-05-04 18:05:22 -0700910 break;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000911 }
912 }
913
Mark Wielaard69d68dd2015-12-01 23:11:55 +0100914 if (in_from_exec)
915 free (in.d_buf);
916 else
917 (*memory_callback) (dwfl, -1, &in.d_buf, &in.d_size, 0, 0,
918 memory_callback_arg);
Mark Wielaardf5920352015-05-22 18:31:58 +0200919 free (buf);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000920 }
921 else
922 /* We could not read the executable's phdrs from the
923 memory image. If we have a presupplied executable,
924 we can still use the AT_PHDR and AT_ENTRY values to
925 verify it, and to adjust its bias if it's a PIE.
926
927 If there was an ET_EXEC module presupplied that contains
928 the AT_PHDR address, then we only consider that one.
929 We'll either accept it if its phdr location and e_entry
930 make sense or reject it if they don't. If there is no
931 presupplied ET_EXEC, then look for a presupplied module,
932 which might be a PIE (ET_DYN) that needs its bias adjusted. */
933 r_debug_vaddr = ((phdr_mod == NULL
934 || phdr_mod->main.elf == NULL
935 || phdr_mod->e_type != ET_EXEC)
936 ? find_executable (dwfl, phdr, entry,
937 &elfclass, &elfdata,
938 memory_callback,
939 memory_callback_arg)
940 : consider_executable (phdr_mod, phdr, entry,
941 &elfclass, &elfdata,
942 memory_callback,
943 memory_callback_arg));
944 }
945
946 /* If we found PT_DYNAMIC, search it for DT_DEBUG. */
947 if (dyn_filesz != 0)
948 {
Roland McGrathd05c5962010-05-04 18:05:22 -0700949 if (dyn_bias != (GElf_Addr) -1)
950 dyn_vaddr += dyn_bias;
951
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000952 Elf_Data in =
953 {
954 .d_type = ELF_T_DYN,
955 .d_version = EV_CURRENT,
956 .d_size = dyn_filesz,
957 .d_buf = NULL
958 };
959 int dyn_segndx = dwfl_addrsegment (dwfl, dyn_vaddr, NULL);
960 if ((*memory_callback) (dwfl, dyn_segndx, &in.d_buf, &in.d_size,
961 dyn_vaddr, dyn_filesz, memory_callback_arg))
962 {
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700963 void *buf = malloc (dyn_filesz);
964 Elf32_Dyn (*d32)[dyn_filesz / sizeof (Elf32_Dyn)] = buf;
965 Elf64_Dyn (*d64)[dyn_filesz / sizeof (Elf64_Dyn)] = buf;
Mark Wielaardf5920352015-05-22 18:31:58 +0200966 if (unlikely (buf == NULL))
967 {
968 __libdwfl_seterrno (DWFL_E_NOMEM);
969 return false;
970 }
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000971 Elf_Data out =
972 {
973 .d_type = ELF_T_DYN,
974 .d_version = EV_CURRENT,
975 .d_size = dyn_filesz,
Mark Wielaardf5920352015-05-22 18:31:58 +0200976 .d_buf = buf
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000977 };
978 in.d_size = out.d_size;
979 if (likely ((elfclass == ELFCLASS32
980 ? elf32_xlatetom : elf64_xlatetom)
981 (&out, &in, elfdata) != NULL))
982 {
Roland McGrathbe139302010-04-14 12:54:45 -0700983 /* We are looking for DT_DEBUG. */
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000984 if (elfclass == ELFCLASS32)
985 {
986 size_t n = dyn_filesz / sizeof (Elf32_Dyn);
987 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700988 if ((*d32)[i].d_tag == DT_DEBUG)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000989 {
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700990 r_debug_vaddr = (*d32)[i].d_un.d_val;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000991 break;
992 }
993 }
994 else
995 {
996 size_t n = dyn_filesz / sizeof (Elf64_Dyn);
997 for (size_t i = 0; i < n; ++i)
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -0700998 if ((*d64)[i].d_tag == DT_DEBUG)
Roland McGrathb4d6f0f2008-08-25 22:55:17 +0000999 {
Chih-Hung Hsieh7eff36d2015-10-06 15:53:15 -07001000 r_debug_vaddr = (*d64)[i].d_un.d_val;
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00001001 break;
1002 }
1003 }
1004 }
1005
1006 (*memory_callback) (dwfl, -1, &in.d_buf, &in.d_size, 0, 0,
1007 memory_callback_arg);
Mark Wielaardf5920352015-05-22 18:31:58 +02001008 free (buf);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00001009 }
1010 }
1011 }
1012 else
1013 /* We have to look for a presupplied executable file to determine
1014 the vaddr of its dynamic section and DT_DEBUG therein. */
1015 r_debug_vaddr = find_executable (dwfl, 0, 0, &elfclass, &elfdata,
1016 memory_callback, memory_callback_arg);
1017
1018 if (r_debug_vaddr == 0)
1019 return 0;
1020
1021 /* For following pointers from struct link_map, we will use an
1022 integrated memory access callback that can consult module text
1023 elided from the core file. This is necessary when the l_name
1024 pointer for the dynamic linker's own entry is a pointer into the
1025 executable's .interp section. */
1026 struct integrated_memory_callback mcb =
1027 {
1028 .memory_callback = memory_callback,
1029 .memory_callback_arg = memory_callback_arg
1030 };
1031
1032 /* Now we can follow the dynamic linker's library list. */
1033 return report_r_debug (elfclass, elfdata, dwfl, r_debug_vaddr,
Jan Kratochvil8ff86292013-05-30 13:21:20 +02001034 &integrated_memory_callback, &mcb, r_debug_info);
Roland McGrathb4d6f0f2008-08-25 22:55:17 +00001035}
1036INTDEF (dwfl_link_map_report)