aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric W. Biederman <ebiederm@xmission.com>2006-12-06 20:14:04 -0500
committerAndi Kleen <andi@basil.nowhere.org>2006-12-06 20:14:04 -0500
commitfd593d12770d4a0d1ff095d44b96436c18479ee8 (patch)
treea930c07b09cef72a01f18acdfa1cb62819135f6c
parent2a43f3ede48ea3d5790b863b719a1e21c90a3697 (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.S1
-rw-r--r--arch/m68knommu/kernel/vmlinux.lds.S1
-rw-r--r--arch/powerpc/kernel/vmlinux.lds.S1
-rw-r--r--arch/ppc/kernel/vmlinux.lds.S1
-rw-r--r--arch/sparc/kernel/vmlinux.lds.S1
-rw-r--r--arch/sparc64/kernel/vmlinux.lds.S1
-rw-r--r--arch/v850/kernel/vmlinux.lds.S1
-rw-r--r--scripts/kallsyms.c20
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
44static struct sym_entry *table; 44static struct sym_entry *table;
45static unsigned int table_size, table_cnt; 45static unsigned int table_size, table_cnt;
46static unsigned long long _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext; 46static unsigned long long _text, _stext, _etext, _sinittext, _einittext, _sextratext, _eextratext;
47static int all_symbols = 0; 47static int all_symbols = 0;
48static char symbol_prefix_char = '\0'; 48static 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