Why Xcode 7 shows .tbd instead of .dylib?
Master System Design with Codemia
Enhance your system design skills with over 120 practice problems, detailed solutions, and hands-on exercises.
Introduction
Starting with Xcode 7, many SDK library references appear as .tbd files instead of .dylib binaries. That change surprises developers because it looks as if Apple removed the real dynamic libraries. What actually changed is the link-time representation: Xcode now uses text-based stub files that describe the library interface without shipping the full binary in the SDK.
What a .tbd File Represents
.tbd stands for text-based stub description. It is not the runtime library itself. It is a compact file that tells the linker what symbols and install name a system library provides.
The actual shared library still exists on the target operating system. The stub exists so your build can link against the interface without carrying the full binary inside the developer SDK.
That is why you might see:
- '
libz.tbd' - '
libsqlite3.tbd' - '
libc++.tbd'
instead of the older .dylib references in Xcode's SDK directories.
Why Apple Switched From .dylib to .tbd
There are several practical reasons for the change:
- SDKs become smaller because they no longer need to include many full binaries
- the linker only needs symbol and metadata information at build time
- Apple can keep SDK packaging simpler across platforms and simulator/device combinations
From the application's perspective, nothing magical happened. Your app still links against system libraries and loads the real binaries at runtime on macOS or iOS.
What the Stub Looks Like
A .tbd file is a text format, so it can be inspected directly:
The details vary, but the important parts are:
- supported architectures
- target platform
- install name of the real library
- exported symbols needed by the linker
That is enough for link-time resolution.
Why This Does Not Break Runtime Linking
The linker uses the stub while building your app. At runtime, the operating system loader resolves the install name to the real dynamic library present on the device or system image.
So seeing .tbd in Xcode does not mean your application will load a text file at runtime. The stub is only a development-time artifact.
Inspecting a Library Reference
If you want to confirm what a stub points to, you can inspect it from the command line:
You can also inspect your built binary to see what install names it expects:
The second command is useful because it shows the runtime dependency names after linking, which makes the relationship between the stub and the real library easier to understand.
When Developers Usually Notice the Change
This difference becomes visible when:
- browsing SDK folders manually
- migrating build scripts from older Xcode releases
- comparing tutorials that mention
.dylibpaths - troubleshooting linker errors and inspecting library references
Most projects do not need any special handling. The build system already understands .tbd files.
Common Pitfalls
- Assuming
.tbdreplaced dynamic libraries at runtime rather than only at link time. - Hard-coding old
.dylibSDK paths in custom build scripts. - Treating stub files as broken libraries because they are plain text.
- Confusing the SDK view of a library with the runtime copy provided by the operating system.
- Editing system stubs manually instead of fixing the build configuration that references them.
Summary
- '
.tbdfiles are text-based stub descriptions used by the linker.' - They replaced many SDK
.dylibreferences in Xcode 7 to reduce SDK size and simplify packaging. - The real dynamic libraries still exist on the target system at runtime.
- A stub contains interface metadata such as install name and exported symbols.
- In most cases, seeing
.tbdis normal and not a sign of a broken Apple SDK.

