summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_linker.c
diff options
context:
space:
mode:
authorpeter <peter@FreeBSD.org>2000-08-02 21:08:53 +0000
committerpeter <peter@FreeBSD.org>2000-08-02 21:08:53 +0000
commitf3e89422d959b21ce9c3205b96cbe2ab21a27bcb (patch)
tree9494ef9460848e5c998aa5f0935b1cf6cb34fcf7 /sys/kern/kern_linker.c
parentee51d18b577061aef0eeaf9ca43cbe52c9dc0efb (diff)
downloadFreeBSD-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.c16
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;
OpenPOWER on IntegriCloud