summaryrefslogtreecommitdiff
path: root/sbin/modload
diff options
context:
space:
mode:
authorjdolecek <jdolecek@NetBSD.org>2002-04-03 19:03:09 +0000
committerjdolecek <jdolecek@NetBSD.org>2002-04-03 19:03:09 +0000
commit83e7b8936b6e4eba0e02a3f55af6e3907de6ef4e (patch)
treeeb9fa7ae014bc26982840f87a31cb453c8e5b034 /sbin/modload
parent7739f7410a9b381b35b29bcbbabf5e3fa8848a26 (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.c23
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);