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_lookupdoesn't work when:macOS 12 and iOS 15
because
-undefined dynamic_lookupuses 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_lookupin 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_lookupis 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_lookuplookups 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