[PATCH v2] Look for ModuleData only in appropriate library
Peter Hutterer
peter.hutterer at who-t.net
Wed Jul 4 15:25:02 PDT 2012
On Thu, Jun 28, 2012 at 05:17:12PM +0200, Michal Srb wrote:
> LoaderSymbol calls dlsym with RTLD_DEFAULT pseudo handle making it search in
> every loaded library. In addition glibc adds NODELETE flag to the library
> containing the symbol.
>
> It's used in doLoadModule to locate <modulename>ModuleData symbol, the
> module's library gets the flag and is kept in memory even after it is
> unloaded.
>
> This patch adds LoaderSymbolFromModule function that looks for symbol only in
> library specified by handle. That way the NODELETE flag isn't added.
>
> This glibc behavior doesn't seem to be documented, but even if other
> implementations differ, there is no reason to search ModuleData symbol outside
> the module's library.
>
> Signed-off-by: Michal Srb <msrb at suse.com>
> Reviewed-by: Daniel Stone <daniel at fooishbar.org>
>
> v2: Switch LoaderSymbolFromModule arguments order.
> Correct description.
scooped this one up into my tree, it's been merged. thanks.
Cheers,
Peter
>
> diff --git a/hw/xfree86/loader/loader.c b/hw/xfree86/loader/loader.c
> index b72b8b8..4836964 100644
> --- a/hw/xfree86/loader/loader.c
> +++ b/hw/xfree86/loader/loader.c
> @@ -160,6 +160,12 @@ LoaderSymbol(const char *name)
> return NULL;
> }
>
> +void *
> +LoaderSymbolFromModule(void *handle, const char *name)
> +{
> + return dlsym(handle, name);
> +}
> +
> void
> LoaderUnload(const char *name, void *handle)
> {
> diff --git a/hw/xfree86/loader/loader.h b/hw/xfree86/loader/loader.h
> index 5cadd5a..c89c641 100644
> --- a/hw/xfree86/loader/loader.h
> +++ b/hw/xfree86/loader/loader.h
> @@ -72,5 +72,6 @@ extern unsigned long LoaderOptions;
>
> /* Internal Functions */
> void *LoaderOpen(const char *, int *, int *);
> +void *LoaderSymbolFromModule(void *, const char *);
>
> #endif /* _LOADER_H */
> diff --git a/hw/xfree86/loader/loadmod.c b/hw/xfree86/loader/loadmod.c
> index 706b9b3..1e6dc00 100644
> --- a/hw/xfree86/loader/loadmod.c
> +++ b/hw/xfree86/loader/loadmod.c
> @@ -956,7 +956,7 @@ doLoadModule(const char *module, const char *path, const char **subdirlist,
> *errmin = 0;
> goto LoadModule_fail;
> }
> - initdata = LoaderSymbol(p);
> + initdata = LoaderSymbolFromModule(ret->handle, p);
> if (initdata) {
> ModuleSetupProc setup;
> ModuleTearDownProc teardown;
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list