On Wed, Mar 08, 2006 at 05:54:02PM -0500, David Dawes wrote: >On Wed, Mar 08, 2006 at 08:23:17AM -0800, Tom Williams wrote: >>Hi! I just installed the XFree86 4.5.99.901 snapshot (which fixed my >>xterm installation problem, thanks guys! :)) and it runs fine. I >>wanted to try the "-autoconfig" option to see what it would do and it >>generated these messages: > >Autoconfigure works by loading a bunch of drivers, using the one >that proves to be the best choice, and unloading the others. > >The problem is that fbdev registers that it needs fbdevhw. When >it is unloaded it doesn't notify the loader that fbdevhw is no >longer needed. Since the nv driver refers to fbdevhw (even though >it isn't using it), these references are being reported as fatal >unresolved symbols. > >The new loader now invalidates symbol references to modules that >have been unloaded. To fix this problem, the fbdev module (and all >modules, really) needs to be modified to register its fbdevhw >requirements as being specific to itself so that those requirements >get removed when it is unloaded. > >I'll take a look at doing this, and post a patch. > >Tom, thanks for reporting the problem! The attached patch should fix this problem. David
Index: fbdev.c =================================================================== RCS file: /home/dhd-cvs/xc/programs/Xserver/hw/xfree86/drivers/fbdev/fbdev.c,v retrieving revision 1.1.1.6.2.3 diff -u -r1.1.1.6.2.3 fbdev.c --- fbdev.c 8 Aug 2005 23:38:36 -0000 1.1.1.6.2.3 +++ fbdev.c 9 Mar 2006 01:40:39 -0000 @@ -176,6 +176,8 @@ NULL }; +static void *fbdevModule = NULL; + #ifdef XFree86LOADER MODULESETUPPROTO(FBDevSetup); @@ -204,8 +206,9 @@ if (!setupDone) { setupDone = TRUE; xf86AddDriver(&FBDEV, module, 0); - LoaderRefSymLists(afbSymbols, fbSymbols, - shadowSymbols, fbdevHWSymbols, NULL); + LoaderModRefSymLists(module, afbSymbols, fbSymbols, + shadowSymbols, fbdevHWSymbols, NULL); + fbdevModule = module; return (pointer)1; } else { if (errmaj) *errmaj = LDR_ONCEONLY; @@ -293,7 +296,7 @@ if (!xf86LoadDrvSubModule(drv, "fbdevhw")) return FALSE; - xf86LoaderReqSymLists(fbdevHWSymbols, NULL); + xf86LoaderModReqSymLists(fbdevModule, fbdevHWSymbols, NULL); for (i = 0; i < numDevSections; i++) { Bool isIsa = FALSE; @@ -577,7 +580,7 @@ return FALSE; } if (mod && syms) { - xf86LoaderReqSymLists(syms, NULL); + xf86LoaderModReqSymLists(fbdevModule, syms, NULL); } /* Load shadow if needed */ @@ -587,7 +590,7 @@ FBDevFreeRec(pScrn); return FALSE; } - xf86LoaderReqSymLists(shadowSymbols, NULL); + xf86LoaderModReqSymLists(fbdevModule, shadowSymbols, NULL); } TRACE_EXIT("PreInit");