diff options
author | peter <peter@FreeBSD.org> | 2000-08-02 21:08:53 +0000 |
---|---|---|
committer | peter <peter@FreeBSD.org> | 2000-08-02 21:08:53 +0000 |
commit | f3e89422d959b21ce9c3205b96cbe2ab21a27bcb (patch) | |
tree | 9494ef9460848e5c998aa5f0935b1cf6cb34fcf7 /sys/kern/kern_linker.c | |
parent | ee51d18b577061aef0eeaf9ca43cbe52c9dc0efb (diff) | |
download | FreeBSD-src-f3e89422d959b21ce9c3205b96cbe2ab21a27bcb.zip FreeBSD-src-f3e89422d959b21ce9c3205b96cbe2ab21a27bcb.tar.gz |
Fix self referential dependencies. eg: uhub was packaged along with
usb, all in usb.ko. uhub depends on usb. The bug was that the preload
processing only adds a module to the list once it's internal dependencies
are resolved... Since it was not "seeing" the internal usb module it
believed that uhub had a missing dependency.
Diffstat (limited to 'sys/kern/kern_linker.c')
-rw-r--r-- | sys/kern/kern_linker.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/sys/kern/kern_linker.c b/sys/kern/kern_linker.c index 29478b4..d99eed1 100644 --- a/sys/kern/kern_linker.c +++ b/sys/kern/kern_linker.c @@ -955,7 +955,7 @@ static void linker_preload(void* arg) { caddr_t modptr; - char *modname; + char *modname, *nmodname; char *modtype; linker_file_t lf; linker_class_t lc; @@ -964,8 +964,8 @@ linker_preload(void* arg) linker_file_list_t loaded_files; linker_file_list_t depended_files; struct linker_set *deps; - struct mod_metadata *mp; - int i; + struct mod_metadata *mp, *nmp; + int i, j; int resolves; modlist_t mod; @@ -1043,6 +1043,16 @@ restart: if (mp->md_type != MDT_DEPEND) continue; modname = linker_reloc_ptr(lf, mp->md_cval); + for (j = 0; j < deps->ls_length; j++) { + nmp = linker_reloc_ptr(lf, deps->ls_items[j]); + if (nmp->md_type != MDT_VERSION) + continue; + nmodname = linker_reloc_ptr(lf, nmp->md_cval); + if (strcmp(modname, nmodname) == 0) + break; + } + if (j < deps->ls_length) /* it's a self reference */ + continue; if (modlist_lookup(modname) == NULL) { /* ok, the module isn't here yet, we are not finished */ resolves = 0; |