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
|
/* -*- linux-c -*-
* symbols.c - stp symbol and module functions
*
* Copyright (C) Red Hat Inc, 2006-2009
*
* This file is part of systemtap, and is free software. You can
* redistribute it and/or modify it under the terms of the GNU General
* Public License (GPL); either version 2, or (at your option) any
* later version.
*/
#ifndef _STP_SYMBOLS_C_
#define _STP_SYMBOLS_C_
#include "../sym.h"
static void _stp_do_relocation(const char __user *buf, size_t count)
{
struct _stp_msg_relocation msg;
unsigned mi, si;
if (sizeof(msg) != count)
{
errk ("STP_RELOCATE message size mismatch (%lu vs %lu)\n",
(long unsigned) sizeof(msg), (long unsigned) count);
return;
}
if (unlikely(copy_from_user (& msg, buf, count)))
return;
dbug_sym(2, "relocate (%s %s 0x%lx)\n", msg.module, msg.reloc, (unsigned long) msg.address);
/* Save the relocation value. XXX: While keeping the data here is
fine for the kernel address space ("kernel" and "*.ko" modules),
it is NOT fine for user-space apps. They need a separate
relocation values for each address space, since the same shared
libraries/executables can be mapped in at different
addresses. */
for (mi=0; mi<_stp_num_modules; mi++)
{
if (strcmp (_stp_modules[mi]->name, msg.module))
continue;
if (!strcmp (".note.gnu.build-id", msg.reloc)) {
_stp_modules[mi]->notes_sect = msg.address; /* cache this particular address */
}
for (si=0; si<_stp_modules[mi]->num_sections; si++)
{
if (strcmp (_stp_modules[mi]->sections[si].name, msg.reloc))
continue;
else
{
_stp_modules[mi]->sections[si].addr = msg.address;
break;
}
} /* loop over sections */
} /* loop over modules */
}
#endif /* _STP_SYMBOLS_C_ */
|