Procedure calls inside a shared library are typically made through small procedure linkage table stubs, which then call the definitive function.
Data references from position-independent code are usually made indirectly, through global offset tables (GOTs), which store the addresses of all accessed global variables.