diff -urN RC13-git12-net-noise/arch/sparc/kernel/module.c RC13-git12-sparc32-aliases/arch/sparc/kernel/module.c --- RC13-git12-net-noise/arch/sparc/kernel/module.c 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/kernel/module.c 2005-09-12 14:50:34.000000000 -0400 @@ -10,6 +10,7 @@ #include #include #include +#include void *module_alloc(unsigned long size) { @@ -37,7 +38,7 @@ } /* Make generic code ignore STT_REGISTER dummy undefined symbols, - * and replace references to .func with func as in ppc64's dedotify. + * and replace references to .func with _Func */ int module_frob_arch_sections(Elf_Ehdr *hdr, Elf_Shdr *sechdrs, @@ -64,8 +65,10 @@ sym[i].st_shndx = SHN_ABS; else { char *name = strtab + sym[i].st_name; - if (name[0] == '.') - memmove(name, name+1, strlen(name)); + if (name[0] == '.') { + name[0] = '_'; + name[1] = toupper(name[1]); + } } } } diff -urN RC13-git12-net-noise/arch/sparc/kernel/sparc_ksyms.c RC13-git12-sparc32-aliases/arch/sparc/kernel/sparc_ksyms.c --- RC13-git12-net-noise/arch/sparc/kernel/sparc_ksyms.c 2005-09-12 14:20:17.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/kernel/sparc_ksyms.c 2005-09-12 14:50:34.000000000 -0400 @@ -97,19 +97,12 @@ /* Alias functions whose names begin with "." and export the aliases. * The module references will be fixed up by module_frob_arch_sections. */ -#define DOT_ALIAS2(__ret, __x, __arg1, __arg2) \ - extern __ret __x(__arg1, __arg2); \ - asm(".weak " #__x);\ - asm(#__x "=." #__x); - -DOT_ALIAS2(int, div, int, int) -DOT_ALIAS2(int, mul, int, int) -DOT_ALIAS2(int, rem, int, int) -DOT_ALIAS2(unsigned, udiv, unsigned, unsigned) -DOT_ALIAS2(unsigned, umul, unsigned, unsigned) -DOT_ALIAS2(unsigned, urem, unsigned, unsigned) - -#undef DOT_ALIAS2 +extern int _Div(int, int); +extern int _Mul(int, int); +extern int _Rem(int, int); +extern unsigned _Udiv(unsigned, unsigned); +extern unsigned _Umul(unsigned, unsigned); +extern unsigned _Urem(unsigned, unsigned); /* used by various drivers */ EXPORT_SYMBOL(sparc_cpu_model); @@ -320,12 +313,12 @@ EXPORT_SYMBOL(__muldi3); EXPORT_SYMBOL(__divdi3); -EXPORT_SYMBOL(rem); -EXPORT_SYMBOL(urem); -EXPORT_SYMBOL(mul); -EXPORT_SYMBOL(umul); -EXPORT_SYMBOL(div); -EXPORT_SYMBOL(udiv); +EXPORT_SYMBOL(_Rem); +EXPORT_SYMBOL(_Urem); +EXPORT_SYMBOL(_Mul); +EXPORT_SYMBOL(_Umul); +EXPORT_SYMBOL(_Div); +EXPORT_SYMBOL(_Udiv); #ifdef CONFIG_DEBUG_BUGVERBOSE EXPORT_SYMBOL(do_BUG); diff -urN RC13-git12-net-noise/arch/sparc/lib/mul.S RC13-git12-sparc32-aliases/arch/sparc/lib/mul.S --- RC13-git12-net-noise/arch/sparc/lib/mul.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/mul.S 2005-09-12 14:50:34.000000000 -0400 @@ -16,7 +16,9 @@ */ .globl .mul + .globl _Mul .mul: +_Mul: /* needed for export */ mov %o0, %y ! multiplier -> Y andncc %o0, 0xfff, %g0 ! test bits 12..31 be Lmul_shortway ! if zero, can do it the short way diff -urN RC13-git12-net-noise/arch/sparc/lib/rem.S RC13-git12-sparc32-aliases/arch/sparc/lib/rem.S --- RC13-git12-net-noise/arch/sparc/lib/rem.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/rem.S 2005-09-12 14:50:34.000000000 -0400 @@ -43,7 +43,9 @@ .globl .rem + .globl _Rem .rem: +_Rem: /* needed for export */ ! compute sign of result; if neither is negative, no problem orcc %o1, %o0, %g0 ! either negative? bge 2f ! no, go do the divide diff -urN RC13-git12-net-noise/arch/sparc/lib/sdiv.S RC13-git12-sparc32-aliases/arch/sparc/lib/sdiv.S --- RC13-git12-net-noise/arch/sparc/lib/sdiv.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/sdiv.S 2005-09-12 14:50:34.000000000 -0400 @@ -43,7 +43,9 @@ .globl .div + .globl _Div .div: +_Div: /* needed for export */ ! compute sign of result; if neither is negative, no problem orcc %o1, %o0, %g0 ! either negative? bge 2f ! no, go do the divide diff -urN RC13-git12-net-noise/arch/sparc/lib/udiv.S RC13-git12-sparc32-aliases/arch/sparc/lib/udiv.S --- RC13-git12-net-noise/arch/sparc/lib/udiv.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/udiv.S 2005-09-12 14:50:34.000000000 -0400 @@ -43,7 +43,9 @@ .globl .udiv + .globl _Udiv .udiv: +_Udiv: /* needed for export */ ! Ready to divide. Compute size of quotient; scale comparand. orcc %o1, %g0, %o5 diff -urN RC13-git12-net-noise/arch/sparc/lib/umul.S RC13-git12-sparc32-aliases/arch/sparc/lib/umul.S --- RC13-git12-net-noise/arch/sparc/lib/umul.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/umul.S 2005-09-12 14:50:34.000000000 -0400 @@ -21,7 +21,9 @@ */ .globl .umul + .globl _Umul .umul: +_Umul: /* needed for export */ or %o0, %o1, %o4 mov %o0, %y ! multiplier -> Y diff -urN RC13-git12-net-noise/arch/sparc/lib/urem.S RC13-git12-sparc32-aliases/arch/sparc/lib/urem.S --- RC13-git12-net-noise/arch/sparc/lib/urem.S 2005-06-17 15:48:29.000000000 -0400 +++ RC13-git12-sparc32-aliases/arch/sparc/lib/urem.S 2005-09-12 14:50:34.000000000 -0400 @@ -41,7 +41,9 @@ */ .globl .urem + .globl _Urem .urem: +_Urem: /* needed for export */ ! Ready to divide. Compute size of quotient; scale comparand. orcc %o1, %g0, %o5 diff -urN RC13-git12-net-noise/scripts/mod/modpost.c RC13-git12-sparc32-aliases/scripts/mod/modpost.c --- RC13-git12-net-noise/scripts/mod/modpost.c 2005-08-28 23:09:49.000000000 -0400 +++ RC13-git12-sparc32-aliases/scripts/mod/modpost.c 2005-09-12 14:50:34.000000000 -0400 @@ -370,6 +370,12 @@ /* Ignore register directives. */ if (ELF_ST_TYPE(sym->st_info) == STT_SPARC_REGISTER) break; + if (symname[0] == '.') { + char *munged = strdup(symname); + munged[0] = '_'; + munged[1] = toupper(munged[1]); + symname = munged; + } } #endif