diff options
| author | jdolecek <jdolecek@NetBSD.org> | 2002-04-03 19:03:09 +0000 |
|---|---|---|
| committer | jdolecek <jdolecek@NetBSD.org> | 2002-04-03 19:03:09 +0000 |
| commit | 83e7b8936b6e4eba0e02a3f55af6e3907de6ef4e (patch) | |
| tree | eb9fa7ae014bc26982840f87a31cb453c8e5b034 /sbin/modload | |
| parent | 7739f7410a9b381b35b29bcbbabf5e3fa8848a26 (diff) | |
Only provide sym_size and sym_symsize if symbols are actually going
to be loaded.
This also avoids the annoying 'Unable to find symbol table slot
for xxx' kernel message when module is unloaded.
Diffstat (limited to 'sbin/modload')
| -rw-r--r-- | sbin/modload/elf.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/sbin/modload/elf.c b/sbin/modload/elf.c index 9723aac00e5..367f23e1213 100644 --- a/sbin/modload/elf.c +++ b/sbin/modload/elf.c @@ -1,4 +1,4 @@ -/* $NetBSD: elf.c,v 1.8 2002/01/03 21:45:58 jdolecek Exp $ */ +/* $NetBSD: elf.c,v 1.9 2002/04/03 19:03:09 jdolecek Exp $ */ /* * Copyright (c) 1998 Johan Danielsson <joda@pdc.kth.se> @@ -29,7 +29,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: elf.c,v 1.8 2002/01/03 21:45:58 jdolecek Exp $"); +__RCSID("$NetBSD: elf.c,v 1.9 2002/04/03 19:03:09 jdolecek Exp $"); #include <sys/param.h> @@ -253,7 +253,8 @@ elf_mod_sizes(fd, modsize, strtablen, resrvp, sp) ssize_t off = 0; size_t data_hole = 0; char *shstrtab, *strtab; - struct elf_section *head, *s, *symtab; + struct elf_section *head, *s; + extern int symtab; if (read_elf_header(fd, &ehdr) < 0) return -1; @@ -295,14 +296,16 @@ elf_mod_sizes(fd, modsize, strtablen, resrvp, sp) free(strtab); /* get symbol table sections */ - get_symtab(&head); - symtab = head; resrvp->sym_symsize = 0; - while (symtab) { - resrvp->sym_symsize += symtab->size; - symtab = symtab->next; - } - resrvp->sym_size = resrvp->sym_symsize + *strtablen; + if (symtab) { + struct elf_section *st; + + get_symtab(&head); + for(st = head; st; st = st->next) + resrvp->sym_symsize += st->size; + resrvp->sym_size = resrvp->sym_symsize + *strtablen; + } else + resrvp->sym_size = 0; free_sections(head); return (0); |
