#11875·ladybird

LibGfx fails to link on macOS arm64: undefined CoreText symbols

Author: schembriaidenCreated Sep 16, 2026Updated Sep 16, 2026

Summary

Building Ladybird commit bcd9b49c53ddf5754e34d996ee96976d80425c8e through Nix on aarch64-darwin fails when linking liblagom-gfx.

Environment:

  • Clang 21.1.8
  • macOS SDK 26.5
  • Deployment target 15.4
  • Nix-provided dependencies, including shared Skia

The linker reports undefined CoreText symbols referenced by TypefaceSkia.cpp.o, including CTFontCopyGraphicsFont, CTFontCreateCopyWithAttributes, and CTFontCreateUIFontForLanguage.

The LibGfx link command does not include -framework CoreText. Since LibGfx calls these APIs directly, should its Apple dependencies include:

 target_link_libraries(LibGfx PRIVATE "-framework CoreText")

Operating system

macOS

Steps to reproduce

  1. Have a Mac with Nix installed
  2. Get this PR and build without the patch file darwin-build.patch

Expected behavior

Should compile normally

Actual behavior

Errors with:

Undefined symbols for architecture arm64:
  "_CTFontCopyGraphicsFont"
  "_CTFontCreateCopyWithAttributes"
  "_CTFontCreateUIFontForLanguage"
  "_CTFontCreateWithFontDescriptor"
  "_CTFontDescriptorCreateWithAttributes"
  "_kCTFontSlantTrait"
  "_kCTFontTraitsAttribute"
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)

URL for a reduced test case

N/A

HTML/SVG/etc. source for a reduced test case

N/A

Log output and (if possible) backtrace

