ltrace-elf.c revision 013ef5b78915cd24324fe28e68ae38de9249cb4e
1/*
2 * This file is part of ltrace.
3 * Copyright (C) 2006,2010,2011,2012 Petr Machata, Red Hat Inc.
4 * Copyright (C) 2010 Zachary T Welch, CodeSourcery
5 * Copyright (C) 2010 Joe Damato
6 * Copyright (C) 1997,1998,2001,2004,2007,2008,2009 Juan Cespedes
7 * Copyright (C) 2006 Olaf Hering, SUSE Linux GmbH
8 * Copyright (C) 2006 Eric Vaitl, Cisco Systems, Inc.
9 * Copyright (C) 2006 Paul Gilliam, IBM Corporation
10 * Copyright (C) 2006 Ian Wienand
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License as
14 * published by the Free Software Foundation; either version 2 of the
15 * License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
25 * 02110-1301 USA
26 */
27
28#include "config.h"
29
30#include <assert.h>
31#ifdef	__linux__
32#include <endian.h>
33#endif
34#include <errno.h>
35#include <fcntl.h>
36#include <gelf.h>
37#include <inttypes.h>
38#include <search.h>
39#include <stdint.h>
40#include <stdio.h>
41#include <stdlib.h>
42#include <string.h>
43#include <unistd.h>
44
45#include "backend.h"
46#include "filter.h"
47#include "library.h"
48#include "ltrace-elf.h"
49#include "proc.h"
50#include "debug.h"
51#include "options.h"
52
53#ifndef ARCH_HAVE_LTELF_DATA
54int
55arch_elf_init(struct ltelf *lte, struct library *lib)
56{
57	return 0;
58}
59
60void
61arch_elf_destroy(struct ltelf *lte)
62{
63}
64#endif
65
66static int
67default_elf_add_plt_entry(struct Process *proc, struct ltelf *lte,
68			  const char *a_name, GElf_Rela *rela, size_t ndx,
69			  struct library_symbol **ret)
70{
71	char *name = strdup(a_name);
72	if (name == NULL) {
73	fail:
74		free(name);
75		return -1;
76	}
77
78	GElf_Addr addr = arch_plt_sym_val(lte, ndx, rela);
79
80	struct library_symbol *libsym = malloc(sizeof(*libsym));
81	if (libsym == NULL)
82		goto fail;
83
84	/* XXX The double cast should be removed when
85	 * arch_addr_t becomes integral type.  */
86	arch_addr_t taddr = (arch_addr_t)
87		(uintptr_t)(addr + lte->bias);
88
89	if (library_symbol_init(libsym, taddr, name, 1, LS_TOPLT_EXEC) < 0) {
90		free(libsym);
91		goto fail;
92	}
93
94	libsym->next = *ret;
95	*ret = libsym;
96	return 0;
97}
98
99#ifndef ARCH_HAVE_ADD_PLT_ENTRY
100enum plt_status
101arch_elf_add_plt_entry(struct Process *proc, struct ltelf *lte,
102		       const char *a_name, GElf_Rela *rela, size_t ndx,
103		       struct library_symbol **ret)
104{
105	return plt_default;
106}
107#endif
108
109Elf_Data *
110elf_loaddata(Elf_Scn *scn, GElf_Shdr *shdr)
111{
112	Elf_Data *data = elf_getdata(scn, NULL);
113	if (data == NULL || elf_getdata(scn, data) != NULL
114	    || data->d_off || data->d_size != shdr->sh_size)
115		return NULL;
116	return data;
117}
118
119static int
120elf_get_section_if(struct ltelf *lte, Elf_Scn **tgt_sec, GElf_Shdr *tgt_shdr,
121		   int (*predicate)(Elf_Scn *, GElf_Shdr *, void *data),
122		   void *data)
123{
124	int i;
125	for (i = 1; i < lte->ehdr.e_shnum; ++i) {
126		Elf_Scn *scn;
127		GElf_Shdr shdr;
128
129		scn = elf_getscn(lte->elf, i);
130		if (scn == NULL || gelf_getshdr(scn, &shdr) == NULL) {
131			debug(1, "Couldn't read section or header.");
132			return -1;
133		}
134		if (predicate(scn, &shdr, data)) {
135			*tgt_sec = scn;
136			*tgt_shdr = shdr;
137			return 0;
138		}
139	}
140	return -1;
141
142}
143
144static int
145inside_p(Elf_Scn *scn, GElf_Shdr *shdr, void *data)
146{
147	GElf_Addr addr = *(GElf_Addr *)data;
148	return addr >= shdr->sh_addr
149		&& addr < shdr->sh_addr + shdr->sh_size;
150}
151
152int
153elf_get_section_covering(struct ltelf *lte, GElf_Addr addr,
154			 Elf_Scn **tgt_sec, GElf_Shdr *tgt_shdr)
155{
156	return elf_get_section_if(lte, tgt_sec, tgt_shdr,
157				  &inside_p, &addr);
158}
159
160static int
161type_p(Elf_Scn *scn, GElf_Shdr *shdr, void *data)
162{
163	GElf_Word type = *(GElf_Word *)data;
164	return shdr->sh_type == type;
165}
166
167int
168elf_get_section_type(struct ltelf *lte, GElf_Word type,
169		     Elf_Scn **tgt_sec, GElf_Shdr *tgt_shdr)
170{
171	return elf_get_section_if(lte, tgt_sec, tgt_shdr,
172				  &type_p, &type);
173}
174
175struct section_named_data {
176	struct ltelf *lte;
177	const char *name;
178};
179
180static int
181name_p(Elf_Scn *scn, GElf_Shdr *shdr, void *d)
182{
183	struct section_named_data *data = d;
184	const char *name = elf_strptr(data->lte->elf,
185				      data->lte->ehdr.e_shstrndx,
186				      shdr->sh_name);
187	return strcmp(name, data->name) == 0;
188}
189
190int
191elf_get_section_named(struct ltelf *lte, const char *name,
192		     Elf_Scn **tgt_sec, GElf_Shdr *tgt_shdr)
193{
194	struct section_named_data data = {
195		.lte = lte,
196		.name = name,
197	};
198	return elf_get_section_if(lte, tgt_sec, tgt_shdr,
199				  &name_p, &data);
200}
201
202static int
203need_data(Elf_Data *data, GElf_Xword offset, GElf_Xword size)
204{
205	assert(data != NULL);
206	if (data->d_size < size || offset > data->d_size - size) {
207		debug(1, "Not enough data to read %"PRId64"-byte value"
208		      " at offset %"PRId64".", size, offset);
209		return -1;
210	}
211	return 0;
212}
213
214#define DEF_READER(NAME, SIZE)						\
215	int								\
216	NAME(Elf_Data *data, GElf_Xword offset, uint##SIZE##_t *retp)	\
217	{								\
218		if (!need_data(data, offset, SIZE / 8) < 0)		\
219			return -1;					\
220									\
221		if (data->d_buf == NULL) /* NODATA section */ {		\
222			*retp = 0;					\
223			return 0;					\
224		}							\
225									\
226		union {							\
227			uint##SIZE##_t dst;				\
228			char buf[0];					\
229		} u;							\
230		memcpy(u.buf, data->d_buf + offset, sizeof(u.dst));	\
231		*retp = u.dst;						\
232		return 0;						\
233	}
234
235DEF_READER(elf_read_u16, 16)
236DEF_READER(elf_read_u32, 32)
237DEF_READER(elf_read_u64, 64)
238
239#undef DEF_READER
240
241int
242open_elf(struct ltelf *lte, const char *filename)
243{
244	lte->fd = open(filename, O_RDONLY);
245	if (lte->fd == -1)
246		return 1;
247
248	elf_version(EV_CURRENT);
249
250#ifdef HAVE_ELF_C_READ_MMAP
251	lte->elf = elf_begin(lte->fd, ELF_C_READ_MMAP, NULL);
252#else
253	lte->elf = elf_begin(lte->fd, ELF_C_READ, NULL);
254#endif
255
256	if (lte->elf == NULL || elf_kind(lte->elf) != ELF_K_ELF) {
257		fprintf(stderr, "\"%s\" is not an ELF file\n", filename);
258		exit(EXIT_FAILURE);
259	}
260
261	if (gelf_getehdr(lte->elf, &lte->ehdr) == NULL) {
262		fprintf(stderr, "can't read ELF header of \"%s\": %s\n",
263			filename, elf_errmsg(-1));
264		exit(EXIT_FAILURE);
265	}
266
267	if (lte->ehdr.e_type != ET_EXEC && lte->ehdr.e_type != ET_DYN) {
268		fprintf(stderr, "\"%s\" is neither an ELF executable"
269			" nor a shared library\n", filename);
270		exit(EXIT_FAILURE);
271	}
272
273	if (1
274#ifdef LT_ELF_MACHINE
275	    && (lte->ehdr.e_ident[EI_CLASS] != LT_ELFCLASS
276		|| lte->ehdr.e_machine != LT_ELF_MACHINE)
277#endif
278#ifdef LT_ELF_MACHINE2
279	    && (lte->ehdr.e_ident[EI_CLASS] != LT_ELFCLASS2
280		|| lte->ehdr.e_machine != LT_ELF_MACHINE2)
281#endif
282#ifdef LT_ELF_MACHINE3
283	    && (lte->ehdr.e_ident[EI_CLASS] != LT_ELFCLASS3
284		|| lte->ehdr.e_machine != LT_ELF_MACHINE3)
285#endif
286		) {
287		fprintf(stderr,
288			"\"%s\" is ELF from incompatible architecture\n",
289			filename);
290		exit(EXIT_FAILURE);
291	}
292
293	return 0;
294}
295
296static void
297read_symbol_table(struct ltelf *lte, const char *filename,
298		  Elf_Scn *scn, GElf_Shdr *shdr, const char *name,
299		  Elf_Data **datap, size_t *countp, const char **strsp)
300{
301	*datap = elf_getdata(scn, NULL);
302	*countp = shdr->sh_size / shdr->sh_entsize;
303	if ((*datap == NULL || elf_getdata(scn, *datap) != NULL)
304	    && options.static_filter != NULL) {
305		fprintf(stderr, "Couldn't get data of section"
306			" %s from \"%s\": %s\n",
307			name, filename, elf_errmsg(-1));
308		exit(EXIT_FAILURE);
309	}
310
311	scn = elf_getscn(lte->elf, shdr->sh_link);
312	GElf_Shdr shdr2;
313	if (scn == NULL || gelf_getshdr(scn, &shdr2) == NULL) {
314		fprintf(stderr, "Couldn't get header of section"
315			" #%d from \"%s\": %s\n",
316			shdr2.sh_link, filename, elf_errmsg(-1));
317		exit(EXIT_FAILURE);
318	}
319
320	Elf_Data *data = elf_getdata(scn, NULL);
321	if (data == NULL || elf_getdata(scn, data) != NULL
322	    || shdr2.sh_size != data->d_size || data->d_off) {
323		fprintf(stderr, "Couldn't get data of section"
324			" #%d from \"%s\": %s\n",
325			shdr2.sh_link, filename, elf_errmsg(-1));
326		exit(EXIT_FAILURE);
327	}
328
329	*strsp = data->d_buf;
330}
331
332static int
333do_init_elf(struct ltelf *lte, const char *filename, GElf_Addr bias)
334{
335	int i;
336	GElf_Addr relplt_addr = 0;
337	GElf_Addr soname_offset = 0;
338
339	debug(DEBUG_FUNCTION, "do_init_elf(filename=%s)", filename);
340	debug(1, "Reading ELF from %s...", filename);
341
342	if (open_elf(lte, filename) < 0)
343		return -1;
344
345	/* Find out the base address.  */
346	{
347		GElf_Phdr phdr;
348		for (i = 0; gelf_getphdr (lte->elf, i, &phdr) != NULL; ++i) {
349			if (phdr.p_type == PT_LOAD) {
350				lte->base_addr = phdr.p_vaddr + bias;
351				break;
352			}
353		}
354	}
355
356	if (lte->base_addr == 0) {
357		fprintf(stderr, "Couldn't determine base address of %s\n",
358			filename);
359		return -1;
360	}
361
362	lte->bias = bias;
363	lte->entry_addr = lte->ehdr.e_entry + lte->bias;
364
365	for (i = 1; i < lte->ehdr.e_shnum; ++i) {
366		Elf_Scn *scn;
367		GElf_Shdr shdr;
368		const char *name;
369
370		scn = elf_getscn(lte->elf, i);
371		if (scn == NULL || gelf_getshdr(scn, &shdr) == NULL) {
372			fprintf(stderr,	"Couldn't get section #%d from"
373				" \"%s\": %s\n", i, filename, elf_errmsg(-1));
374			exit(EXIT_FAILURE);
375		}
376
377		name = elf_strptr(lte->elf, lte->ehdr.e_shstrndx, shdr.sh_name);
378		if (name == NULL) {
379			fprintf(stderr,	"Couldn't get name of section #%d from"
380				" \"%s\": %s\n", i, filename, elf_errmsg(-1));
381			exit(EXIT_FAILURE);
382		}
383
384		if (shdr.sh_type == SHT_SYMTAB) {
385			read_symbol_table(lte, filename,
386					  scn, &shdr, name, &lte->symtab,
387					  &lte->symtab_count, &lte->strtab);
388
389		} else if (shdr.sh_type == SHT_DYNSYM) {
390			read_symbol_table(lte, filename,
391					  scn, &shdr, name, &lte->dynsym,
392					  &lte->dynsym_count, &lte->dynstr);
393
394		} else if (shdr.sh_type == SHT_DYNAMIC) {
395			Elf_Data *data;
396			size_t j;
397
398			lte->dyn_addr = shdr.sh_addr;
399			lte->dyn_sz = shdr.sh_size;
400
401			data = elf_getdata(scn, NULL);
402			if (data == NULL || elf_getdata(scn, data) != NULL) {
403				fprintf(stderr, "Couldn't get .dynamic data"
404					" from \"%s\": %s\n",
405					filename, strerror(errno));
406				exit(EXIT_FAILURE);
407			}
408
409			for (j = 0; j < shdr.sh_size / shdr.sh_entsize; ++j) {
410				GElf_Dyn dyn;
411
412				if (gelf_getdyn(data, j, &dyn) == NULL) {
413					fprintf(stderr, "Couldn't get .dynamic"
414						" data from \"%s\": %s\n",
415						filename, strerror(errno));
416					exit(EXIT_FAILURE);
417				}
418				if (dyn.d_tag == DT_JMPREL)
419					relplt_addr = dyn.d_un.d_ptr;
420				else if (dyn.d_tag == DT_PLTRELSZ)
421					lte->relplt_size = dyn.d_un.d_val;
422				else if (dyn.d_tag == DT_SONAME)
423					soname_offset = dyn.d_un.d_val;
424			}
425		} else if (shdr.sh_type == SHT_PROGBITS
426			   || shdr.sh_type == SHT_NOBITS) {
427			if (strcmp(name, ".plt") == 0) {
428				lte->plt_addr = shdr.sh_addr;
429				lte->plt_size = shdr.sh_size;
430				lte->plt_data = elf_loaddata(scn, &shdr);
431				if (lte->plt_data == NULL)
432					fprintf(stderr,
433						"Can't load .plt data\n");
434				lte->plt_flags = shdr.sh_flags;
435			}
436#ifdef ARCH_SUPPORTS_OPD
437			else if (strcmp(name, ".opd") == 0) {
438				lte->opd_addr = (GElf_Addr *) (long) shdr.sh_addr;
439				lte->opd_size = shdr.sh_size;
440				lte->opd = elf_rawdata(scn, NULL);
441			}
442#endif
443		}
444	}
445
446	if (lte->dynsym == NULL || lte->dynstr == NULL) {
447		fprintf(stderr, "Couldn't find .dynsym or .dynstr in \"%s\"\n",
448			filename);
449		exit(EXIT_FAILURE);
450	}
451
452	if (!relplt_addr || !lte->plt_addr) {
453		debug(1, "%s has no PLT relocations", filename);
454		lte->relplt = NULL;
455		lte->relplt_count = 0;
456	} else if (lte->relplt_size == 0) {
457		debug(1, "%s has unknown PLT size", filename);
458		lte->relplt = NULL;
459		lte->relplt_count = 0;
460	} else {
461
462		for (i = 1; i < lte->ehdr.e_shnum; ++i) {
463			Elf_Scn *scn;
464			GElf_Shdr shdr;
465
466			scn = elf_getscn(lte->elf, i);
467			if (scn == NULL || gelf_getshdr(scn, &shdr) == NULL) {
468				fprintf(stderr, "Couldn't get section header"
469					" from \"%s\": %s\n",
470					filename, elf_errmsg(-1));
471				exit(EXIT_FAILURE);
472			}
473			if (shdr.sh_addr == relplt_addr
474			    && shdr.sh_size == lte->relplt_size) {
475				lte->relplt = elf_getdata(scn, NULL);
476				lte->relplt_count =
477				    shdr.sh_size / shdr.sh_entsize;
478				if (lte->relplt == NULL
479				    || elf_getdata(scn, lte->relplt) != NULL) {
480					fprintf(stderr, "Couldn't get .rel*.plt"
481						" data from \"%s\": %s\n",
482						filename, elf_errmsg(-1));
483					exit(EXIT_FAILURE);
484				}
485				break;
486			}
487		}
488
489		if (i == lte->ehdr.e_shnum) {
490			fprintf(stderr,
491				"Couldn't find .rel*.plt section in \"%s\"\n",
492				filename);
493			exit(EXIT_FAILURE);
494		}
495
496		debug(1, "%s %zd PLT relocations", filename, lte->relplt_count);
497	}
498
499	if (soname_offset != 0)
500		lte->soname = lte->dynstr + soname_offset;
501
502	return 0;
503}
504
505/* XXX temporarily non-static */
506void
507do_close_elf(struct ltelf *lte) {
508	debug(DEBUG_FUNCTION, "do_close_elf()");
509	arch_elf_destroy(lte);
510	elf_end(lte->elf);
511	close(lte->fd);
512}
513
514#ifndef ARCH_HAVE_GET_SYMINFO
515int
516arch_get_sym_info(struct ltelf *lte, const char *filename,
517		  size_t sym_index, GElf_Rela *rela, GElf_Sym *sym)
518{
519	int i = sym_index;
520	GElf_Rel rel;
521	void *ret;
522
523	if (lte->relplt->d_type == ELF_T_REL) {
524		ret = gelf_getrel(lte->relplt, i, &rel);
525		rela->r_offset = rel.r_offset;
526		rela->r_info = rel.r_info;
527		rela->r_addend = 0;
528	} else {
529		ret = gelf_getrela(lte->relplt, i, rela);
530	}
531
532	if (ret == NULL
533	    || ELF64_R_SYM(rela->r_info) >= lte->dynsym_count
534	    || gelf_getsym(lte->dynsym, ELF64_R_SYM(rela->r_info),
535			   sym) == NULL) {
536		fprintf(stderr,
537			"Couldn't get relocation from \"%s\": %s\n",
538			filename, elf_errmsg(-1));
539		exit(EXIT_FAILURE);
540	}
541
542	return 0;
543}
544#endif
545
546static int
547populate_plt(struct Process *proc, const char *filename,
548	     struct ltelf *lte, struct library *lib)
549{
550	size_t i;
551	for (i = 0; i < lte->relplt_count; ++i) {
552		GElf_Rela rela;
553		GElf_Sym sym;
554
555		if (arch_get_sym_info(lte, filename, i, &rela, &sym) < 0)
556			continue; /* Skip this entry.  */
557
558		char const *name = lte->dynstr + sym.st_name;
559
560		if (!filter_matches_symbol(options.plt_filter, name, lib))
561			continue;
562
563		struct library_symbol *libsym = NULL;
564		switch (arch_elf_add_plt_entry(proc, lte, name,
565					       &rela, i, &libsym)) {
566		case plt_default:
567			if (default_elf_add_plt_entry(proc, lte, name,
568						      &rela, i, &libsym) < 0)
569			/* fall-through */
570		case plt_fail:
571				return -1;
572			/* fall-through */
573		case plt_ok:
574			if (libsym != NULL)
575				library_add_symbol(lib, libsym);
576		}
577	}
578	return 0;
579}
580
581/* When -x rules result in request to trace several aliases, we only
582 * want to add such symbol once.  The only way that those symbols
583 * differ in is their name, e.g. in glibc you have __GI___libc_free,
584 * __cfree, __free, __libc_free, cfree and free all defined on the
585 * same address.  So instead we keep this unique symbol struct for
586 * each address, and replace name in libsym with a shorter variant if
587 * we find it.  */
588struct unique_symbol {
589	arch_addr_t addr;
590	struct library_symbol *libsym;
591};
592
593static int
594unique_symbol_cmp(const void *key, const void *val)
595{
596	const struct unique_symbol *sym_key = key;
597	const struct unique_symbol *sym_val = val;
598	return sym_key->addr != sym_val->addr;
599}
600
601static int
602populate_this_symtab(struct Process *proc, const char *filename,
603		     struct ltelf *lte, struct library *lib,
604		     Elf_Data *symtab, const char *strtab, size_t size,
605		     struct library_exported_name **names)
606{
607	/* If a valid NAMES is passed, we pass in *NAMES a list of
608	 * symbol names that this library exports.  */
609	if (names != NULL)
610		*names = NULL;
611
612	/* Using sorted array would be arguably better, but this
613	 * should be well enough for the number of symbols that we
614	 * typically deal with.  */
615	size_t num_symbols = 0;
616	struct unique_symbol *symbols = malloc(sizeof(*symbols) * size);
617	if (symbols == NULL) {
618		fprintf(stderr, "couldn't insert symbols for -x: %s\n",
619			strerror(errno));
620		return -1;
621	}
622
623	GElf_Word secflags[lte->ehdr.e_shnum];
624	size_t i;
625	for (i = 1; i < lte->ehdr.e_shnum; ++i) {
626		Elf_Scn *scn = elf_getscn(lte->elf, i);
627		if (scn == NULL)
628			continue;
629		GElf_Shdr shdr;
630		if (gelf_getshdr(scn, &shdr) == NULL)
631			continue;
632		secflags[i] = shdr.sh_flags;
633	}
634
635	size_t lib_len = strlen(lib->soname);
636	for (i = 0; i < size; ++i) {
637		GElf_Sym sym;
638		if (gelf_getsym(symtab, i, &sym) == NULL) {
639		fail:
640			fprintf(stderr,
641				"couldn't get symbol #%zd from %s: %s\n",
642				i, filename, elf_errmsg(-1));
643			continue;
644		}
645
646		/* XXX support IFUNC as well.  */
647		if (GELF_ST_TYPE(sym.st_info) != STT_FUNC
648		    || sym.st_value == 0
649		    || sym.st_shndx == STN_UNDEF)
650			continue;
651
652		/* Find symbol name and snip version.  */
653		const char *orig_name = strtab + sym.st_name;
654		const char *version = strchr(orig_name, '@');
655		size_t len = version != NULL ? (assert(version > orig_name),
656						(size_t)(version - orig_name))
657			: strlen(orig_name);
658		char name[len + 1];
659		memcpy(name, orig_name, len);
660		name[len] = 0;
661
662		/* If we are interested in exports, store this name.  */
663		char *name_copy = NULL;
664		if (names != NULL) {
665			struct library_exported_name *export = NULL;
666			name_copy = strdup(name);
667
668			if (name_copy == NULL
669			    || (export = malloc(sizeof(*export))) == NULL) {
670				free(name_copy);
671				fprintf(stderr, "Couldn't store symbol %s.  "
672					"Tracing may be incomplete.\n", name);
673			} else {
674				export->name = name_copy;
675				export->own_name = 1;
676				export->next = *names;
677				*names = export;
678			}
679		}
680
681		/* If the symbol is not matched, skip it.  We already
682		 * stored it to export list above.  */
683		if (!filter_matches_symbol(options.static_filter, name, lib))
684			continue;
685
686		arch_addr_t addr = (arch_addr_t)
687			(uintptr_t)(sym.st_value + lte->bias);
688		arch_addr_t naddr;
689
690		/* On arches that support OPD, the value of typical
691		 * function symbol will be a pointer to .opd, but some
692		 * will point directly to .text.  We don't want to
693		 * translate those.  */
694		if (secflags[sym.st_shndx] & SHF_EXECINSTR) {
695			naddr = addr;
696		} else if (arch_translate_address(lte, addr, &naddr) < 0) {
697			fprintf(stderr,
698				"couldn't translate address of %s@%s: %s\n",
699				name, lib->soname, strerror(errno));
700			continue;
701		}
702
703		char *full_name;
704		int own_full_name = 1;
705		if (lib->type != LT_LIBTYPE_MAIN) {
706			full_name = malloc(strlen(name) + 1 + lib_len + 1);
707			if (full_name == NULL)
708				goto fail;
709			sprintf(full_name, "%s@%s", name, lib->soname);
710		} else {
711			if (name_copy == NULL) {
712				full_name = strdup(name);
713				if (full_name == NULL)
714					goto fail;
715			} else {
716				full_name = name_copy;
717				own_full_name = 0;
718			}
719		}
720
721		/* Look whether we already have a symbol for this
722		 * address.  If not, add this one.  */
723		struct unique_symbol key = { naddr, NULL };
724		struct unique_symbol *unique
725			= lsearch(&key, symbols, &num_symbols,
726				  sizeof(*symbols), &unique_symbol_cmp);
727
728		if (unique->libsym == NULL) {
729			struct library_symbol *libsym = malloc(sizeof(*libsym));
730			if (libsym == NULL
731			    || library_symbol_init(libsym, naddr,
732						   full_name, own_full_name,
733						   LS_TOPLT_NONE) < 0) {
734				--num_symbols;
735				goto fail;
736			}
737			unique->libsym = libsym;
738			unique->addr = naddr;
739
740		} else if (strlen(full_name) < strlen(unique->libsym->name)) {
741			library_symbol_set_name(unique->libsym,
742						full_name, own_full_name);
743
744		} else if (own_full_name) {
745			free(full_name);
746		}
747	}
748
749	for (i = 0; i < num_symbols; ++i) {
750		assert(symbols[i].libsym != NULL);
751		library_add_symbol(lib, symbols[i].libsym);
752	}
753
754	free(symbols);
755
756	return 0;
757}
758
759static int
760populate_symtab(struct Process *proc, const char *filename,
761		struct ltelf *lte, struct library *lib,
762		int symtabs, int exports)
763{
764	int status;
765	if (symtabs && lte->symtab != NULL && lte->strtab != NULL
766	    && (status = populate_this_symtab(proc, filename, lte, lib,
767					      lte->symtab, lte->strtab,
768					      lte->symtab_count, NULL)) < 0)
769		return status;
770
771	/* Check whether we want to trace symbols implemented by this
772	 * library (-l).  */
773	struct library_exported_name **names = NULL;
774	if (exports) {
775		debug(DEBUG_FUNCTION, "-l matches %s", lib->soname);
776		names = &lib->exported_names;
777	}
778
779	return populate_this_symtab(proc, filename, lte, lib,
780				    lte->dynsym, lte->dynstr,
781				    lte->dynsym_count, names);
782}
783
784int
785ltelf_read_library(struct library *lib, struct Process *proc,
786		   const char *filename, GElf_Addr bias)
787{
788	struct ltelf lte = {};
789	if (do_init_elf(&lte, filename, bias) < 0)
790		return -1;
791	if (arch_elf_init(&lte, lib) < 0) {
792		fprintf(stderr, "Backend initialization failed.\n");
793		return -1;
794	}
795
796	proc->e_machine = lte.ehdr.e_machine;
797	proc->e_class = lte.ehdr.e_ident[EI_CLASS];
798
799	int status = 0;
800	if (lib == NULL)
801		goto fail;
802
803	/* Note that we set soname and pathname as soon as they are
804	 * allocated, so in case of further errors, this get released
805	 * when LIB is release, which should happen in the caller when
806	 * we return error.  */
807
808	if (lib->pathname == NULL) {
809		char *pathname = strdup(filename);
810		if (pathname == NULL)
811			goto fail;
812		library_set_pathname(lib, pathname, 1);
813	}
814
815	if (lte.soname != NULL) {
816		char *soname = strdup(lte.soname);
817		if (soname == NULL)
818			goto fail;
819		library_set_soname(lib, soname, 1);
820	} else {
821		const char *soname = rindex(lib->pathname, '/') + 1;
822		if (soname == NULL)
823			soname = lib->pathname;
824		library_set_soname(lib, soname, 0);
825	}
826
827	/* XXX The double cast should be removed when
828	 * arch_addr_t becomes integral type.  */
829	arch_addr_t entry = (arch_addr_t)(uintptr_t)lte.entry_addr;
830	if (arch_translate_address(&lte, entry, &entry) < 0)
831		goto fail;
832
833	/* XXX The double cast should be removed when
834	 * arch_addr_t becomes integral type.  */
835	lib->base = (arch_addr_t)(uintptr_t)lte.base_addr;
836	lib->entry = entry;
837	/* XXX The double cast should be removed when
838	 * arch_addr_t becomes integral type.  */
839	lib->dyn_addr = (arch_addr_t)(uintptr_t)lte.dyn_addr;
840
841	/* There are two reasons that we need to inspect symbol tables
842	 * or populate PLT entries.  Either the user requested
843	 * corresponding tracing features (respectively -x and -e), or
844	 * they requested tracing exported symbols (-l).
845	 *
846	 * In the latter case we need to keep even those PLT slots
847	 * that are not requested by -e (but we keep them latent).  We
848	 * also need to inspect .dynsym to find what exports this
849	 * library provide, to turn on existing latent PLT
850	 * entries.  */
851
852	int plts = filter_matches_library(options.plt_filter, lib);
853	if ((plts || options.export_filter != NULL)
854	    && populate_plt(proc, filename, &lte, lib) < 0)
855		goto fail;
856
857	int exports = filter_matches_library(options.export_filter, lib);
858	int symtabs = filter_matches_library(options.static_filter, lib);
859	if ((symtabs || exports)
860	    && populate_symtab(proc, filename, &lte, lib,
861			       symtabs, exports) < 0)
862		goto fail;
863
864done:
865	do_close_elf(&lte);
866	return status;
867
868fail:
869	status = -1;
870	goto done;
871}
872
873struct library *
874ltelf_read_main_binary(struct Process *proc, const char *path)
875{
876	struct library *lib = malloc(sizeof(*lib));
877	if (lib == NULL)
878		return NULL;
879	library_init(lib, LT_LIBTYPE_MAIN);
880	library_set_pathname(lib, path, 0);
881
882	/* There is a race between running the process and reading its
883	 * binary for internal consumption.  So open the binary from
884	 * the /proc filesystem.  XXX Note that there is similar race
885	 * for libraries, but there we don't have a nice answer like
886	 * that.  Presumably we could read the DSOs from the process
887	 * memory image, but that's not currently done.  */
888	char *fname = pid2name(proc->pid);
889	if (ltelf_read_library(lib, proc, fname, 0) < 0) {
890		library_destroy(lib);
891		free(lib);
892		return NULL;
893	}
894
895	return lib;
896}
897