diff options
Diffstat (limited to 'arch/powerpc/kernel/module_64.c')
-rw-r--r-- | arch/powerpc/kernel/module_64.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/powerpc/kernel/module_64.c b/arch/powerpc/kernel/module_64.c index e4f7d4eed20c..08b7a40de5f8 100644 --- a/arch/powerpc/kernel/module_64.c +++ b/arch/powerpc/kernel/module_64.c | |||
@@ -326,7 +326,10 @@ static void dedotify_versions(struct modversion_info *vers, | |||
326 | } | 326 | } |
327 | } | 327 | } |
328 | 328 | ||
329 | /* Undefined symbols which refer to .funcname, hack to funcname (or .TOC.) */ | 329 | /* |
330 | * Undefined symbols which refer to .funcname, hack to funcname. Make .TOC. | ||
331 | * seem to be defined (value set later). | ||
332 | */ | ||
330 | static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab) | 333 | static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab) |
331 | { | 334 | { |
332 | unsigned int i; | 335 | unsigned int i; |
@@ -334,8 +337,11 @@ static void dedotify(Elf64_Sym *syms, unsigned int numsyms, char *strtab) | |||
334 | for (i = 1; i < numsyms; i++) { | 337 | for (i = 1; i < numsyms; i++) { |
335 | if (syms[i].st_shndx == SHN_UNDEF) { | 338 | if (syms[i].st_shndx == SHN_UNDEF) { |
336 | char *name = strtab + syms[i].st_name; | 339 | char *name = strtab + syms[i].st_name; |
337 | if (name[0] == '.') | 340 | if (name[0] == '.') { |
341 | if (strcmp(name+1, "TOC.") == 0) | ||
342 | syms[i].st_shndx = SHN_ABS; | ||
338 | syms[i].st_name++; | 343 | syms[i].st_name++; |
344 | } | ||
339 | } | 345 | } |
340 | } | 346 | } |
341 | } | 347 | } |
@@ -351,7 +357,7 @@ static Elf64_Sym *find_dot_toc(Elf64_Shdr *sechdrs, | |||
351 | numsyms = sechdrs[symindex].sh_size / sizeof(Elf64_Sym); | 357 | numsyms = sechdrs[symindex].sh_size / sizeof(Elf64_Sym); |
352 | 358 | ||
353 | for (i = 1; i < numsyms; i++) { | 359 | for (i = 1; i < numsyms; i++) { |
354 | if (syms[i].st_shndx == SHN_UNDEF | 360 | if (syms[i].st_shndx == SHN_ABS |
355 | && strcmp(strtab + syms[i].st_name, "TOC.") == 0) | 361 | && strcmp(strtab + syms[i].st_name, "TOC.") == 0) |
356 | return &syms[i]; | 362 | return &syms[i]; |
357 | } | 363 | } |