macosclangdyliblibsystem

Where is printf defined?


I've compiled a simple c program that uses printf and ran otool -l on the binary. In it /usr/lib/libSystem.B.dylib is mentioned in the LC_LOAD_DYLIB command. But when I do nm -a /usr/lib/libSystem.B.dylib to list the symbols in that lib I do not find printf. Where is it defined then?


Solution

  • First, otool -L is a simpler way to see the list of libraries that an executable links to.

    Second, if you apply otool -L to libSystem.B.dylib, you'll see that it, in turn, depends on a bunch of libraries in /usr/lib/system. One of those is libsystem_c.dylib, which is the C library. That defines printf.

    Going back to otool -l output for libSystem.B.dylib, you'll see that those dependencies are via the LC_REEXPORT_DYLIB load command. That's how the symbols in the other libraries are exported without actual symbol table entries for them.

    I guess, arguably, it's a bug in nm that it doesn't show reexported symbols.