По сути, динамическое связывание означает, что адрес для вызова функции не жестко закодирован в сегмент кода вашей программы при переводе на ассемблер, а вместо этого получен из другого места, то есть из переменных стека, поиска в массиве и т. Д.
На более высоком уровне, если у вас есть строка кода:
foo(bar) //Calls a funciton
Если во время компиляции можно точно знать, какую функцию он будет вызывать, это статическое связывание. Если foo может означать несколько функций в зависимости от того, что невозможно узнать во время компиляции, это динамическое связывание.