[go: up one dir, main page]

File: symbol-libelf.c

package info (click to toggle)
uftrace 0.13-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 5,212 kB
  • sloc: ansic: 53,313; python: 9,846; makefile: 838; asm: 703; cpp: 602; sh: 560; javascript: 191
file content (70 lines) | stat: -rw-r--r-- 1,348 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifdef HAVE_LIBELF

#include <fcntl.h>
#include <gelf.h>
#include <unistd.h>

/* This should be defined before #include "utils.h" */
#define PR_FMT "symbol"
#define PR_DOMAIN DBG_SYMBOL

#include "utils/symbol-libelf.h"
#include "utils/utils.h"

int elf_init(const char *filename, struct uftrace_elf_data *elf)
{
	elf->fd = open(filename, O_RDONLY);
	if (elf->fd < 0) {
		pr_dbg("error during open ELF file: %s: %m\n", filename);
		goto err;
	}

	elf_version(EV_CURRENT);

	elf->handle = elf_begin(elf->fd, ELF_C_READ_MMAP, NULL);
	if (elf->handle == NULL)
		goto err_close;

	if (gelf_getehdr(elf->handle, &elf->ehdr) == NULL)
		goto err_end;

	return 0;

err_end:
	elf_end(elf->handle);

err_close:
	pr_dbg("ELF error when loading symbols: %s\n", elf_errmsg(elf_errno()));

	close(elf->fd);
	elf->fd = -1;

err:
	elf->handle = NULL;
	return -1;
}

void elf_finish(struct uftrace_elf_data *elf)
{
	if (elf->fd < 0)
		return;

	elf_end(elf->handle);
	elf->handle = NULL;

	close(elf->fd);
	elf->fd = -1;
}

void elf_get_secdata(struct uftrace_elf_data *elf, struct uftrace_elf_iter *iter)
{
	iter->data = elf_getdata((iter)->scn, NULL);
}

void elf_read_secdata(struct uftrace_elf_data *elf, struct uftrace_elf_iter *iter, unsigned offset,
		      void *buf, size_t len)
{
	memcpy(buf, iter->data->d_buf + offset, len);
}

#endif /* HAVE_LIBELF */