Commit | Line | Data |
---|---|---|
442f04c3 JP |
1 | /* |
2 | * Copyright (C) 2015 Josh Poimboeuf <jpoimboe@redhat.com> | |
3 | * | |
4 | * This program is free software; you can redistribute it and/or | |
5 | * modify it under the terms of the GNU General Public License | |
6 | * as published by the Free Software Foundation; either version 2 | |
7 | * of the License, or (at your option) any later version. | |
8 | * | |
9 | * This program is distributed in the hope that it will be useful, | |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program; if not, see <http://www.gnu.org/licenses/>. | |
16 | */ | |
17 | ||
18 | #ifndef _WARN_H | |
19 | #define _WARN_H | |
20 | ||
baa41469 JP |
21 | #include <stdlib.h> |
22 | #include <string.h> | |
23 | #include <sys/types.h> | |
24 | #include <sys/stat.h> | |
25 | #include <fcntl.h> | |
26 | #include "elf.h" | |
27 | ||
442f04c3 JP |
28 | extern const char *objname; |
29 | ||
30 | static inline char *offstr(struct section *sec, unsigned long offset) | |
31 | { | |
32 | struct symbol *func; | |
33 | char *name, *str; | |
34 | unsigned long name_off; | |
35 | ||
36 | func = find_containing_func(sec, offset); | |
37 | if (func) { | |
38 | name = func->name; | |
39 | name_off = offset - func->offset; | |
40 | } else { | |
41 | name = sec->name; | |
42 | name_off = offset; | |
43 | } | |
44 | ||
45 | str = malloc(strlen(name) + 20); | |
46 | ||
47 | if (func) | |
48 | sprintf(str, "%s()+0x%lx", name, name_off); | |
49 | else | |
50 | sprintf(str, "%s+0x%lx", name, name_off); | |
51 | ||
52 | return str; | |
53 | } | |
54 | ||
55 | #define WARN(format, ...) \ | |
56 | fprintf(stderr, \ | |
57 | "%s: warning: objtool: " format "\n", \ | |
58 | objname, ##__VA_ARGS__) | |
59 | ||
60 | #define WARN_FUNC(format, sec, offset, ...) \ | |
61 | ({ \ | |
62 | char *_str = offstr(sec, offset); \ | |
63 | WARN("%s: " format, _str, ##__VA_ARGS__); \ | |
64 | free(_str); \ | |
65 | }) | |
66 | ||
baa41469 JP |
67 | #define WARN_ELF(format, ...) \ |
68 | WARN(format ": %s", ##__VA_ARGS__, elf_errmsg(-1)) | |
69 | ||
442f04c3 | 70 | #endif /* _WARN_H */ |