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 | |
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>
-rw-r--r-- | arch/h8300/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/m68knommu/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/powerpc/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/ppc/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/sparc/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/sparc64/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | arch/v850/kernel/vmlinux.lds.S | 1 | ||||
-rw-r--r-- | scripts/kallsyms.c | 20 |
8 files changed, 24 insertions, 3 deletions
diff --git a/arch/h8300/kernel/vmlinux.lds.S b/arch/h8300/kernel/vmlinux.lds.S index 756325dd480e..f05288be8878 100644 --- a/arch/h8300/kernel/vmlinux.lds.S +++ b/arch/h8300/kernel/vmlinux.lds.S | |||
@@ -70,6 +70,7 @@ SECTIONS | |||
70 | #endif | 70 | #endif |
71 | .text : | 71 | .text : |
72 | { | 72 | { |
73 | _text = .; | ||
73 | #if defined(CONFIG_ROMKERNEL) | 74 | #if defined(CONFIG_ROMKERNEL) |
74 | *(.int_redirect) | 75 | *(.int_redirect) |
75 | #endif | 76 | #endif |
diff --git a/arch/m68knommu/kernel/vmlinux.lds.S b/arch/m68knommu/kernel/vmlinux.lds.S index 58afa8be604e..2b2a10da64a4 100644 --- a/arch/m68knommu/kernel/vmlinux.lds.S +++ b/arch/m68knommu/kernel/vmlinux.lds.S | |||
@@ -60,6 +60,7 @@ SECTIONS { | |||
60 | #endif | 60 | #endif |
61 | 61 | ||
62 | .text : { | 62 | .text : { |
63 | _text = .; | ||
63 | _stext = . ; | 64 | _stext = . ; |
64 | *(.text) | 65 | *(.text) |
65 | SCHED_TEXT | 66 | SCHED_TEXT |
diff --git a/arch/powerpc/kernel/vmlinux.lds.S b/arch/powerpc/kernel/vmlinux.lds.S index e8342d867536..04b98671a060 100644 --- a/arch/powerpc/kernel/vmlinux.lds.S +++ b/arch/powerpc/kernel/vmlinux.lds.S | |||
@@ -33,6 +33,7 @@ SECTIONS | |||
33 | 33 | ||
34 | /* Text and gots */ | 34 | /* Text and gots */ |
35 | .text : { | 35 | .text : { |
36 | _text = .; | ||
36 | *(.text .text.*) | 37 | *(.text .text.*) |
37 | SCHED_TEXT | 38 | SCHED_TEXT |
38 | LOCK_TEXT | 39 | LOCK_TEXT |
diff --git a/arch/ppc/kernel/vmlinux.lds.S b/arch/ppc/kernel/vmlinux.lds.S index 16e8661e1fec..61921268a0d0 100644 --- a/arch/ppc/kernel/vmlinux.lds.S +++ b/arch/ppc/kernel/vmlinux.lds.S | |||
@@ -31,6 +31,7 @@ SECTIONS | |||
31 | .plt : { *(.plt) } | 31 | .plt : { *(.plt) } |
32 | .text : | 32 | .text : |
33 | { | 33 | { |
34 | _text = .; | ||
34 | *(.text) | 35 | *(.text) |
35 | SCHED_TEXT | 36 | SCHED_TEXT |
36 | LOCK_TEXT | 37 | LOCK_TEXT |
diff --git a/arch/sparc/kernel/vmlinux.lds.S b/arch/sparc/kernel/vmlinux.lds.S index 5cc5ff7f8824..b73e6b9067ed 100644 --- a/arch/sparc/kernel/vmlinux.lds.S +++ b/arch/sparc/kernel/vmlinux.lds.S | |||
@@ -11,6 +11,7 @@ SECTIONS | |||
11 | . = 0x10000 + SIZEOF_HEADERS; | 11 | . = 0x10000 + SIZEOF_HEADERS; |
12 | .text 0xf0004000 : | 12 | .text 0xf0004000 : |
13 | { | 13 | { |
14 | _text = .; | ||
14 | *(.text) | 15 | *(.text) |
15 | SCHED_TEXT | 16 | SCHED_TEXT |
16 | LOCK_TEXT | 17 | LOCK_TEXT |
diff --git a/arch/sparc64/kernel/vmlinux.lds.S b/arch/sparc64/kernel/vmlinux.lds.S index bd9de8c2a2aa..4a6063f33e7a 100644 --- a/arch/sparc64/kernel/vmlinux.lds.S +++ b/arch/sparc64/kernel/vmlinux.lds.S | |||
@@ -13,6 +13,7 @@ SECTIONS | |||
13 | . = 0x4000; | 13 | . = 0x4000; |
14 | .text 0x0000000000404000 : | 14 | .text 0x0000000000404000 : |
15 | { | 15 | { |
16 | _text = .; | ||
16 | *(.text) | 17 | *(.text) |
17 | SCHED_TEXT | 18 | SCHED_TEXT |
18 | LOCK_TEXT | 19 | LOCK_TEXT |
diff --git a/arch/v850/kernel/vmlinux.lds.S b/arch/v850/kernel/vmlinux.lds.S index 88d087f527c9..3a5fd07fe064 100644 --- a/arch/v850/kernel/vmlinux.lds.S +++ b/arch/v850/kernel/vmlinux.lds.S | |||
@@ -90,6 +90,7 @@ | |||
90 | 90 | ||
91 | /* Kernel text segment, and some constant data areas. */ | 91 | /* Kernel text segment, and some constant data areas. */ |
92 | #define TEXT_CONTENTS \ | 92 | #define TEXT_CONTENTS \ |
93 | _text = .; \ | ||
93 | __stext = . ; \ | 94 | __stext = . ; \ |
94 | *(.text) \ | 95 | *(.text) \ |
95 | SCHED_TEXT \ | 96 | SCHED_TEXT \ |
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 | ||