.Nd "linker"
.Sh SYNOPSIS
.Nm
-files...
-.Op options
-.Op Fl o Ar outputfile
+files...
+.Op options
+.Op Fl o Ar outputfile
.Sh DESCRIPTION
The
.Nm ld
command combines several object files and libraries, resolves references, and
-produces an ouput file.
+produces an ouput file.
.Nm ld
can produce a final linked image (executable, dylib, or bundle), or with the -r
option, produce another object file. If the -o option is not used, the output
.Ss Universal
The linker accepts universal (multiple-architecture) input files, but
always creates a "thin" (single-architecture), standard Mach-O output file.
-The architecture for the output file is specified using the -arch option.
+The architecture for the output file is specified using the -arch option.
If this option is not used,
.Nm ld
attempts to determine the output architecture by examining the object
architecture determines that of the output file. If no input
object file is a "thin" file, the native 32-bit architecture for the host is used.
.Pp
-Usually,
+Usually,
.Nm ld
-is not used directly. Instead the
+is not used directly. Instead the
.Xr gcc(1)
compiler driver invokes
.Nm ld.
-The compiler driver can be passed multiple -arch options and it will create a
-universal final linked image by invoking
+The compiler driver can be passed multiple -arch options and it will create a
+universal final linked image by invoking
.Nm ld
multiple times and then running
.Xr lipo(1)
merge the outputs into a universal file.
.Ss Layout
The object files are loaded in the order in which they are specified on the
-command line. The segments and the sections in those segments will appear in
-the output file in the order they are encountered in the object files being linked.
+command line. The segments and the sections in those segments will appear in
+the output file in the order they are encountered in the object files being linked.
All zero fill sections will appear after all non-zero fill sections in their segments.
-Sections created from files with the -sectcreate option will be laid out at after
-sections from .o files. The use of the -order_file option will alter the layout
+Sections created from files with the -sectcreate option will be laid out at after
+sections from .o files. The use of the -order_file option will alter the layout
rules above, and move the symbols specified to start of their section.
.Ss Libraries
A static library (aka static archive) is a collection of .o files with a table of contents
-that lists the global symbols in the .o files.
+that lists the global symbols in the .o files.
.Nm ld
will only pull .o files out of a static library if needed to resolve some symbol reference.
-Unlike traditional linkers,
+Unlike traditional linkers,
.Nm ld
will continually search a static library while linking. There is no need to specify a static
-library multiple times on the command line.
+library multiple times on the command line.
.Pp
A dynamic library (aka dylib or framework) is a final linked image. Putting a dynamic
-library on the command line causes two things: 1) The generated final linked image
+library on the command line causes two things: 1) The generated final linked image
will have encoded that it depends on that dynamic library. 2) Exported symbols from the
-dynamic library are used to resolve references.
+dynamic library are used to resolve references.
.Pp
-Both dynamic and static libraries are searched as they appear on the command line.
+Both dynamic and static libraries are searched as they appear on the command line.
.Ss Search paths
.Nm ld
maintains a list of directories to search for a library or framework to use. The default
library search path is /usr/lib then /usr/local/lib. The -L option will add a new library search
path. The default framework search path is /Library/Frameworks then /System/Library/Frameworks.
(Note: previously, /Network/Library/Frameworks was at the end of the default path. If you need
-that functionality, you need to explicitly add -F/Network/Library/Frameworks).
+that functionality, you need to explicitly add -F/Network/Library/Frameworks).
The -F option will add a new framework search path. The -Z option will remove
the standard search paths. The -syslibroot option will prepend a prefix to all search
paths.
.Ss Two-level namespace
-By default all references resolved to a dynamic library record the library to which
+By default all references resolved to a dynamic library record the library to which
they were resolved. At runtime, dyld uses that information to directly resolve
symbols. The alternative is to use the -flat_namespace option. With flat namespace,
the library is not recorded. At runtime, dyld will search each dynamic library in load
-order when resolving symbols. This is slower, but more like how other operating systems
-resolve symbols.
+order when resolving symbols. This is slower, but more like how other operating systems
+resolve symbols.
.Ss Indirect dynamic libraries
If the command line specifies to link against dylib A, and when dylib A was built it linked
-against dylib B, then B is considered an indirect dylib.
-When linking for two-level namespace, ld does not look at indirect dylibs, except when
-re-exported by a direct dylibs. On the other hand when linking for flat namespace,
+against dylib B, then B is considered an indirect dylib.
+When linking for two-level namespace, ld does not look at indirect dylibs, except when
+re-exported by a direct dylibs. On the other hand when linking for flat namespace,
ld does load all indirect dylibs and uses them to resolve references.
-Even though indirect dylibs are specified via a full path,
+Even though indirect dylibs are specified via a full path,
.Nm ld
first uses the specified search paths to locate each indirect dylib. If one cannot
be found using the search paths, the full path is used.
.Ss Dynamic libraries undefines
-When linking for two-level namespace,
-.Nm ld
+When linking for two-level namespace,
+.Nm ld
does not verify that undefines in dylibs actually
-exist. But when linking for flat namespace,
+exist. But when linking for flat namespace,
.Nm ld
-does check that all undefines from all loaded dylibs have a matching definition.
+does check that all undefines from all loaded dylibs have a matching definition.
This is sometimes used to force selected functions to be loaded from a static library.
.Sh OPTIONS
.Ss Options that control the kind of output
.It Fl bundle
Produce a mach-o bundle that has file type MH_BUNDLE.
.It Fl r
-Merges object files to produce another mach-o object file with file type MH_OBJECT.
+Merges object files to produce another mach-o object file with file type MH_OBJECT.
.It Fl dylinker
Produce a mach-o dylinker that has file type MH_DYLINKER. Only used when building dyld.
.It Fl dynamic
The default. Implied by -dylib, -bundle, or -execute
.It Fl static
-Produces a mach-o file that does not use the dyld. Only used building the kernel.
+Produces a mach-o file that does not use the dyld. Only used building the kernel.
.It Fl preload
Produces a mach-o file in which the mach_header, load commands, and symbol table are
not in any segment. This output type is used for firmware or embedded development
That is, the library is allowed to be missing at runtime.
.It Fl weak_library Ar path_to_library
This is the same as listing a file name path to a library on the link line except that it forces the
-library and all references to it to be marked as weak imports.
+library and all references to it to be marked as weak imports.
.It Fl reexport-l Ns Ar x
-This is the same as the -lx but specifies that the all symbols in library x should be available to
+This is the same as the -lx but specifies that the all symbols in library x should be available to
clients linking to the library being created. This was previously done with a separate -sub_library option.
.It Fl reexport_library Ar path_to_library
-This is the same as listing a file name path to a library on the link line and it specifies that the
+This is the same as listing a file name path to a library on the link line and it specifies that the
all symbols in library path should be available to clients linking to the library being created.
This was previously done with a separate -sub_library option.
.It Fl lazy-l Ns Ar x
This is the same as the -lx but it is only for shared libraries and the linker
-will construct glue code so that the shared library is not loaded until
+will construct glue code so that the shared library is not loaded until
the first function in it is called.
.It Fl lazy_library Ar path_to_library
This is the same as listing a file name path to a shared library on the link line
-except that the linker will construct glue code so that the shared library is not
+except that the linker will construct glue code so that the shared library is not
loaded until the first function in it is called.
.It Fl upward-l Ns Ar x
-This is the same as the -lx but specifies that the dylib is an upward dependency.
+This is the same as the -lx but specifies that the dylib is an upward dependency.
.It Fl upward_library Ar path_to_library
-This is the same as listing a file name path to a library on the link line but also marks
+This is the same as listing a file name path to a library on the link line but also marks
the dylib as an upward dependency.
.It Fl L Ns dir
-Add
-.Ar dir
-to the list of directories in which to search for libraries.
+Add
+.Ar dir
+to the list of directories in which to search for libraries.
Directories specified with -L are searched in the order they appear on the command line
and before the default search path. In Xcode4 and later, there can be a space between
the -L and directory.
.It Fl Z
Do not search the standard directories when searching for libraries and frameworks.
.It Fl syslibroot Ar rootdir
-Prepend
-.Ar rootdir
+Prepend
+.Ar rootdir
to all search paths when searching for libraries or frameworks.
.It Fl search_paths_first
-This is now the default (in Xcode4 tools). When processing -lx the linker now searches each directory
-in its library search paths for `libx.dylib' then `libx.a' before the moving on to the next path
-in the library search path.
+This is now the default (in Xcode4 tools). When processing -lx the linker now searches each directory
+in its library search paths for `libx.dylib' then `libx.a' before the moving on to the next path
+in the library search path.
.It Fl search_dylibs_first
Changes the searching behavior for libraries. The default is that when processing -lx the linker
searches each directory in its library search paths for `libx.dylib' then `libx.a'.
If the optional suffix is specified the framework is first searched for the name with the suffix and then without
(e.g. look for `name.framework/name_suffix' first, if not there try `name.framework/name').
.It Fl weak_framework Ar name[,suffix]
-This is the same as the -framework name[,suffix] but forces the framework and all
-references to it to be marked as weak imports.
+This is the same as the -framework name[,suffix] but forces the framework and all
+references to it to be marked as weak imports.
.It Fl reexport_framework Ar name[,suffix]
-This is the same as the -framework name[,suffix] but also specifies that the
+This is the same as the -framework name[,suffix] but also specifies that the
all symbols in that framework should be available to clients linking to the library being created.
This was previously done with a separate -sub_umbrella option.
.It Fl lazy_framework Ar name[,suffix]
-This is the same as the -framework name[,suffix] except that the linker will
-construct glue code so that the framework is not
+This is the same as the -framework name[,suffix] except that the linker will
+construct glue code so that the framework is not
loaded until the first function in it is called. You cannot directly access
data or Objective-C classes in a framework linked this way.
.It Fl upward_framework Ar name[,suffix]
-This is the same as the -framework name[,suffix] but also specifies that the
-framework is an upward dependency.
+This is the same as the -framework name[,suffix] but also specifies that the
+framework is an upward dependency.
.It Fl F Ns dir
-Add
+Add
.Ar dir
-to the list of directories in which to search for frameworks.
+to the list of directories in which to search for frameworks.
Directories specified with -F are searched in the order they appear on the command line
and before the default search path. In Xcode4 and later, there can be a space between
the -F and directory.
.Ss Options that control additional content
.Bl -tag
.It Fl sectcreate Ar segname sectname file
-The section
-.Ar sectname
-in the segment
-.Ar segname
-is created from the contents of file
-.Ar file.
-The combination of segname and sectname must be unique Ð there cannot already be a section (segname,sectname)
+The section
+.Ar sectname
+in the segment
+.Ar segname
+is created from the contents of file
+.Ar file.
+The combination of segname and sectname must be unique Ð there cannot already be a section (segname,sectname)
from any other input.
.It Fl filelist Ar file[,dirname]
-Specifies that the linker should link the files listed in
-.Ar file .
-This is an alternative to listing the files on the command line.
+Specifies that the linker should link the files listed in
+.Ar file .
+This is an alternative to listing the files on the command line.
The file names are listed one per line separated only by newlines. (Spaces and tabs are assumed to be part of the file name.)
-If the optional directory name,
-.Ar dirname
+If the optional directory name,
+.Ar dirname
is specified, it is prepended to each name in the list file.
.It Fl dtrace Ar file
-Enables dtrace static probes when producing a final linked image. The file
+Enables dtrace static probes when producing a final linked image. The file
.Ar file
must be a DTrace script which declares the static probes.
.El
-.Ss Options that control optimizations
+.Ss Options that control optimizations
.Bl -tag
.It Fl dead_strip
-Remove functions and data that are unreachable by the entry point or exported symbols.
+Remove functions and data that are unreachable by the entry point or exported symbols.
.It Fl order_file Ar file
Alters the order in which functions and data are laid out. For each section in the output file,
-any symbol in that section that are specified in the order file
+any symbol in that section that are specified in the order file
.Ar file
-is moved to the start of its section and laid out in the same order as in the order file
+is moved to the start of its section and laid out in the same order as in the order file
.Ar file .
Order files are text files with one symbol name per line. Lines starting with a # are comments.
-A symbol name may be optionally preceded with its object file leaf name and a colon (e.g. foo.o:_foo).
-This is useful for static functions/data that occur in multiple files.
+A symbol name may be optionally preceded with its object file leaf name and a colon (e.g. foo.o:_foo).
+This is useful for static functions/data that occur in multiple files.
A symbol name may also be optionally preceded with the architecture (e.g. ppc:_foo or ppc:foo.o:_foo).
-This enables you to have one order file that works for multiple architectures.
+This enables you to have one order file that works for multiple architectures.
Literal c-strings may be ordered by by quoting the string (e.g. "Hello, world\\n") in the order file.
.It Fl no_order_inits
When the -order_file option is not used, the linker lays out functions in object file order and
is a hexadecimal number with an optional leading 0x. By choosing non-overlapping address for all
dylibs and bundles that a program loads, launch time can be improved because dyld will not need to
"rebase" the image (that is, adjust pointers within the image to work at the loaded address).
-It is often easier to not use this option, but instead use the rebase(1) tool, and give it a list of dylibs.
+It is often easier to not use this option, but instead use the rebase(1) tool, and give it a list of dylibs.
It will then choose non-overlapping addresses for the list and rebase them all.
This option is also called -seg1addr for compatibility.
.It Fl no_implicit_dylibs
-When creating a two-level namespace final linked image, normally the linker will hoist up public dylibs
+When creating a two-level namespace final linked image, normally the linker will hoist up public dylibs
that are implicitly linked to make the two-level namespace
-encoding more efficient for dyld. For example, Cocoa re-exports AppKit and AppKit re-exports Foundation.
+encoding more efficient for dyld. For example, Cocoa re-exports AppKit and AppKit re-exports Foundation.
If you link with -framework Cocoa and use a symbol from Foundation, the linker will implicitly add a load
-command to load Foundation and encode the symbol as coming from Foundation. If you use this option,
+command to load Foundation and encode the symbol as coming from Foundation. If you use this option,
the linker will not add a load command for Foundation and encode the symbol as coming from Cocoa. Then
at runtime dyld will have to search Cocoa and AppKit before finding the symbol in Foundation.
.It Fl exported_symbols_order Ar file
When targeting Mac OS X 10.6 or later, the format of the exported symbol information can be optimized to
make lookups of popular symbols faster. This option is used to pass a file containing a list of
the symbols most frequently used by clients of the dynamic library being built. Not all exported symbols
-need to be listed.
+need to be listed.
.It Fl no_zero_fill_sections
By default the linker moves all zero fill sections to the end of the __DATA segment and configures
them to use no space on disk. This option suppresses that optimization, so zero-filled data occupies
maximum branch distance. Useful with -preload when code is in multiple sections but all are within
the branch range.
.El
-.Ss Options when creating a dynamic library (dylib)
+.Ss Options when creating a dynamic library (dylib)
.Bl -tag
.It Fl install_name Ar name
-Sets an internal "install path" (LC_ID_DYLIB) in a dynamic library. Any clients linked against the library
-will record that path as the way dyld should locate this library. If this option is not specified, then
+Sets an internal "install path" (LC_ID_DYLIB) in a dynamic library. Any clients linked against the library
+will record that path as the way dyld should locate this library. If this option is not specified, then
the -o path will be used. This option is also called -dylib_install_name for compatibility.
.It Fl mark_dead_strippable_dylib
-Specifies that the dylib being built can be dead strip by any client. That is, the dylib has
+Specifies that the dylib being built can be dead strip by any client. That is, the dylib has
no initialization side effects. So if a client links against the dylib, but never uses
any symbol from it, the linker can optimize away the use of the dylib.
.It Fl compatibility_version Ar number
-Specifies the compatibility version number of the library. When a library is loaded by dyld, the
+Specifies the compatibility version number of the library. When a library is loaded by dyld, the
compatibility version is checked and if the program's version is greater that the library's version, it is an error.
-The format of
-.Ar number
-is X[.Y[.Z]] where X must be a positive non-zero number less than or equal to 65535,
-and .Y and .Z are optional and if present must be non-negative numbers less than or equal to 255.
-If the compatibility version number is not specified, it has a value of 0 and no checking is done when the library is used.
+The format of
+.Ar number
+is X[.Y[.Z]] where X must be a positive non-zero number less than or equal to 65535,
+and .Y and .Z are optional and if present must be non-negative numbers less than or equal to 255.
+If the compatibility version number is not specified, it has a value of 0 and no checking is done when the library is used.
This option is also called -dylib_compatibility_version for compatibility.
.It Fl current_version Ar number
-Specifies the current version number of the library. The current version of the library can be obtained
-programmatically by the user of the library so it can determine exactly which version of the library it is using.
-The format of
-.Ar number
-is X[.Y[.Z]] where X must be a positive non-zero number less than or equal to 65535,
-and .Y and .Z are optional and if present must be non-negative numbers less than or equal to 255.
+Specifies the current version number of the library. The current version of the library can be obtained
+programmatically by the user of the library so it can determine exactly which version of the library it is using.
+The format of
+.Ar number
+is X[.Y[.Z]] where X must be a positive non-zero number less than or equal to 65535,
+and .Y and .Z are optional and if present must be non-negative numbers less than or equal to 255.
If the version number is not specified, it has a value of 0.
This option is also called -dylib_current_version for compatibility.
.El
.Bl -tag
.It Fl pie
This makes a special kind of main executable that is position independent (PIE). On Mac OS X 10.5 and later, the OS
-the OS will load a PIE at a random address each time it is executed. You cannot create a PIE from .o files compiled
-with -mdynamic-no-pic. That means the codegen is less optimal, but the address randomization adds some
+the OS will load a PIE at a random address each time it is executed. You cannot create a PIE from .o files compiled
+with -mdynamic-no-pic. That means the codegen is less optimal, but the address randomization adds some
security. When targeting Mac OS X 10.7 or later PIE is the default for main executables.
.It Fl no_pie
Do not make a position independent executable (PIE). This is the default, when targeting 10.6 and earlier.
By default the linker creates an unreadable segment starting at address zero named __PAGEZERO. Its existence
will cause a bus error if a NULL pointer is dereferenced. The argument
.Ar size
-is a hexadecimal number with an optional leading 0x. If
+is a hexadecimal number with an optional leading 0x. If
.Ar size
-is zero, the linker will not generate a page zero segment. By default on 32-bit architectures the page zero size
+is zero, the linker will not generate a page zero segment. By default on 32-bit architectures the page zero size
is 4KB. On 64-bit architectures, the default size is 4GB. The ppc64 architecture has some special cases. Since Mac
-OS X 10.4 did not support 4GB page zero programs, the default page zero size for ppc64 will be 4KB unless
+OS X 10.4 did not support 4GB page zero programs, the default page zero size for ppc64 will be 4KB unless
-macosx_version_min is 10.5 or later. Also, the -mdynamic-no-pic codegen model for ppc64 will only work if the
code is placed in the lower 2GB of the address space, so the if the linker detects any such code, the page zero
size is set to 4KB and then a new unreadable trailing segment is created after the code, filling up the lower 4GB.
Specifies the maximum stack size for the main thread in a program. Without this option a program has a 8MB stack.
The argument
.Ar size
-is a hexadecimal number with an optional leading 0x. The
+is a hexadecimal number with an optional leading 0x. The
.Ar size
should be a multiple of the architecture's page size (4KB or 16KB).
-.It Fl allow_stack_execute
+.It Fl allow_stack_execute
Marks executable so that all stacks in the task will be given stack execution privilege. This includes pthread stacks.
.It Fl export_dynamic
Preserves all global symbols in main executables during LTO. Without this option, Link Time Optimization
is allowed to inline and remove global functions. This option is used when a main executable may load
-a plug-in which requires certain symbols from the main executable.
+a plug-in which requires certain symbols from the main executable.
.El
.Ss Options when creating a bundle
.Bl -tag
.It Fl bundle_loader Ar executable
-This specifies the
-.Ar executable
-that will be loading the bundle output file being linked.
-Undefined symbols from the bundle are checked against the specified
-.Ar executable
-like it was one of the
+This specifies the
+.Ar executable
+that will be loading the bundle output file being linked.
+Undefined symbols from the bundle are checked against the specified
+.Ar executable
+like it was one of the
dynamic libraries the bundle was linked with.
.El
.Ss Options when creating an object file
.Bl -tag
.It Fl keep_private_externs
-Don't turn private external (aka visibility=hidden) symbols into static symbols,
+Don't turn private external (aka visibility=hidden) symbols into static symbols,
but rather leave them as private external in the resulting object file.
.It Fl d
Force definition of common symbols. That is, transform tentative definitions into real definitions.
.Ss Options that control symbol resolution
.Bl -tag
.It Fl exported_symbols_list Ar filename
-The specified
-.Ar filename
-contains a list of global symbol names that will remain as global symbols in the output file.
-All other global symbols will be treated as if they were marked as __private_extern__ (aka visibility=hidden)
+The specified
+.Ar filename
+contains a list of global symbol names that will remain as global symbols in the output file.
+All other global symbols will be treated as if they were marked as __private_extern__ (aka visibility=hidden)
and will not be global in the output file. The symbol names listed in filename must be one per line.
-Leading and trailing white space are not part of the symbol name.
+Leading and trailing white space are not part of the symbol name.
Lines starting with # are ignored, as are lines with only white space.
Some wildcards (similar to shell file matching) are supported. The * matches zero or more characters.
The ? matches one character. [abc] matches one character which must be an 'a', 'b', or 'c'. [a-z] matches
-any single lower case letter from 'a' to 'z'.
+any single lower case letter from 'a' to 'z'.
.It Fl exported_symbol Ar symbol
-The specified
+The specified
.Ar symbol
-is added to the list of global symbols names that will remain as global symbols in the output file. This
-option can be used multiple times. For short lists, this can be more convenient than creating a file and using
+is added to the list of global symbols names that will remain as global symbols in the output file. This
+option can be used multiple times. For short lists, this can be more convenient than creating a file and using
-exported_symbols_list.
.It Fl unexported_symbols_list Ar file
-The specified
-.Ar filename
-contains a list of global symbol names that will not remain as global symbols in the output file.
+The specified
+.Ar filename
+contains a list of global symbol names that will not remain as global symbols in the output file.
The symbols will be treated as if they were marked as __private_extern__ (aka visibility=hidden) and will not be global
-in the output file. The symbol names listed in filename must be one per line.
-Leading and trailing white space are not part of the symbol name.
+in the output file. The symbol names listed in filename must be one per line.
+Leading and trailing white space are not part of the symbol name.
Lines starting with # are ignored, as are lines with only white space.
Some wildcards (similar to shell file matching) are supported. The * matches zero or more characters.
The ? matches one character. [abc] matches one character which must be an 'a', 'b', or 'c'. [a-z] matches
-any single lower case letter from 'a' to 'z'.
+any single lower case letter from 'a' to 'z'.
.It Fl unexported_symbol Ar symbol
-The specified
+The specified
.Ar symbol
-is added to the list of global symbols names that will not remain as global symbols in the output file. This
-option can be used multiple times. For short lists, this can be more convenient than creating a file and using
+is added to the list of global symbols names that will not remain as global symbols in the output file. This
+option can be used multiple times. For short lists, this can be more convenient than creating a file and using
-unexported_symbols_list.
.It Fl reexported_symbols_list Ar file
-The specified
-.Ar filename
+The specified
+.Ar filename
contains a list of symbol names that are implemented in a dependent dylib and should be re-exported
-through the dylib being created.
+through the dylib being created.
.It Fl alias Ar symbol_name Ar alternate_symbol_name
-Create an alias named
+Create an alias named
.Ar alternate_symbol_name
for the symbol
.Ar symbol_name .
By default the alias symbol has global visibility. This option was previous the -idef:indir option.
.It Fl alias_list Ar filename
-The specified
+The specified
.Ar filename
contains a list of aliases. The symbol name and its alias are on one line, separated by whitespace.
Lines starting with # are ignored.
-.It Fl flat_namespace
+.It Fl flat_namespace
Alters how symbols are resolved at build time and runtime. With -two_levelnamespace (the default), the linker
-only searches dylibs on the command line for symbols, and records in which dylib they were found. With -flat_namespace,
+only searches dylibs on the command line for symbols, and records in which dylib they were found. With -flat_namespace,
the linker searches all dylibs on the command line and all dylibs those original dylibs depend on. The linker
does not record which dylib an external symbol came from, so at runtime dyld again searches all images and uses
the first definition it finds. In addition, any undefines in loaded flat_namespace dylibs must be resolvable
-at build time.
+at build time.
.It Fl u Ar symbol_name
-Specified that symbol
+Specified that symbol
.Ar symbol_name
must be defined for the link to succeed. This is useful to force selected functions to be loaded
from a static library.
.It Fl U Ar symbol_name
-Specified that it is ok for
+Specified that it is ok for
.Ar symbol_name
to have no definition. With -two_levelnamespace, the resulting symbol will be marked dynamic_lookup which
means dyld will search all loaded images.
.It Fl undefined Ar treatment
Specifies how undefined symbols are to be treated. Options are: error, warning, suppress, or dynamic_lookup. The
-default is error.
+default is error.
.It Fl rpath Ar path
-Add
+Add
.Ar path
to the runpath search path list for image being created. At runtime, dyld uses the runpath when searching
for dylibs whose load path begins with @rpath/.
.It Fl commons Ar treatment
-Specifies how commons (aka tentative definitions) are resolved with respect to dylibs. Options are:
+Specifies how commons (aka tentative definitions) are resolved with respect to dylibs. Options are:
ignore_dylibs, use_dylibs, error. The default is ignore_dylibs which means the linker will turn a tentative
definition in an object file into a real definition and not even check dylibs for conflicts. The dylibs
-option means the linker should check linked dylibs for definitions and use them to replace tentative definitions
+option means the linker should check linked dylibs for definitions and use them to replace tentative definitions
from object files. The error option means the linker should issue an error whenever a tentative definition in an
object file conflicts with an external symbol in a linked dylib. See also -warn_commons.
.El
Log why each object file in a static library is loaded. That is, what symbol was needed. Also called -whyload
for compatibility.
.It Fl why_live Ar symbol_name
-Logs a chain of references to
+Logs a chain of references to
.Ar symbol_name .
Only applicable with -dead_strip .
It can help debug why something that you think should be dead strip removed is not removed.
allows dead code stripping, which uses symbols to break up code and data, to
work properly and provides the security of having source symbol names removed.
.It Fl non_global_symbols_strip_list Ar filename
-The specified
-.Ar filename
-contains a list of non-global symbol names that should be removed from the output file's symbol table. All other
+The specified
+.Ar filename
+contains a list of non-global symbol names that should be removed from the output file's symbol table. All other
non-global symbol names will remain in the output files symbol table. See -exported_symbols_list for syntax and use
of wildcards.
.It Fl non_global_symbols_no_strip_list Ar filename
-The specified
-.Ar filename
-contains a list of non-global symbol names that should be remain in the output file's symbol table. All other
+The specified
+.Ar filename
+contains a list of non-global symbol names that should be remain in the output file's symbol table. All other
symbol names will be removed from the output file's symbol table. See -exported_symbols_list for syntax and use
of wildcards.
.El
Generates an embedded bitcode bundle in the output binary. The bitcode bundle is embedded in __LLVM, __bundle section.
This option requires all the object files, static libraries and user frameworks/dylibs contain bitcode.
Note: not all the linker options are supported to use together with -bitcode_bundle.
-.It Fl bitcode_hide_symbol
+.It Fl bitcode_hide_symbols
Specifies this option together with -bitcode_bundle to hide all non-exported symbols from output bitcode bundle.
The hide symbol process might not be reversible. To obtain a reverse mapping file to recover all the symbols, use
-bitcode_symbol_map option.
.Bl -tag
.It Fl v
Prints the version of the linker.
+.It Fl no_weak_imports
+Error if any symbols are weak imports (i.e. allowed to be unresolved (NULL) at runtime). Useful for config based
+projects that assume they are built and run on the same OS version.
.It Fl no_deduplicate
Don't run deduplication pass in linker
.It Fl verbose_deduplicate
target segment name and a path to a file containing a list of symbols to move.
Comments can be added to the symbol file by starting a line with a #.
If there are multiple instances of a symbol name (for instance a "static int foo=5;" in multiple files)
-the symbol name in the symbol list file can be prefixed with the object file name
+the symbol name in the symbol list file can be prefixed with the object file name
(e.g. "init.o:_foo") to move a specific instance.
-.It Fl move_to_ro_section Ar segment_name Ar section_name Ar filename
+.It Fl move_to_ro_segment Ar segment_name Ar filename
Moves code symbols to another segment. The command line option specifies the
target segment name and a path to a file containing a list of symbols to move.
Comments can be added to the symbol file by starting a line with a #.
If there are multiple instances of a symbol name (for instance a "static int foo() {}" in multiple files)
-the symbol name in the symbol list file can be prefixed with the object file name
+the symbol name in the symbol list file can be prefixed with the object file name
(e.g. "init.o:_foo") to move a specific instance.
.It Fl rename_section Ar orgSegment orgSection newSegment newSection
Renames section orgSegment/orgSection to newSegment/newSection.
-.It Fl rename_segment Ar orgSegment newSegment
+.It Fl rename_segment Ar orgSegment newSegment
Renames all sections with orgSegment segment name to have newSegment segment name.
.It Fl trace_symbol_layout
For using in debugging -rename_section, -rename_segment, -move_to_ro_segment, and -move_to_rw_segment.
This option prints out a line show where and why each symbol was moved.
-Note: These options do not chain. For each symbol, the linker first checks
--move_to_ro_segment and -move_to_rw_segment. If the symbol is not moved,
-it checks for an applicable -rename_section. Only if the symbol still has
-not been moved, does the linker look for an applicable -rename_segment option.
+Note: These options do chain. For each symbol, the linker first checks
+-move_to_ro_segment and -move_to_rw_segment. Next it applies any -rename_section options,
+and lastly and -rename_segment options.
.It Fl section_order Ar segname Ar colon_separated_section_list
Only for use with -preload. Specifies the order that sections with the specified segment should be layout out.
-For example: "-section_order __ROM __text:__const:__cstring".
+For example: "-section_order __ROM __text:__const:__cstring".
.It Fl segment_order Ar colon_separated_segment_list
Only for use with -preload. Specifies the order segments should be layout out.
-For example: "-segment_order __ROM:__ROM2:__RAM".
+For example: "-segment_order __ROM:__ROM2:__RAM".
.It Fl allow_heap_execute
-Normally i386 main executables will be marked so that the Mac OS X 10.7 and later kernel
+Normally i386 main executables will be marked so that the Mac OS X 10.7 and later kernel
will only allow pages with the x-bit to execute instructions. This option overrides that
behavior and allows instructions on any page to be executed.
.It Fl application_extension
will then validiate that any dynamic libraries linked against are safe for use in
application extensions.
.It Fl no_application_extension
-Specifies that the code is being linked is not safe for use in an application extension.
+Specifies that the code is being linked is not safe for use in an application extension.
For instance, can be used when creating a framework that should not be used in
an application extension.
.It Fl fatal_warnings
.It Fl warn_compact_unwind
When producing a final linked image, the linker processes the __eh_frame section and
produces an __unwind_info section. Most FDE entries in the __eh_frame can be represented
-by a 32-bit value in the __unwind_info section. The option issues a warning for
+by a 32-bit value in the __unwind_info section. The option issues a warning for
any function whose FDE cannot be expressed in the compact unwind format.
.It Fl warn_weak_exports
Issue a warning if the resulting final linked image contains weak external symbols. Such
symbols require dyld to do extra work at launch time to coalesce those symbols.
.It Fl objc_gc_compaction
-Marks the Objective-C image info in the final linked image with the bit that says that the
+Marks the Objective-C image info in the final linked image with the bit that says that the
code was built to work the compacting garbage collection.
.It Fl objc_gc
Verifies all code was compiled with -fobjc-gc or -fobjc-gc-only.
.It Fl objc_gc_only
Verifies all code was compiled with -fobjc-gc-only.
.It Fl dead_strip_dylibs
-Remove dylibs that are unreachable by the entry point or exported symbols. That is,
+Remove dylibs that are unreachable by the entry point or exported symbols. That is,
suppresses the generation of load command commands for dylibs which supplied no
-symbols during the link. This option should not be used when linking against a dylib which
+symbols during the link. This option should not be used when linking against a dylib which
is required at runtime for some indirect reason such as the dylib has an important initializer.
.It Fl allow_sub_type_mismatches
Normally the linker considers different cpu-subtype for ARM (e.g. armv4t and armv6) to be different
.It Fl setuid_safe
Sets the MH_SETUID_SAFE bit in the mach header of the output file.
.It Fl interposable
-Indirects access to all to exported symbols when creating a dynamic library.
+Indirects access to all to exported symbols when creating a dynamic library.
.It Fl init Ar symbol_name
-The specified symbol_name will be run as the first initializer. Only used when creating a dynamic library.
+The specified symbol_name will be run as the first initializer. Only used when creating a dynamic library.
.It Fl sub_library Ar library_name
-The specified dylib will be re-exported. For example the library_name for /usr/lib/libobjc_profile.A.dylib would be libobjc.
-Only used when creating a dynamic library.
+The specified dylib will be re-exported. For example the library_name for /usr/lib/libobjc_profile.A.dylib would be libobjc.
+Only used when creating a dynamic library.
.It Fl sub_umbrella Ar framework_name
-The specified framework will be re-exported. Only used when creating a dynamic library.
+The specified framework will be re-exported. Only used when creating a dynamic library.
.It Fl allowable_client Ar name
-Restricts what can link against the dynamic library being created. By default any code
+Restricts what can link against the dynamic library being created. By default any code
can link against any dylib. But if a dylib is supposed to be private to a small
set of clients, you can formalize that by adding a -allowable_client for each client.
If a client is libfoo.1.dylib its -allowable_client name would be "foo". If a
client is Foo.framework its -allowable_client name would be "Foo". For the degenerate
-case where you want no one to ever link against a dylib, you can set the
--allowable_client to "!".
+case where you want no one to ever link against a dylib, you can set the
+-allowable_client to "!".
.It Fl client_name Ar name
-Enables a bundle to link against a dylib that was built with -allowable_client.
+Enables a bundle to link against a dylib that was built with -allowable_client.
The name specified must match one of the -allowable_client names specified when the dylib was created.
.It Fl umbrella Ar framework_name
Specifies that the dylib being linked is re-exported through an umbrella framework of the specified name.
.It Fl headerpad Ar size
-Specifies the minimum space for future expansion of the load commands. Only useful if intend to run
+Specifies the minimum space for future expansion of the load commands. Only useful if intend to run
install_name_tool to alter the load commands later. Size is a hexadecimal number.
.It Fl headerpad_max_install_names
-Automatically adds space for future expansion of load commands such that all paths could expand to MAXPATHLEN.
+Automatically adds space for future expansion of load commands such that all paths could expand to MAXPATHLEN.
Only useful if intend to run install_name_tool to alter the load commands later.
.It Fl bind_at_load
Sets a bit in the mach header of the resulting binary which tells dyld to bind all symbols when the binary is loaded, rather than lazily.
Sets a bit in the mach header of the resulting binary which tells dyld to not only use flat namespace for the binary,
but force flat namespace binding on all dylibs and bundles loaded in the process. Can only be used when linking main executables.
.It Fl sectalign Ar segname Ar sectname Ar value
-The section named sectname in the segment segname will have its alignment set to value, where value is a hexadecimal
-number that must be an integral power of 2.
+The section named sectname in the segment segname will have its alignment set to value, where value is a hexadecimal
+number that must be an integral power of 2.
.It Fl stack_addr Ar address
Specifies the initial address of the stack pointer value, where value is a hexadecimal number rounded to a page boundary.
.It Fl segprot Ar segname Ar max_prot Ar init_prot
-Specifies the maximum and initial virtual memory protection of the named segment, name, to be max and init ,respectively.
+Specifies the maximum and initial virtual memory protection of the named segment, name, to be max and init ,respectively.
The values for max and init are any combination of the characters `r' (for read), `w' (for write), `x' (for execute) and `-' (no access).
.It Fl seg_addr_table Ar filename
-Specifies a file containing base addresses for dynamic libraries. Each line of the file is a hexadecimal base address
+Specifies a file containing base addresses for dynamic libraries. Each line of the file is a hexadecimal base address
followed by whitespace then the install name of the corresponding dylib. The # character denotes a comment.
.It Fl segs_read_write_addr Ar address
-Allows a dynamic library to be built where the read-only and read-write segments are not contiguous. The address
+Allows a dynamic library to be built where the read-only and read-write segments are not contiguous. The address
specified is a hexadecimal number that indicates the base address for the read-write segments.
.It Fl segs_read_only_addr Ar address
-Allows a dynamic library to be built where the read-only and read-write segments are not contiguous. The address
+Allows a dynamic library to be built where the read-only and read-write segments are not contiguous. The address
specified is a hexadecimal number that indicates the base address for the read-only segments.
.It Fl segaddr Ar name Ar address
-Specifies the starting address of the segment named name to be address. The address must be a hexadecimal number
+Specifies the starting address of the segment named name to be address. The address must be a hexadecimal number
that is a multiple of 4K page size.
.It Fl seg_page_size Ar name Ar size
-Specifies the page size used by the specified segment. By default the page size is 4096 for all segments.
+Specifies the page size used by the specified segment. By default the page size is 4096 for all segments.
The linker will lay out segments such that size of a segment is always an even multiple of its page size.
.It Fl dylib_file Ar install_name:file_name
-Specifies that a dynamic shared library is in a different location than its standard location. Use this option
-when you link with a library that is dependent on a dynamic library, and the dynamic library is in a location other
-than its default location. install_name specifies the path where the library normally resides. file_name specifies
-the path of the library you want to use instead. For example, if you link to a library that depends upon the dynamic
-library libsys and you have libsys installed in a nondefault location, you would use this option:
+Specifies that a dynamic shared library is in a different location than its standard location. Use this option
+when you link with a library that is dependent on a dynamic library, and the dynamic library is in a location other
+than its default location. install_name specifies the path where the library normally resides. file_name specifies
+the path of the library you want to use instead. For example, if you link to a library that depends upon the dynamic
+library libsys and you have libsys installed in a nondefault location, you would use this option:
-dylib_file /lib/libsys_s.A.dylib:/me/lib/libsys_s.A.dylib.
.It Fl prebind
-The created output file will be in the prebound format. This was used in Mac OS X 10.3 and earlier to improve launch performance.
+The created output file will be in the prebound format. This was used in Mac OS X 10.3 and earlier to improve launch performance.
.It Fl weak_reference_mismatches Ar treatment
-Specifies what to do if a symbol is weak-imported in one object file but not weak-imported in another. The valid
+Specifies what to do if a symbol is weak-imported in one object file but not weak-imported in another. The valid
treatments are: error, weak, or non-weak. The default is non-weak.
.It Fl read_only_relocs Ar treatment
-Enables the use of relocations which will cause dyld to modify (copy-on-write) read-only pages. The compiler will
-normally never generate such code.
+Enables the use of relocations which will cause dyld to modify (copy-on-write) read-only pages. The compiler will
+normally never generate such code.
.It Fl force_cpusubtype_ALL
The is only applicable with -arch ppc. It tells the linker to ignore the PowerPC cpu requirements (e.g. G3, G4 or G5) encoded
in the object files and mark the resulting binary as runnable on any PowerPC cpu.
.It Fl no_arch_warnings
Suppresses warning messages about files that have the wrong architecture for the -arch flag
.It Fl arch_errors_fatal
-Turns into errors, warnings about files that have the wrong architecture for the -arch flag.
+Turns into errors, warnings about files that have the wrong architecture for the -arch flag.
.It Fl e Ar symbol_name
Specifies the entry point of a main executable. By default the entry name is "start" which is found in crt1.o which contains
the glue code need to set up and call main().
.It Fl w
Suppress all warning messages
.It Fl final_output Ar name
-Specifies the install name of a dylib if -install_name is not used. This option is used by gcc driver when it is invoked
-with multiple -arch arguments.
+Specifies the install name of a dylib if -install_name is not used. This option is used by gcc driver when it is invoked
+with multiple -arch arguments.
.It Fl arch_multiple
-Specifes that the linker should augment error and warning messages with the architecture name. This option is used by gcc
-driver when it is invoked with multiple -arch arguments.
+Specifes that the linker should augment error and warning messages with the architecture name. This option is used by gcc
+driver when it is invoked with multiple -arch arguments.
.It Fl twolevel_namespace_hints
-Specifies that hints should be added to the resulting binary that can help speed up runtime binding by dyld as long as the
+Specifies that hints should be added to the resulting binary that can help speed up runtime binding by dyld as long as the
libraries being linked against have not changed.
.It Fl dot Ar path
Create a file at the specified path containing a graph of symbol dependencies. The .dot file can be viewed in GraphViz.
.It Fl read_only_stubs
[i386 only] Makes the __IMPORT segment of a final linked images read-only. This option makes a program slightly more
secure in that the JMP instructions in the i386 fast stubs cannot be easily overwritten by malicious code. The downside
-is the dyld must use mprotect() to temporarily make the segment writable while it is binding the stubs.
+is the dyld must use mprotect() to temporarily make the segment writable while it is binding the stubs.
.It Fl slow_stubs
-[i386 only] Instead of using single JMP instruction stubs, the linker creates code in the __TEXT segment which
-calls through a lazy pointer in the __DATA segment.
+[i386 only] Instead of using single JMP instruction stubs, the linker creates code in the __TEXT segment which
+calls through a lazy pointer in the __DATA segment.
.It Fl interposable_list Ar filename
-The specified
-.Ar filename
+The specified
+.Ar filename
contains a list of global symbol names that should always be accessed indirectly. For instance, if libSystem.dylib
is linked such that _malloc is interposable, then calls to malloc() from within libSystem will go through a dyld
-stub and could potentially indirected to an alternate malloc. If libSystem.dylib were built without making _malloc
-interposable then if _malloc was interposed at runtime, calls to malloc from with libSystem would be missed
+stub and could potentially indirected to an alternate malloc. If libSystem.dylib were built without making _malloc
+interposable then if _malloc was interposed at runtime, calls to malloc from with libSystem would be missed
(not interposed) because they would be direct calls.
.It Fl no_function_starts
By default the linker creates a compress table of function start addresses in the LINKEDIT of
.It Fl object_path_lto Ar filename
When performing Link Time Optimization (LTO) and a temporary mach-o object file is needed, if this
option is used, the temporary file will be stored at the specified path and remain after the link
-is complete. Without the option, the linker picks a path and deletes the object file before the linker
+is complete. Without the option, the linker picks a path and deletes the object file before the linker
tool completes, thus tools such as the debugger or dsymutil will not be able to access the DWARF debug
info in the temporary object file.
.It Fl lto_library Ar path
When performing Link Time Optimization (LTO), the linker normally loads libLTO.dylib relative to the linker
binary (../lib/libLTO.dylib). This option allows the user to specify the path to a specific libLTO.dylib
to load instead.
+.It Fl cache_path_lto Ar path
+When performing Incremental Link Time Optimization (LTO), use this directory as a cache for incremental rebuild.
+.It Fl prune_interval_lto Ar seconds
+When performing Incremental Link Time Optimization (LTO), the cache will pruned after the specified interval.
+.It Fl prune_after_lto Ar seconds
+When pruning the cache for Incremental Link Time Optimization (LTO), the cache entries are removed after the
+specificied interval.
+.It Fl max_relative_cache_size_lto Ar percent
+When performing Incremental Link Time Optimization (LTO), the cache will be pruned to not go over this percentage
+of the free space. I.e. a value of 100 would indicate that the cache may fill the disk, and a value of 50 would
+indicate that the cache size will be kept under the free disk space.
.It Fl page_align_data_atoms
-During development, this option can be used to space out all global variables so each is on a separate page.
-This is useful when analyzing dirty and resident pages. The information can then be used to create an
+During development, this option can be used to space out all global variables so each is on a separate page.
+This is useful when analyzing dirty and resident pages. The information can then be used to create an
order file to cluster commonly used/dirty globals onto the same page(s).
.It Fl not_for_dyld_shared_cache
Normally, the linker will add extra info to dylibs with -install_name starting with /usr/lib or
.Ss Obsolete Options
.Bl -tag
.It Fl segalign Ar value
-All segments must be page aligned.
+All segments must be page aligned.
.It Fl seglinkedit
Object files (MH_OBJECT) with a LINKEDIT segment are no longer supported. This option is obsolete.
.It Fl noseglinkedit
LD_PREBIND is no longer supported as a way to force on prebinding, so there no longer needs to
be a command line way to override LD_PREBIND. This option is obsolete.
.It Fl sect_diff_relocs Ar treatment
-This option was an attempt to warn about linking .o files compiled without -mdynamic-no-pic into
+This option was an attempt to warn about linking .o files compiled without -mdynamic-no-pic into
a main executable, but the false positive rate generated too much noise to make the option useful.
This option is obsolete.
.It Fl run_init_lazily
This option was removed in Mac OS X 10.2.
.It Fl single_module
-This is now the default so does not need to be specified.
+This is now the default so does not need to be specified.
.It Fl multi_module
Multi-modules in dynamic libraries have been ignored at runtime since Mac OS X 10.4.0. This option is obsolete.
.It Fl no_dead_strip_inits_and_terms
.It Fl b
Used with -A option to strip base file's symbols. This option is obsolete.
..It Fl M
-Obsolete option to produce a load map. Use -map option instead.
+Obsolete option to produce a load map. Use -map option instead.
.It Fl Sn
Don't strip any symbols. This is the default. This option is obsolete.
.It Fl Si
.It Fl X
Strip local symbols that begin with 'L'. This is the default. This option is obsolete.
.It Fl s
-Completely strip the output, including removing the symbol table. This file format variant is no longer supported.
+Completely strip the output, including removing the symbol table. This file format variant is no longer supported.
This option is obsolete.
.It Fl m
Don't treat multiple definitions as an error. This is no longer supported. This option is obsolete.
.It Fl y Ns symbol
-Display each file in which
+Display each file in which
.Ar symbol
is used. This was previously used to debug where an undefined symbol was used, but the linker now
-automatically prints out all usages. The -why_live option can also be used to display what kept
+automatically prints out all usages. The -why_live option can also be used to display what kept
a symbol from being dead striped. This option is obsolete.
.It Fl Y Ar number
Used to control how many occurrences of each symbol specified with -y would be shown. This option is obsolete.
Previously provided a way to warn or error if any of the symbol definitions in the output file matched any
definitions in dynamic library being linked. This option is obsolete.
.It Fl multiply_defined Ar treatment
-Previously provided a way to warn or error if any of the symbols used from a dynamic library were also
+Previously provided a way to warn or error if any of the symbols used from a dynamic library were also
available in another linked dynamic library. This option is obsolete.
.It Fl private_bundle
-Previously prevented errors when -flat_namespace, -bundle, and -bundle_loader were used and the bundle
+Previously prevented errors when -flat_namespace, -bundle, and -bundle_loader were used and the bundle
contained a definition that conflicted with a symbol in the main executable. The linker no longer
errors on such conflicts. This option is obsolete.
.It Fl noall_load
This is the default. This option is obsolete.
.It Fl seg_addr_table_filename Ar path
-Use
+Use
.Ar path
instead of the install name of the library for matching an entry in the seg_addr_table. This option is obsolete.
.It Fl sectorder Ar segname sectname orderfile
Replaced by more general -order_file option.
.It Fl sectorder_detail
-Produced extra logging about which entries from a sectorder entries were used. Replaced by -order_file_statistics.
-This option is obsolete.
+Produced extra logging about which entries from a sectorder entries were used. Replaced by -order_file_statistics.
+This option is obsolete.
.El
.Sh SEE ALSO
as(1), ar(1), cc(1), nm(1), otool(1) lipo(1),