# Build settings based on the upstream Xcode project. # See: https://github.com/apple-oss-distributions/dyld/blob/main/dyld.xcodeproj/project.pbxproj # Project settings project( 'dyld', 'c', 'cpp', default_options : { 'cpp_std': 'c++20' }, version : '@version@' ) add_project_arguments( '-DLD_VERSION=@version@', # Prevent build failures due to these targets not being defined '-DTARGET_OS_BRIDGE=0', '-DTARGET_OS_EXCLAVEKIT=0', # Enable support for arm64 variants '-DSUPPORT_ARCH_arm64e=1', '-DSUPPORT_ARCH_arm64_32=1', # Per base.xcconfig '-Wmost', '-Wimplicit-fallthrough', '-Wno-unknown-pragmas', '-Wno-assume', '-Wformat-nonliteral', '-Wno-vla-extension', '-Wundef-prefix=SUPPORT_', language : [ 'c', 'cpp' ], ) # Dependencies cc = meson.get_compiler('c') cxx = meson.get_compiler('cpp') llvm_dep = dependency('llvm') openssl_dep = dependency('openssl', version : '>=3.0') common_inc = [ 'common', 'dyld', 'include', 'mach_o', 'include/mach-o', ] # Internal dependencies corecrypto = static_library( 'corecrypto', include_directories : [ common_inc, 'compat', ], sources : [ 'compat/corecrypto/ccdigest.c', 'compat/corecrypto/ccsha1.c', 'compat/corecrypto/ccsha2.c', ], ) corecrypto_dep = declare_dependency( dependencies : [ openssl_dep ], include_directories : 'compat', link_with : corecrypto, ) common = static_library( 'common', dependencies : [ corecrypto_dep ], include_directories : [ common_inc, 'cache_builder', 'lsl', 'other-tools', ], sources : [ 'common/CRC32c.cpp', 'common/CachePatching.cpp', 'common/Diagnostics.cpp', 'common/DyldSharedCache.cpp', 'common/MachOFile.cpp', 'common/MachOLayout.cpp', 'common/MachOLoaded.cpp', 'common/TargetPolicy.cpp', 'common/Utilities.cpp', ], ) common_dep = declare_dependency( include_directories : [ 'common' ], link_with : common, ) lsl = static_library( 'lsl', cpp_args : [ # Required for `_COMM_PAGE_CPU_CAPABILITIES64` in '-DPRIVATE', ], include_directories : [ common_inc, 'cache_builder', 'libdyld', 'lsl', ], sources : [ 'lsl/Allocator.cpp', 'lsl/PVLEInt64.cpp', ], ) lsl_dep = declare_dependency( include_directories : [ 'lsl' ], link_with : lsl, ) libmach_o = static_library( 'mach_o', dependencies : [ lsl_dep ], include_directories : [ common_inc, 'mach_o', ], sources : [ 'mach_o/Architecture.cpp', 'mach_o/Archive.cpp', 'mach_o/BindOpcodes.cpp', 'mach_o/ChainedFixups.cpp', 'mach_o/CompactUnwind.cpp', 'mach_o/DataInCode.cpp', 'mach_o/DwarfDebug.cpp', 'mach_o/Error.cpp', 'mach_o/ExportsTrie.cpp', 'mach_o/Fixups.cpp', 'mach_o/FunctionStarts.cpp', 'mach_o/FunctionVariants.cpp', 'mach_o/GradedArchitectures.cpp', 'mach_o/LazyLoadDylib.cpp', 'mach_o/Image.cpp', 'mach_o/Instructions.cpp', # 'mach_o/LinkerOptimizationHints.cpp', 'mach_o/LoggingStub.cpp', 'mach_o/Misc.cpp', 'mach_o/NListSymbolTable.cpp', 'mach_o/ObjC.cpp', 'mach_o/Platform.cpp', 'mach_o/Policy.cpp', 'mach_o/RebaseOpcodes.cpp', 'mach_o/SplitSeg.cpp', 'mach_o/Symbol.cpp', 'mach_o/Universal.cpp', 'mach_o/UnsafeHeader.cpp', 'mach_o/Version32.cpp', 'mach_o/Version64.cpp', ], ) libmach_o_dep = declare_dependency( include_directories : [ 'mach_o' ], link_with : libmach_o, ) libmach_o_writer = static_library( 'mach_o_writer', dependencies : [ lsl_dep ], include_directories : [ common_inc, 'mach_o_writer', ], sources : [ 'mach_o_writer/ArchiveWriter.cpp', 'mach_o_writer/BindOpcodesWriter.cpp', 'mach_o_writer/ChainedFixupsWriter.cpp', 'mach_o_writer/ChunkBumpAllocator.cpp', 'mach_o_writer/CompactUnwindWriter.cpp', 'mach_o_writer/DataInCodeWriter.cpp', 'mach_o_writer/ExportsTrieWriter.cpp', 'mach_o_writer/FunctionStartsWriter.cpp', 'mach_o_writer/FunctionVariantsWriter.cpp', 'mach_o_writer/LinkerOptimizationHintsWriter.cpp', 'mach_o_writer/NListSymbolTableWriter.cpp', 'mach_o_writer/RebaseOpcodesWriter.cpp', 'mach_o_writer/SplitSegWriter.cpp', 'mach_o_writer/UniversalWriter.cpp', 'mach_o_writer/UnsafeHeaderWriter.cpp', ], ) libmach_o_writer_dep = declare_dependency( include_directories : [ 'mach_o_writer' ], link_with : libmach_o_writer, ) # These files need to be built with `BUILDING_LIBDYLD` not `BUILDING_DYLDINFO`. # `dyld_info` can’t just link against `libdyld` because the symbols it needs are not publicly exported. # Building `libdyld` as a static archive doesn’t work because it results in internal error when linking with ld64. libminidyld = static_library( 'minidyld', cpp_args : [ # Required for `openbyid_np` in '-DPRIVATE', '-DBUILDING_LIBDYLD=1', ], dependencies : [ common_dep, corecrypto_dep, lsl_dep ], include_directories : [ common_inc, 'cache_builder', 'libdyld', 'libdyld_introspection', ], sources : [ 'libdyld/CrashReporterAnnotations.c', ], ) libdsc_extractor = shared_library( 'dsc_extractor', cpp_args : [ '-DBUILDING_SHARED_CACHE_EXTRACTOR=1' ], dependencies : [ common_dep, corecrypto_dep, libmach_o_dep, lsl_dep ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_args : [ '-Wl,-exported_symbol,_dyld_shared_cache_extract_dylibs_progress' ], link_with : [ libminidyld ], name_prefix : '', name_suffix : 'bundle', sources : [ 'other-tools/dsc_extractor.cpp', 'other-tools/dsc_iterator.cpp', ], ) # Binaries executable( 'dsc_extractor', install : true, link_args : [ '-Wl,-exported_symbol,_dyld_shared_cache_extract_dylibs_progress' ], link_with : [ libdsc_extractor ], sources : [ 'other-tools/dsc_extractor_bin.cpp' ], ) executable( 'dyld_analyzer', cpp_args : [ '-DBUILDING_LEGACY_TOOL' ], dependencies : [ common_dep, libmach_o_dep, lsl_dep, ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_with : [ libminidyld ], sources : [ 'other-tools/dyld_analyzer.cpp', 'other-tools/FileUtils.cpp', 'other-tools/MiscFileUtils.cpp', 'other-tools/Tool.cpp', ], ) executable( 'dyld_info', cpp_args : [ '-DBUILDING_DYLDINFO=1', '-DBUILDING_FOR_TOOLCHAIN=1', ], dependencies : [ common_dep, corecrypto_dep, libmach_o_dep, llvm_dep, lsl_dep, ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_args : [ '-Wl,-weak-lLTO' ], link_with : [ libminidyld ], sources : [ 'other-tools/dyld_info.cpp', 'other-tools/FileUtils.cpp', 'other-tools/MiscFileUtils.cpp', 'other-tools/SymbolicatedImage.cpp', ], ) install_man('doc/man/man1/dyld_info.1') # Requires headers from unpublished ld-prime sources # executable( # 'libtool', # dependencies : [ lsl_dep ], # include_directories : [ # common_inc, # 'cache_builder', # 'mach_o_writer', # ], # install : true, # sources : [ # 'other-tools/libtool.cpp', # 'other-tools/Tool.cpp', # ], # ) # install_man('doc/man/man1/libtool.1') # # # ranlib is a symlink to libtool # install_man('doc/man/man1/ranlib.1') # Requires headers from unpublished ld-prime sources # executable( # 'lipo', # dependencies : [ lsl_dep ], # include_directories : [ common_inc ], # install : true, # sources : [ # 'other-tools/lipo.cpp', # 'other-tools/Tool.cpp', # ], # ) executable( 'nm', cpp_args : [ '-DBUILDING_LEGACY_TOOL' ], dependencies : [ common_dep, libmach_o_dep, lsl_dep, ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_with : [ libminidyld ], sources : [ 'other-tools/MiscFileUtils.cpp', 'other-tools/nm.cpp', 'other-tools/Tool.cpp', ], ) executable( 'strings', cpp_args : [ '-DBUILDING_LEGACY_TOOL' ], dependencies : [ common_dep, libmach_o_dep, lsl_dep, ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_with : [ libminidyld ], sources : [ 'other-tools/MiscFileUtils.cpp', 'other-tools/strings.cpp', 'other-tools/Tool.cpp', ], ) executable( 'size', cpp_args : [ '-DBUILDING_LEGACY_TOOL' ], dependencies : [ common_dep, libmach_o_dep, lsl_dep, ], include_directories : [ common_inc, 'cache_builder', 'other-tools', ], install : true, link_with : [ libminidyld ], sources : [ 'other-tools/MiscFileUtils.cpp', 'other-tools/size.cpp', 'other-tools/Tool.cpp', ], )