diff --git a/stand/common/load_elf.c b/stand/common/load_elf.c --- a/stand/common/load_elf.c +++ b/stand/common/load_elf.c @@ -838,7 +838,6 @@ if (module_verbose > MODULE_VERBOSE_SILENT) printf("\n"); - ret = lastaddr - firstaddr; fp->f_addr = firstaddr; php = NULL; @@ -901,25 +900,28 @@ break; } } - if (ef->hashtab == NULL || ef->symtab == NULL || - ef->strtab == NULL || ef->strsz == 0) - goto out; - COPYOUT(ef->hashtab, &ef->nbuckets, sizeof(ef->nbuckets)); - COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains)); - ef->buckets = ef->hashtab + 2; - ef->chains = ef->buckets + ef->nbuckets; - - if (__elfN(lookup_symbol)(ef, "__start_set_modmetadata_set", &sym, - STT_NOTYPE) != 0) - return 0; - p_start = sym.st_value + ef->off; - if (__elfN(lookup_symbol)(ef, "__stop_set_modmetadata_set", &sym, - STT_NOTYPE) != 0) - return 0; - p_end = sym.st_value + ef->off; + if (ef->hashtab != NULL && ef->symtab != NULL && + ef->strtab != NULL && ef->strsz != 0) { + COPYOUT(ef->hashtab, &ef->nbuckets, sizeof(ef->nbuckets)); + COPYOUT(ef->hashtab + 1, &ef->nchains, sizeof(ef->nchains)); + ef->buckets = ef->hashtab + 2; + ef->chains = ef->buckets + ef->nbuckets; + } - if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) == 0) - goto out; + /* Don't emit a warning if there is no symbol table. */ + if (ef->buckets != 0 && __elfN(lookup_symbol)(ef, + "__start_set_modmetadata_set", &sym, STT_NOTYPE) == 0) { + p_start = sym.st_value + ef->off; + if (__elfN(lookup_symbol)(ef, "__stop_set_modmetadata_set", + &sym, STT_NOTYPE) != 0) + goto out; + p_end = sym.st_value + ef->off; + + if (__elfN(parse_modmetadata)(fp, ef, p_start, p_end) != 0) + goto out; + } + + ret = lastaddr - firstaddr; out: if (dp)