You have misunderstood the meaning of "linking". Or, thought of another way, you haven't realized it has two meanings.
If it helps, think of dyld
as the dynamic loader rather than "linker". dyld
is the program which loads the dynamic libraries referenced by an executable into the process's address space. It still involves linking because it requires the resolution of symbol references.
You never invoke dyld
as part of a build procedure. You always use ld
or, more typically, you ask the compiler to link your program and it invokes ld
on your behalf. dyld
is only used at run time.
You're incorrect when you assert that Linux doesn't have this distinction. Linux has a dynamic loader, ld.so
, which is distinct from the static linker, ld
.