diff options
Diffstat (limited to 'scripts/kallsyms.c')
-rw-r--r-- | scripts/kallsyms.c | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 22d281c6ec24..f359b730c2c5 100644 --- a/scripts/kallsyms.c +++ b/scripts/kallsyms.c | |||
@@ -43,7 +43,7 @@ struct sym_entry { | |||
43 | 43 | ||
44 | static struct sym_entry *table; | 44 | static struct sym_entry *table; |
45 | static unsigned int table_size, table_cnt; | 45 | static unsigned int table_size, table_cnt; |
46 | static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; | 46 | static unsigned long long _text, _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; |
47 | static int all_symbols = 0; | 47 | static int all_symbols = 0; |
48 | static char symbol_prefix_char = '\0'; | 48 | static char symbol_prefix_char = '\0'; |
49 | 49 | ||
@@ -91,7 +91,9 @@ static int read_symbol(FILE *in, struct sym_entry *s) | |||
91 | sym++; | 91 | sym++; |
92 | 92 | ||
93 | /* Ignore most absolute/undefined (?) symbols. */ | 93 | /* Ignore most absolute/undefined (?) symbols. */ |
94 | if (strcmp(sym, "_stext") == 0) | 94 | if (strcmp(sym, "_text") == 0) |
95 | _text = s->addr; | ||
96 | else if (strcmp(sym, "_stext") == 0) | ||
95 | _stext = s->addr; | 97 | _stext = s->addr; |
96 | else if (strcmp(sym, "_etext") == 0) | 98 | else if (strcmp(sym, "_etext") == 0) |
97 | _etext = s->addr; | 99 | _etext = s->addr; |
@@ -265,9 +267,25 @@ static void write_src(void) | |||
265 | 267 | ||
266 | printf(".data\n"); | 268 | printf(".data\n"); |
267 | 269 | ||
270 | /* Provide proper symbols relocatability by their '_text' | ||
271 | * relativeness. The symbol names cannot be used to construct | ||
272 | * normal symbol references as the list of symbols contains | ||
273 | * symbols that are declared static and are private to their | ||
274 | * .o files. This prevents .tmp_kallsyms.o or any other | ||
275 | * object from referencing them. | ||
276 | */ | ||
268 | output_label("kallsyms_addresses"); | 277 | output_label("kallsyms_addresses"); |
269 | for (i = 0; i < table_cnt; i++) { | 278 | for (i = 0; i < table_cnt; i++) { |
270 | printf("\tPTR\t%#llx\n", table[i].addr); | 279 | if (toupper(table[i].sym[0]) != 'A') { |
280 | if (_text <= table[i].addr) | ||
281 | printf("\tPTR\t_text + %#llx\n", | ||
282 | table[i].addr - _text); | ||
283 | else | ||
284 | printf("\tPTR\t_text - %#llx\n", | ||
285 | _text - table[i].addr); | ||
286 | } else { | ||
287 | printf("\tPTR\t%#llx\n", table[i].addr); | ||
288 | } | ||
271 | } | 289 | } |
272 | printf("\n"); | 290 | printf("\n"); |
273 | 291 | ||