X-Git-Url: https://git.openpandora.org/cgi-bin/gitweb.cgi?p=pandora-kernel.git;a=blobdiff_plain;f=scripts%2Fmod%2Fmodpost.c;h=7e8079a34adf00dfda1839640c63fcda5e4a657f;hp=c4dc1d72d02efad6d21a943a66fd79f4154d8934;hb=eaaae38c1ac4ccbec6d2de7255b0538f38fb29d6;hpb=9209aed0726c77ad13b8d83e73a3cf9f59a8c2b2 diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c index c4dc1d72d02e..7e8079a34adf 100644 --- a/scripts/mod/modpost.c +++ b/scripts/mod/modpost.c @@ -191,7 +191,7 @@ static struct symbol *sym_add_exported(const char *name, struct module *mod) s = new_symbol(name, mod); } else { if (!s->preloaded) { - warn("%s: duplicate symbol '%s' previous definition " + warn("%s: '%s' exported twice. Previous export " "was in %s%s\n", mod->name, name, s->module->name, is_vmlinux(s->module->name) ?"":".ko"); @@ -346,8 +346,8 @@ static void parse_elf_finish(struct elf_info *info) release_file(info->hdr, info->size); } -#define CRC_PFX "__crc_" -#define KSYMTAB_PFX "__ksymtab_" +#define CRC_PFX MODULE_SYMBOL_PREFIX "__crc_" +#define KSYMTAB_PFX MODULE_SYMBOL_PREFIX "__ksymtab_" static void handle_modversions(struct module *mod, struct elf_info *info, Elf_Sym *sym, const char *symname) @@ -558,7 +558,10 @@ static Elf_Sym *find_elf_symbol(struct elf_info *elf, Elf_Addr addr, } /* - * Find symbols before or equal addr and after addr - in the section sec + * Find symbols before or equal addr and after addr - in the section sec. + * If we find two symbols with equal offset prefer one with a valid name. + * The ELF format may have a better way to detect what type of symbol + * it is, but this works for now. **/ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, const char *sec, @@ -587,6 +590,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, beforediff = addr - sym->st_value; *before = sym; } + else if ((addr - sym->st_value) == beforediff) { + /* equal offset, valid name? */ + const char *name = elf->strtab + sym->st_name; + if (name && strlen(name)) + *before = sym; + } } else { @@ -594,6 +603,12 @@ static void find_symbols_between(struct elf_info *elf, Elf_Addr addr, afterdiff = sym->st_value - addr; *after = sym; } + else if ((sym->st_value - addr) == afterdiff) { + /* equal offset, valid name? */ + const char *name = elf->strtab + sym->st_name; + if (name && strlen(name)) + *after = sym; + } } } } @@ -643,7 +658,7 @@ static void warn_sec_mismatch(const char *modname, const char *fromsec, warn("%s - Section mismatch: reference to %s:%s from %s " "before '%s' (at offset -0x%llx)\n", modname, secname, refsymname, fromsec, - elf->strtab + before->st_name, + elf->strtab + after->st_name, (long long)r.r_offset); } else { warn("%s - Section mismatch: reference to %s:%s from %s " @@ -776,7 +791,7 @@ static int init_section_ref_ok(const char *name) if (strncmp(*s, name, strlen(*s)) == 0) return 1; for (s = namelist3; *s; s++) - if (strstr(*s, name) != NULL) + if (strstr(name, *s) != NULL) return 1; return 0; } @@ -842,7 +857,7 @@ static int exit_section_ref_ok(const char *name) if (strncmp(*s, name, strlen(*s)) == 0) return 1; for (s = namelist3; *s; s++) - if (strstr(*s, name) != NULL) + if (strstr(name, *s) != NULL) return 1; return 0; } @@ -908,19 +923,14 @@ void __attribute__((format(printf, 2, 3))) buf_printf(struct buffer *buf, va_start(ap, fmt); len = vsnprintf(tmp, SZ, fmt, ap); - if (buf->size - buf->pos < len + 1) { - buf->size += 128; - buf->p = realloc(buf->p, buf->size); - } - strncpy(buf->p + buf->pos, tmp, len + 1); - buf->pos += len; + buf_write(buf, tmp, len); va_end(ap); } void buf_write(struct buffer *buf, const char *s, int len) { if (buf->size - buf->pos < len) { - buf->size += len; + buf->size += len + SZ; buf->p = realloc(buf->p, buf->size); } strncpy(buf->p + buf->pos, s, len);