Symbol table for C functions

I’ve a doubt about C functions “symbol table” in iOS: basically from what I understood from (firmware) embedded programming, when I write something like func(); (a call to a function in my source code), the compiler compiles this to a jump to a placeholder address that will be resolved later by the linker in the linking process. Once the linking is ended we have the binary ready and each addresses resolved. So, here I guess that the symbol table is not even present in the binary, and calls are just plain jumps to the actual implementations.

Now, talking about iOS, I understand that Objective-C methods uses messages to talk each other, and the runtime resolves the selector name looking up the symbol table. And swizzling is as simple as change the address mapped to the selector name.

But what about C functions calls in iOS: I guess for C calls to my own C code, is the same as firmware is (resolved by the linker at compile time, statically). But what about shared library? Why they needs symbol table? Aren’t they just jumps to addresses? How does actually works the address resolution? I mean the all process from when the func(); function is going to be called to when the function is been called…? Is there a runtime linker even for c functions? How does it work?

Any clarification is appreciated :smile: