|
@@ -623,7 +623,10 @@ static void handle_modversions(struct module *mod, struct elf_info *info,
|
|
|
|
|
|
switch (sym->st_shndx) {
|
|
|
case SHN_COMMON:
|
|
|
- warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
|
|
|
+ if (!strncmp(symname, "__gnu_lto_", sizeof("__gnu_lto_")-1)) {
|
|
|
+ /* Should warn here, but modpost runs before the linker */
|
|
|
+ } else
|
|
|
+ warn("\"%s\" [%s] is COMMON symbol\n", symname, mod->name);
|
|
|
break;
|
|
|
case SHN_UNDEF:
|
|
|
/* undefined symbol */
|
|
@@ -849,6 +852,7 @@ static const char *section_white_list[] =
|
|
|
".xt.lit", /* xtensa */
|
|
|
".arcextmap*", /* arc */
|
|
|
".gnu.linkonce.arcext*", /* arc : modules */
|
|
|
+ ".gnu.lto*",
|
|
|
NULL
|
|
|
};
|
|
|
|
|
@@ -1455,6 +1459,10 @@ static void check_section_mismatch(const char *modname, struct elf_info *elf,
|
|
|
to = find_elf_symbol(elf, r->r_addend, sym);
|
|
|
tosym = sym_name(elf, to);
|
|
|
|
|
|
+ if (!strncmp(fromsym, "reference___initcall",
|
|
|
+ sizeof("reference___initcall")-1))
|
|
|
+ return;
|
|
|
+
|
|
|
/* check whitelist - we may ignore it */
|
|
|
if (secref_whitelist(mismatch,
|
|
|
fromsec, fromsym, tosec, tosym)) {
|
|
@@ -1693,6 +1701,19 @@ static void check_sec_ref(struct module *mod, const char *modname,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static char *remove_dot(char *s)
|
|
|
+{
|
|
|
+ char *end;
|
|
|
+ int n = strcspn(s, ".");
|
|
|
+
|
|
|
+ if (n > 0 && s[n] != 0) {
|
|
|
+ strtoul(s + n + 1, &end, 10);
|
|
|
+ if (end > s + n + 1 && (*end == '.' || *end == 0))
|
|
|
+ s[n] = 0;
|
|
|
+ }
|
|
|
+ return s;
|
|
|
+}
|
|
|
+
|
|
|
static void read_symbols(char *modname)
|
|
|
{
|
|
|
const char *symname;
|
|
@@ -1731,7 +1752,7 @@ static void read_symbols(char *modname)
|
|
|
}
|
|
|
|
|
|
for (sym = info.symtab_start; sym < info.symtab_stop; sym++) {
|
|
|
- symname = info.strtab + sym->st_name;
|
|
|
+ symname = remove_dot(info.strtab + sym->st_name);
|
|
|
|
|
|
handle_modversions(mod, &info, sym, symname);
|
|
|
handle_moddevtable(mod, &info, sym, symname);
|