Intended audience
IDAPython
plugins, loaders or processor modules developers.
The problem
Until now, IDAPython
would load all loaders, processor modules & plugins in the '__main__'
module.
This causes namespace pollution, which can sometimes leads to very obscure errors.
The solution
Starting with version 7.1
, IDA will import plugins, loaders & processor modules in their own, separate Python modules.
The names of those Python modules is derived from the plugin, loader or processor module’s file name.
E.g.,
- a plugin named
myplg.py
will now be imported into its own'__plugins__myplg'
Python module. - a loader named
myldr.py
will now be imported into its own'__loaders__myldr'
Python module. - a processor module named
myprc.py
will now be imported into its own'__procs__myprc'
Python module.
My plugin/loader/processor module complains about unexisting variables/functions!
It very likely means that the code in question was, in effect, relying on some other code being loaded before it, and that was “polluting” the '__main__'
module in a way that was very fortunate from its point-of-view (a happy coincidence, if you will.)
The solution is of course to fix the code in question so that it imports everything it needs, before making use of it.
However…
I’m in a hurry
As a temporary workaround, you can set NAMESPACE_AWARE
to NO
in cfg/python.cfg
.
This will cause IDA to revert to the old behavior, where the '__main__'
module is shared across all plugins, loaders, processor modules & user scripts.
However, please note that support for NAMESPACE_AWARE
will be removed sometimes in the future.