Link ext bundles with bundle loader option for newer ld64
ld64 shipped with Xcode 14 emits a warning when using -undefined dynamic_lookup.
ld: warning: -undefined dynamic_lookup may not work with chained fixups
Actually, -undefined dynamic_lookup doesn't work when:
Link a shared library with the option
Link it with a program that uses the chained-fixup introduced from
macOS 12 and iOS 15
because -undefined dynamic_lookup uses lazy-bindings and they won't be
bound while dyld fixes-up by traversing chained-fixup info.
However, we build exts as bundles and they are loaded only through dlopen, so it's safe to use -undefined dynamic_lookup in theory.
So the warning produced by ld64 is false-positive, and it results
failure of option checking in configuration. Therefore, it would be an
option to ignore the warning during our configuration.
On the other hand, -undefined dynamic_lookup is already deprecated on
all darwin platforms except for macOS, so it's good time to get rid of
the option. ld64 also provides -bundle_loader <executable> option,
which allows to resolve symbols defined in the executable symtab while
linking. It behaves almost the same with -undefined dynamic_lookup,
but it makes the following changes:
Require that unresolved symbols among input objects must be defined
in the executable.
Lazy symbol binding will lookup only the symtab of the bundle loader
executable. (-undefined dynamic_lookup lookups all symtab as flat
namespace)
This patch adds -bundle_loader $(RUBY) when non-EXTSTATIC
configuration by assuming ruby executable can be linked before building
exts.
Link ext bundles with bundle loader option for newer ld64
ld64 shipped with Xcode 14 emits a warning when using
-undefined dynamic_lookup
.Actually,
-undefined dynamic_lookup
doesn't work when:macOS 12 and iOS 15
because
-undefined dynamic_lookup
uses lazy-bindings and they won't bebound while dyld fixes-up by traversing chained-fixup info.
However, we build exts as bundles and they are loaded only through
dlopen
, so it's safe to use-undefined dynamic_lookup
in theory.So the warning produced by ld64 is false-positive, and it results
failure of option checking in configuration. Therefore, it would be an
option to ignore the warning during our configuration.
On the other hand,
-undefined dynamic_lookup
is already deprecated onall darwin platforms except for macOS, so it's good time to get rid of
the option. ld64 also provides
-bundle_loader <executable>
option,which allows to resolve symbols defined in the executable symtab while
linking. It behaves almost the same with
-undefined dynamic_lookup
,but it makes the following changes:
in the executable.
executable. (
-undefined dynamic_lookup
lookups all symtab as flatnamespace)
This patch adds
-bundle_loader $(RUBY)
when non-EXTSTATICconfiguration by assuming ruby executable can be linked before building
exts.
See "New Features" subsection under "Linking" section for chained fixup
https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes