[Pythonmac-SIG] A -flat_namespace alternative for OS X 10.3
bob at redivi.com
Fri Nov 7 15:13:03 EST 2003
It just came to my attention that OS X 10.3 has made Yet Another Change
To Dyld For The Better Thats Unfortunately Not Backwards Compatible. I
imagine we'll be seeing at least one of these every release, continuing
the trend. Personally, for 10.4, I'd like to see an equivalent to
@executable_path for bundles, so that one may embed frameworks inside
of a plugin bundle.. I'll probably file a radar for that one.
In the man page for ld(1) in OS X 10.3, there is the following new
addition in the "TWO-LEVEL AND FLAT NAMESPACES" section
When creating a output file with the static link
-twolevel_namespace is in effect (now the default) all undefined
ences must be satisfied at static link time. The flags to
fined references, -Usymbol_name, -undefined warning and
press can't be used. When the environment variable
MENT_TARGET is set to 10.3 then -undefined dynamic_lookup can
and... in the "symbols related" part of the OPTIONS section:
Specifies how undefined symbols are to be treated.
can be: error, warning, or suppress. Which cause the
of undefined symbols as either, errors, warnings, or
the checking of undefined symbols. The default is
undefined symbols as errors. When the environment
MACOSX_DEPLOYMENT_TARGET is set to 10.3 then
dynamic_lookup can also be used to allow any undefined
to be looked up dynamically at runtime. Use of a
with this flag requires a system with a dynamic linker
OS X 10.3 or later. The flag -undefined define_a_way
be used to cause the static linker to create a private
tion for all undefined symbols. This flag should only
if it is known that the undefined symbols are not
any use of them may cause a crash.
What this means to us, is that in situations where -flat_namespace
-undefined suppress would be used, we can (instead of actually fixing
the code) use -undefined dynamic_lookup instead if on OS X and
MACOSX_DEPLOYMENT_TARGET is set. The primary case for this seems to be
SWIG, which to this day still loves that stupid -flat_namespace hack.
I will be using this for any "-flat_namespace" modules in my new
Panther package, which includes at least PyOpenGL, M2Crypto.
I found this out because yesterday a coworker of mine pointed me to a
Perl discussion, where (thankfully it wasn't us this time) Apple
screwed up a Perl configuration file (aptly named Config.pm) that
effects how Perl extensions are built. The mixup they made was that
they set ld to be "MACOSX_DEPLOYMENT_TARGET=10.3; ld -undefined
dynamic_lookup -bundle ... something.." instead of "env
MACOSX_DEPLOYMENT_TARGET=10.3; ld -undefined dynamic_lookup -bundle ...
something ..." .. Oops! :) Unfortunately for Perl users and Apple,
this actually prevents a bunch of the most popular Perl modules from
building, such as the MySQL DBI bindings! So, since I had never seen
dynamic_lookup before, I read the man page.
More information about the Pythonmac-SIG