diff options
Diffstat (limited to 'scripts/mod/modpost.c')
-rw-r--r-- | scripts/mod/modpost.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index 508c5895c68..a07f91aac92 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c | |||
@@ -467,6 +467,25 @@ static void parse_elf_finish(struct elf_info *info) | |||
467 | release_file(info->hdr, info->size); | 467 | release_file(info->hdr, info->size); |
468 | } | 468 | } |
469 | 469 | ||
470 | static int ignore_undef_symbol(struct elf_info *info, const char *symname) | ||
471 | { | ||
472 | /* ignore __this_module, it will be resolved shortly */ | ||
473 | if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0) | ||
474 | return 1; | ||
475 | /* ignore global offset table */ | ||
476 | if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) | ||
477 | return 1; | ||
478 | if (info->hdr->e_machine == EM_PPC) | ||
479 | /* Special register function linked on all modules during final link of .ko */ | ||
480 | if (strncmp(symname, "_restgpr_", sizeof("_restgpr_") - 1) == 0 || | ||
481 | strncmp(symname, "_savegpr_", sizeof("_savegpr_") - 1) == 0 || | ||
482 | strncmp(symname, "_rest32gpr_", sizeof("_rest32gpr_") - 1) == 0 || | ||
483 | strncmp(symname, "_save32gpr_", sizeof("_save32gpr_") - 1) == 0) | ||
484 | return 1; | ||
485 | /* Do not ignore this symbol */ | ||
486 | return 0; | ||
487 | } | ||
488 | |||
470 | #define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" | 489 | #define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" |
471 | #define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" | 490 | #define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" |
472 | 491 | ||
@@ -493,11 +512,7 @@ static void handle_modversions(struct module *mod, struct elf_info *info, | |||
493 | if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL && | 512 | if (ELF_ST_BIND(sym->st_info) != STB_GLOBAL && |
494 | ELF_ST_BIND(sym->st_info) != STB_WEAK) | 513 | ELF_ST_BIND(sym->st_info) != STB_WEAK) |
495 | break; | 514 | break; |
496 | /* ignore global offset table */ | 515 | if (ignore_undef_symbol(info, symname)) |
497 | if (strcmp(symname, "_GLOBAL_OFFSET_TABLE_") == 0) | ||
498 | break; | ||
499 | /* ignore __this_module, it will be resolved shortly */ | ||
500 | if (strcmp(symname, MODULE_SYMBOL_PREFIX "__this_module") == 0) | ||
501 | break; | 516 | break; |
502 | /* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */ | 517 | /* cope with newer glibc (2.3.4 or higher) STT_ definition in elf.h */ |
503 | #if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER) | 518 | #if defined(STT_REGISTER) || defined(STT_SPARC_REGISTER) |