Project

General

Profile

« Previous | Next » 

Revision 50d81bfb

Added by katei (Yuta Saito) almost 3 years ago

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:

  1. Link a shared library with the option
  2. 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:

  1. Require that unresolved symbols among input objects must be defined
    in the executable.
  2. 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.

See "New Features" subsection under "Linking" section for chained fixup
https://developer.apple.com/documentation/xcode-release-notes/xcode-13-release-notes