OS X import bug?
Manoj Plakal
terabaap at yumpee.org
Thu Jan 24 22:01:59 EST 2002
Steven,
Thanks for the patch. I applied it to the
2.2 tree that I had checked out from CVS
and re-built foo and bar and tried
importing them again.
eve(1418):test% python
Python 2.2+ (#2, Jan 24 2002, 20:36:33)
[GCC 2.95.2 19991024 (release)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo
var_for_foo = 1
>>> import bar
Traceback (most recent call last):
File "<stdin>", line 1, in ?
ImportError: dyld: python multiple definitions of symbol _var_for_bar
foo.so definition of _var_for_bar
bar.so definition of _var_for_bar
Failure linking new module
>>>
var_for_foo and var_for_bar are defined in baz.c which
is included in both modules foo and bar. The modules
were compiled with a simple distutils setup.py file
(which I had included in my earlier post) which
builds the two modules with -flat_namespace.
The same source code works fine on Red Hat Linux 7.2
with Python 2.1 and Win98 with Python 2.2b2.
So my question now is: is this really a bug
in the OS X implementation, or is this how
Python is supposed to work (and the Linux
and Win32 dynamic loading implementations
just happen to allow this without errors)?
If I am to file a bug at Sourceforge, I'd
like to know exactly what the bug is :)
Manoj
Steven Majewski wrote:
>
> Below is a patch that adds a call to NSLinkEditError, which will
> give you a more explicit error message about what's wrong. It's
> how I discovered which symbol was the problem with that bug:
>
>
> *** dynload_next.c.0 Fri Jan 18 13:50:06 2002
> --- dynload_next.c Fri Jan 18 14:08:13 2002
> ***************
> *** 150,157 ****
> if (errString == NULL) {
> newModule = NSLinkModule(image, pathname,
> NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR);
> ! if (!newModule)
> ! errString = "Failure linking new module";
> }
> if (errString != NULL) {
> PyErr_SetString(PyExc_ImportError, errString);
> --- 150,164 ----
> if (errString == NULL) {
> newModule = NSLinkModule(image, pathname,
> NSLINKMODULE_OPTION_BINDNOW|NSLINKMODULE_OPTION_RETURN_ON_ERROR);
> ! if (!newModule) { // sdm7g
> ! int errNo;
> ! char *fileName, *moreErrorStr;
> ! NSLinkEditErrors c;
> ! errString = "Failure linking new module";
> ! NSLinkEditError( &c, &errNo, &fileName, &moreErrorStr );
> ! errString = strcat( fileName, errString );
> ! errString = strcat( moreErrorStr, errString );
> ! } // sdm7g
> }
> if (errString != NULL) {
> PyErr_SetString(PyExc_ImportError, errString);
>
>
>
>
>
More information about the Python-list
mailing list