Continued from C++ shared library

Let’s see the symbols as reported by nm in liba.so and exec. Removing the extra symbols that are there for initialisation and all. Running nm -C <file>

a.cpp:

void f() {}
static void g() {}
void h();
 
void foo() { h(); }

For a.o:

0000000000000000 T f()
                 U h()
000000000000000e T foo()
0000000000000007 t g()

For liba.so:

0000000000001109 T f()
                 U h()
0000000000001117 T foo()
0000000000001110 t g()

b.cpp:

void f();
void h() {}
 
int main() {
	f();
}

For exec:

0000000000001140 T main
                 U f()
0000000000001139 T h()

Observations in liba.so and `a.o:

  • “T”: There are 2 strong symbols, f() and foo(). These are global symbols, and can be referenced by other modules being linked too.
  • “t”: There is a an internal symbol, g(). This is a static function and won’t be visible to other modules
  • “U”: There is an undefined symbol h(). This function has to be present in the final linking otherwise we’ll get an undefined symbol error.

Observations in exec:

  • This has the strong symbol h(). This function will be used by the shared library
  • Undefined symbol f(), this is provided by the shared library.

NOTE: Since g() is static and unused, enabling optimisations in creating a.o removes the symbol g(). See C++ static function (a)