Позднее (AKA Dynamic) Привязка не имеет ничего общего с динамически загружаемыми модулями (что и есть dlopen и dlsym) сама по себе.Вместо этого речь идет о задержке принятия решения о том, какая функция вызывается до времени выполнения.
В C это делается с помощью указателей функций (что также фактически делает любая реализация C ++ для виртуальных функций).
Один из способов эмулировать это - передавать структуры указателей функций, а затем вызывать функции только через заданные указатели функций.
Пример:
typedef struct Animal {
void (*sayHello)(struct Animal *a, const char *name);
} Animal;
static void sayQuakQuak( Animal *a, const char *name ) {
printf( "Quak quak %s, says the duck at 0x%x!\n", name, a );
}
/* This function uses late binding via function pointer. */
void showGreeting( Animal *a, const char *name ) {
a->sayHello( a, name );
}
int main() {
struct Animal duck = {
&sayQuakQuak
};
showGreeting( &duck, "John" );
return 0;
}