diff options
author | Al Viro <viro@ZenIV.linux.org.uk> | 2005-09-11 23:14:07 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2005-09-11 23:14:07 -0400 |
commit | 7caaeabb17758295edff9703c18a840073c5b8f4 (patch) | |
tree | a33a4bcc77be6077fd8b787380bf13a38828d211 | |
parent | 357d596bd552ad157a906289ab13ea6ba7e66e3d (diff) |
[SPARC]: Fix dot-symbol exporting for good.
From: Al Viro <viro@ZenIV.linux.org.uk>
Instead of playing all of these hand-coded assembler aliasing games,
just translate symbol names in the name space ".sym" to "_Sym" at
module load time.
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | arch/sparc/kernel/module.c | 9 | ||||
-rw-r--r-- | arch/sparc/kernel/sparc_ksyms.c | 31 | ||||
-rw-r--r-- | arch/sparc/lib/mul.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/rem.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/sdiv.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/udiv.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/umul.S | 2 | ||||
-rw-r--r-- | arch/sparc/lib/urem.S | 2 | ||||
-rw-r--r-- | scripts/mod/modpost.c | 6 |
9 files changed, 36 insertions, 22 deletions
diff --git a/arch/sparc/kernel/module.c b/arch/sparc/kernel/module.c index 7931d6f92819..787d5f1347ec 100644 --- a/arch/sparc/kernel/module.c +++ b/arch/sparc/kernel/module.c | |||
@@ -10,6 +10,7 @@ | |||
10 | #include <linux/vmalloc.h> | 10 | #include <linux/vmalloc.h> |
11 | #include <linux/fs.h> | 11 | #include <linux/fs.h> |
12 | #include <linux/string.h> | 12 | #include <linux/string.h> |
13 | #include <linux/ctype.h> | ||
13 | 14 | ||
14 | void *module_alloc(unsigned long size) | 15 | void *module_alloc(unsigned long size) |
15 | { | 16 | { |
@@ -37,7 +38,7 @@ void module_free(struct module *mod, void *module_region) | |||
37 | } | 38 | } |
38 | 39 | ||
39 | /* Make generic code ignore STT_REGISTER dummy undefined symbols, | 40 | /* Make generic code ignore STT_REGISTER dummy undefined symbols, |
40 | * and replace references to .func with func as in ppc64's dedotify. | 41 | * and replace references to .func with _Func |
41 | */ | 42 | */ |
42 | int module_frob_arch_sections(Elf_Ehdr *hdr, | 43 | int module_frob_arch_sections(Elf_Ehdr *hdr, |
43 | Elf_Shdr *sechdrs, | 44 | Elf_Shdr *sechdrs, |
@@ -64,8 +65,10 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, | |||
64 | sym[i].st_shndx = SHN_ABS; | 65 | sym[i].st_shndx = SHN_ABS; |
65 | else { | 66 | else { |
66 | char *name = strtab + sym[i].st_name; | 67 | char *name = strtab + sym[i].st_name; |
67 | if (name[0] == '.') | 68 | if (name[0] == '.') { |
68 | memmove(name, name+1, strlen(name)); | 69 | name[0] = '_'; |
70 | name[1] = toupper(name[1]); | ||
71 | } | ||
69 | } | 72 | } |
70 | } | 73 | } |
71 | } | 74 | } |
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c index f84809333624..1c8fd0fd9305 100644 --- a/arch/sparc/kernel/sparc_ksyms.c +++ b/arch/sparc/kernel/sparc_ksyms.c | |||
@@ -97,19 +97,12 @@ extern void ___rw_write_enter(void); | |||
97 | /* Alias functions whose names begin with "." and export the aliases. | 97 | /* Alias functions whose names begin with "." and export the aliases. |
98 | * The module references will be fixed up by module_frob_arch_sections. | 98 | * The module references will be fixed up by module_frob_arch_sections. |
99 | */ | 99 | */ |
100 | #define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \ | 100 | extern int _Div(int, int); |
101 | extern __ret __x(__arg1, __arg2); \ | 101 | extern int _Mul(int, int); |
102 | asm(".weak " #__x);\ | 102 | extern int _Rem(int, int); |
103 | asm(#__x "=." #__x); | 103 | extern unsigned _Udiv(unsigned, unsigned); |
104 | 104 | extern unsigned _Umul(unsigned, unsigned); | |
105 | DOT_ALIAS2(int, div, int, int) | 105 | extern unsigned _Urem(unsigned, unsigned); |
106 | DOT_ALIAS2(int, mul, int, int) | ||
107 | DOT_ALIAS2(int, rem, int, int) | ||
108 | DOT_ALIAS2(unsigned, udiv, unsigned, unsigned) | ||
109 | DOT_ALIAS2(unsigned, umul, unsigned, unsigned) | ||
110 | DOT_ALIAS2(unsigned, urem, unsigned, unsigned) | ||
111 | |||
112 | #undef DOT_ALIAS2 | ||
113 | 106 | ||
114 | /* used by various drivers */ | 107 | /* used by various drivers */ |
115 | EXPORT_SYMBOL(sparc_cpu_model); | 108 | EXPORT_SYMBOL(sparc_cpu_model); |
@@ -320,12 +313,12 @@ EXPORT_SYMBOL(__lshrdi3); | |||
320 | EXPORT_SYMBOL(__muldi3); | 313 | EXPORT_SYMBOL(__muldi3); |
321 | EXPORT_SYMBOL(__divdi3); | 314 | EXPORT_SYMBOL(__divdi3); |
322 | 315 | ||
323 | EXPORT_SYMBOL(rem); | 316 | EXPORT_SYMBOL(_Rem); |
324 | EXPORT_SYMBOL(urem); | 317 | EXPORT_SYMBOL(_Urem); |
325 | EXPORT_SYMBOL(mul); | 318 | EXPORT_SYMBOL(_Mul); |
326 | EXPORT_SYMBOL(umul); | 319 | EXPORT_SYMBOL(_Umul); |
327 | EXPORT_SYMBOL(div); | 320 | EXPORT_SYMBOL(_Div); |
328 | EXPORT_SYMBOL(udiv); | 321 | EXPORT_SYMBOL(_Udiv); |
329 | 322 | ||
330 | #ifdef CONFIG_DEBUG_BUGVERBOSE | 323 | #ifdef CONFIG_DEBUG_BUGVERBOSE |
331 | EXPORT_SYMBOL(do_BUG); | 324 | EXPORT_SYMBOL(do_BUG); |
diff --git a/arch/sparc/lib/mul.S b/arch/sparc/lib/mul.S index 83dffbc2f62f..da693560d878 100644 --- a/arch/sparc/lib/mul.S +++ b/arch/sparc/lib/mul.S | |||
@@ -16,7 +16,9 @@ | |||
16 | */ | 16 | */ |
17 | 17 | ||
18 | .globl .mul | 18 | .globl .mul |
19 | .globl _Mul | ||
19 | .mul: | 20 | .mul: |
21 | _Mul: /* needed for export */ | ||
20 | mov %o0, %y ! multiplier -> Y | 22 | mov %o0, %y ! multiplier -> Y |
21 | andncc %o0, 0xfff, %g0 ! test bits 12..31 | 23 | andncc %o0, 0xfff, %g0 ! test bits 12..31 |
22 | be Lmul_shortway ! if zero, can do it the short way | 24 | be Lmul_shortway ! if zero, can do it the short way |
diff --git a/arch/sparc/lib/rem.S b/arch/sparc/lib/rem.S index 44508148d055..bf015a90d07e 100644 --- a/arch/sparc/lib/rem.S +++ b/arch/sparc/lib/rem.S | |||
@@ -43,7 +43,9 @@ | |||
43 | 43 | ||
44 | 44 | ||
45 | .globl .rem | 45 | .globl .rem |
46 | .globl _Rem | ||
46 | .rem: | 47 | .rem: |
48 | _Rem: /* needed for export */ | ||
47 | ! compute sign of result; if neither is negative, no problem | 49 | ! compute sign of result; if neither is negative, no problem |
48 | orcc %o1, %o0, %g0 ! either negative? | 50 | orcc %o1, %o0, %g0 ! either negative? |
49 | bge 2f ! no, go do the divide | 51 | bge 2f ! no, go do the divide |
diff --git a/arch/sparc/lib/sdiv.S b/arch/sparc/lib/sdiv.S index e0ad80b6f63d..af9451629d0b 100644 --- a/arch/sparc/lib/sdiv.S +++ b/arch/sparc/lib/sdiv.S | |||
@@ -43,7 +43,9 @@ | |||
43 | 43 | ||
44 | 44 | ||
45 | .globl .div | 45 | .globl .div |
46 | .globl _Div | ||
46 | .div: | 47 | .div: |
48 | _Div: /* needed for export */ | ||
47 | ! compute sign of result; if neither is negative, no problem | 49 | ! compute sign of result; if neither is negative, no problem |
48 | orcc %o1, %o0, %g0 ! either negative? | 50 | orcc %o1, %o0, %g0 ! either negative? |
49 | bge 2f ! no, go do the divide | 51 | bge 2f ! no, go do the divide |
diff --git a/arch/sparc/lib/udiv.S b/arch/sparc/lib/udiv.S index 2abfc6b0f3e9..169e01da6715 100644 --- a/arch/sparc/lib/udiv.S +++ b/arch/sparc/lib/udiv.S | |||
@@ -43,7 +43,9 @@ | |||
43 | 43 | ||
44 | 44 | ||
45 | .globl .udiv | 45 | .globl .udiv |
46 | .globl _Udiv | ||
46 | .udiv: | 47 | .udiv: |
48 | _Udiv: /* needed for export */ | ||
47 | 49 | ||
48 | ! Ready to divide. Compute size of quotient; scale comparand. | 50 | ! Ready to divide. Compute size of quotient; scale comparand. |
49 | orcc %o1, %g0, %o5 | 51 | orcc %o1, %g0, %o5 |
diff --git a/arch/sparc/lib/umul.S b/arch/sparc/lib/umul.S index a784720a8a22..f0e5b20a2536 100644 --- a/arch/sparc/lib/umul.S +++ b/arch/sparc/lib/umul.S | |||
@@ -21,7 +21,9 @@ | |||
21 | */ | 21 | */ |
22 | 22 | ||
23 | .globl .umul | 23 | .globl .umul |
24 | .globl _Umul | ||
24 | .umul: | 25 | .umul: |
26 | _Umul: /* needed for export */ | ||
25 | or %o0, %o1, %o4 | 27 | or %o0, %o1, %o4 |
26 | mov %o0, %y ! multiplier -> Y | 28 | mov %o0, %y ! multiplier -> Y |
27 | 29 | ||
diff --git a/arch/sparc/lib/urem.S b/arch/sparc/lib/urem.S index ec7f0c502c56..6b92bdc8b04c 100644 --- a/arch/sparc/lib/urem.S +++ b/arch/sparc/lib/urem.S | |||
@@ -41,7 +41,9 @@ | |||
41 | */ | 41 | */ |
42 | 42 | ||
43 | .globl .urem | 43 | .globl .urem |
44 | .globl _Urem | ||
44 | .urem: | 45 | .urem: |
46 | _Urem: /* needed for export */ | ||
45 | 47 | ||
46 | ! Ready to divide. Compute size of quotient; scale comparand. | 48 | ! Ready to divide. Compute size of quotient; scale comparand. |
47 | orcc %o1, %g0, %o5 | 49 | orcc %o1, %g0, %o5 |
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 09ffca54b373..3bed09e625c0 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -370,6 +370,12 @@ handle_modversions(struct module *mod, struct elf_info *info, | |||
370 | /* Ignore register directives. */ | 370 | /* Ignore register directives. */ |
371 | if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) | 371 | if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) |
372 | break; | 372 | break; |
373 | if (symname[0] == '.') { | ||
374 | char *munged = strdup(symname); | ||
375 | munged[0] = '_'; | ||
376 | munged[1] = toupper(munged[1]); | ||
377 | symname = munged; | ||
378 | } | ||
373 | } | 379 | } |
374 | #endif | 380 | #endif |
375 | 381 | ||