diff options
author | Eric W. Biederman <ebiederm@xmission.com> | 2006-12-06 20:14:04 -0500 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2006-12-06 20:14:04 -0500 |
commit | fd593d12770d4a0d1ff095d44b96436c18479ee8 (patch) | |
tree | a930c07b09cef72a01f18acdfa1cb62819135f6c /scripts/kallsyms.c | |
parent | 2a43f3ede48ea3d5790b863b719a1e21c90a3697 (diff) |
[PATCH] relocatable kernel: Kallsyms generate relocatable symbols
Print the addresses of non-absolute symbols relative to _text
so that ld will generate relocations. Allowing a relocatable
kernel to relocate them. We can't actually use the symbol names
because kallsyms includes static symbols that are not exported
from their object files.
Add the _text symbol definitions to the architectures which don't
define it otherwise linker will fail.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'scripts/kallsyms.c')
-rw-r--r-- | scripts/kallsyms.c | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/scripts/kallsyms.c b/scripts/kallsyms.c index 22d281c6ec24..4c1ad0acbb4b 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,21 @@ 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 | printf("\tPTR\t_text + %#llx\n", | ||
281 | table[i].addr - _text); | ||
282 | } else { | ||
283 | printf("\tPTR\t%#llx\n", table[i].addr); | ||
284 | } | ||
271 | } | 285 | } |
272 | printf("\n"); | 286 | printf("\n"); |
273 | 287 | ||