[557/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/AudioRingBuffer.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[558/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/AudioDevices.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[559/3064] Building CXX object Libraries/LibGfx/CMakeFiles/LibGfx.dir/YUVData.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[560/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/PlaybackStream.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[561/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/RecordStream.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[562/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/NullPlaybackStream.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[563/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/SpscAudioFrameRing.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[564/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/AAC.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[565/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/WSOLAInternals.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[566/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/WSOLATimeStretcher.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[567/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Audio/WSOLAAlgorithm.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[568/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/CodecParameters.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[569/3064] Building CXX object Libraries/LibGfx/CMakeFiles/LibGfx.dir/VideoSurfaceImage.mm.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[570/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/AV1.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[571/3064] Linking CXX shared library lib/liblagom-gfx.0.1.0.dylib
FAILED: [code=1] lib/liblagom-gfx.0.1.0.dylib 
: && /nix/store/zb4dn54dd83q4vch99hy18kg0n8p9nwb-clang-wrapper-21.1.8/bin/clang++ -O3 -DNDEBUG -arch arm64 -isysroot /nix/store/m0zvarrhmhg2bpvca617gx2rja31jg5a-apple-sdk-26.5/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.5.sdk -mmacosx-version-min=15.4 -dynamiclib -Wl,-headerpad_max_install_names -fstack-protector-strong -Xlinker -dead_strip -current_version 0.1.0 -o lib/liblagom-gfx.0.1.0.dylib -install_name @rpath/liblagom-gfx.0.dylib Libraries/LibGfx/CMakeFiles/LibGfx.dir/AffineTransform.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Bitmap.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/BitmapExport.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/BitmapSequence.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/CMYKBitmap.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/CanvasCommandList.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/CanvasCommandPlayer.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Color.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ColorConversion.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ColorSpace.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/CornerRadii.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Cursor.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Filter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/Font.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/FontCatalog.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/FontDatabase.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/FontSupport.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/FontVariationSettings.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/PathFontProvider.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/SharedFontProvider.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/Typeface.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/TypefaceSkia.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/WOFF/Loader.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Font/WOFF2/Loader.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/FontCascadeList.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/GradientPainting.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Gradients.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Matrix4x4.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/DecodedImageFrame.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/BMPWriter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/JPEGWriter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/PNGWriter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/WebPSharedLossless.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/WebPWriter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ImageFormats/WebPWriterLossless.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/PaintStyle.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Painter.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/PainterSkia.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/PaintingSurface.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Palette.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Path.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/PathSkia.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Point.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Rect.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/SharedImage.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/SharedImageBuffer.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ShareableBitmap.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/ShapeFeature.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Size.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/SkiaBackendContext.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/SkiaUtils.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/SystemTheme.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/TextLayout.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/Triangle.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/VectorGraphic.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/YUVData.cpp.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/MetalContext.mm.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/VideoSurfaceImage.mm.o Libraries/LibGfx/CMakeFiles/LibGfx.dir/libgfx_rust_panic_init.cpp.o  -Wl,-rpath,@executable_path/../lib  lib/liblagom-compress.0.1.0.dylib  lib/liblagom-crypto.0.1.0.dylib  lib/liblagom-filesystem.0.1.0.dylib  lib/liblagom-ipc.0.1.0.dylib  /opt/homebrew/lib/libjpeg.dylib  /opt/homebrew/lib/libpng.dylib  -lharfbuzz  cargo/build/aarch64-apple-darwin/release/liblibgfx_rust.a  /opt/homebrew/lib/libcrypto.dylib  lib/liblagom-core.0.1.0.dylib  -framework CoreFoundation  -framework CoreLocation  -framework CoreServices  -framework Foundation  -framework IOSurface  -framework Metal  -framework Accelerate  lib/liblagom-sync.0.1.0.dylib  lib/liblagom-textcodec.0.1.0.dylib  lib/liblagom-unicode.0.1.0.dylib  /nix/store/hh9a3zikvidnypnrg74jrnah8ahvdd0i-woff2-1.0.2-lib/lib/libwoff2dec.dylib  /nix/store/mna7bp7y5v81ww0x8v3w8j5aq57g32kc-brotli-1.2.0-lib/lib/libbrotlidec.dylib  /nix/store/gyvvqx69fvrgxf0hr4jmb3rc7szg1c79-zlib-1.3.2/lib/libz.dylib  /nix/store/d317d8h1hjamps16w1rsls5lh94fdizm-skia-148-unstable-2026-04-14/lib/libskia.dylib  lib/liblagom-ak.0.1.0.dylib && :
ld: warning: dylib (/opt/homebrew/lib/libcrypto.dylib) was built for newer macOS version (26.0) than being linked (15.4)
ld: warning: dylib (/opt/homebrew/lib/libjpeg.dylib) was built for newer macOS version (26.0) than being linked (15.4)
ld: warning: dylib (/opt/homebrew/lib/libpng.dylib) was built for newer macOS version (26.0) than being linked (15.4)
Undefined symbols for architecture arm64:
  "_CTFontCopyGraphicsFont", referenced from:
      Gfx::TypefaceSkia::typeface_from_core_text_typeface(sk_sp<SkTypeface>, __CTFont const*, Gfx::SystemUIFontStyle) in TypefaceSkia.cpp.o
  "_CTFontCreateCopyWithAttributes", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
  "_CTFontCreateUIFontForLanguage", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
  "_CTFontCreateWithFontDescriptor", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
  "_CTFontDescriptorCreateWithAttributes", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
  "_kCTFontSlantTrait", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
  "_kCTFontTraitsAttribute", referenced from:
      Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
ld: symbol(s) not found for architecture arm64
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
[572/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/FLAC.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[573/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/MPEG4Audio.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[574/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/H264.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[575/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/Vorbis.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[576/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/Opus.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[577/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/H265.cpp.o
warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
[578/3064] Building Rust binary flapc
ninja: build stopped: subcommand failed.
error: Cannot build '/nix/store/qm0dgjn6jkn9dhs3w6cmnppwv6rmzsms-ladybird-0-unstable-2026-09-13.drv'.
       Reason: builder failed with exit code 1.
       Output paths:
         /nix/store/bq9cd8l3nlsckysrfqvv7a5zp65kkc3w-ladybird-0-unstable-2026-09-13
       Last 25 log lines:
       >       Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
       >   "_CTFontCreateWithFontDescriptor", referenced from:
       >       Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
       >   "_CTFontDescriptorCreateWithAttributes", referenced from:
       >       Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
       >   "_kCTFontSlantTrait", referenced from:
       >       Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
       >   "_kCTFontTraitsAttribute", referenced from:
       >       Gfx::TypefaceSkia::match_system_ui(Gfx::SystemUIFontKind, float, unsigned short, unsigned short, unsigned char) in TypefaceSkia.cpp.o
       > ld: symbol(s) not found for architecture arm64
       > clang++: error: linker command failed with exit code 1 (use -v to see invocation)
       > [572/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/FLAC.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [573/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/MPEG4Audio.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [574/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/H264.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [575/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/Vorbis.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [576/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/Opus.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [577/3064] Building CXX object Libraries/LibMedia/CMakeFiles/LibMedia.dir/Codecs/H265.cpp.o
       > warning: Skipping impure flag -march=native because NIX_ENFORCE_NO_NATIVE is set
       > [578/3064] Building Rust binary flapc
       > ninja: build stopped: subcommand failed.
       For full logs, run:
         nix-store -l /nix/store/qm0dgjn6jkn9dhs3w6cmnppwv6rmzsms-ladybird-0-unstable-2026-09-13.drv

nixpkgs on  ladybird--0-unstable-2026-06-05-->-0-unstable-2026-09-11 took 2m53s 
❯

Screenshots or screen recordings

No response

Build flags or config settings

No response

Source: LadybirdBrowser/ladybird