Таким образом, вы загружаете разделяемую библиотеку непосредственно перед временем выполнения и добавляете символы (т.е. функции), которые она предоставляет, в глобальную таблицу смещений.
Что происходит, когда вы вызываете функцию, которую она предоставляет? Поскольку вы уже скомпилировали свой код, функция должна была указывать куда-то уже.