Commit 04e9b59f authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] H8/300 module fix

From: Yoshinori Sato <ysato@users.sourceforge.jp>

- fix relocation
- define SYMBOL_PREFIX
parent 45577464
......@@ -40,6 +40,8 @@ EXPORT_SYMBOL(strncmp);
EXPORT_SYMBOL(ip_fast_csum);
EXPORT_SYMBOL(kernel_thread);
EXPORT_SYMBOL(enable_irq);
EXPORT_SYMBOL(disable_irq);
/* Networking helper routines. */
EXPORT_SYMBOL(csum_partial_copy);
......
......@@ -67,7 +67,6 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
Elf32_Sym *sym = (Elf32_Sym *)sechdrs[symindex].sh_addr
+ ELF32_R_SYM(rela[i].r_info);
uint32_t v = sym->st_value + rela[i].r_addend;
uint32_t dot = sechdrs[symindex].sh_addr + rela[i].r_offset;
switch (ELF32_R_TYPE(rela[i].r_info)) {
case R_H8_DIR24R8:
......@@ -75,6 +74,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
*loc = (*loc & 0xff000000) | ((*loc & 0xffffff) + v);
break;
case R_H8_DIR24A8:
if (ELF32_R_SYM(rela[i].r_info))
*loc += v;
break;
case R_H8_DIR32:
......@@ -82,7 +82,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
*loc += v;
break;
case R_H8_PCREL16:
v -= dot + 2;
v -= (unsigned long)loc + 2;
if ((Elf32_Sword)v > 0x7fff ||
(Elf32_Sword)v < -(Elf32_Sword)0x8000)
goto overflow;
......@@ -90,7 +90,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
*(unsigned short *)loc = v;
break;
case R_H8_PCREL8:
v -= dot + 1;
v -= (unsigned long)loc + 1;
if ((Elf32_Sword)v > 0x7f ||
(Elf32_Sword)v < -(Elf32_Sword)0x80)
goto overflow;
......@@ -105,7 +105,7 @@ int apply_relocate_add(Elf32_Shdr *sechdrs,
}
return 0;
overflow:
printk(KERN_ERR "module %s: relocation offset overflow: %p\n",
printk(KERN_ERR "module %s: relocation offset overflow: %08x\n",
me->name, rela[i].r_offset);
return -ENOEXEC;
}
......
......@@ -8,4 +8,6 @@ struct mod_arch_specific { };
#define Elf_Sym Elf32_Sym
#define Elf_Ehdr Elf32_Ehdr
#define MODULE_SYMBOL_PREFIX "_"
#endif /* _ASM_H8/300_MODULE_H */
......@@ -55,7 +55,7 @@ main(int argc, char **argv)
else
abort();
if (strcmp(argv[1], "v850") == 0)
if ((strcmp(argv[1], "v850") == 0) || (strcmp(argv[1], "h8300") == 0))
printf("#define MODULE_SYMBOL_PREFIX \"_\"\n");
else
printf("#define MODULE_SYMBOL_PREFIX \"\"\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment