Динамическое связывание - это привязка интерфейса к его реализации во время выполнения - любая ситуация, когда программа автоматически решает, какой код вызывать в качестве реализации интерфейса. Таким образом, вообще говоря, 1) и 2) являются динамическим связыванием, но термин обычно используется только для 2).
Связывание по времени соединения (раннее связывание) противоположно динамическому связыванию (позднее связывание). При связывании во время компиляции компилятор / компоновщик точно знает, какой код вызывать, и создает прямой вызов этого кода. При динамическом связывании компилятор / компоновщик этого не знает - точная реализация определяется во время выполнения.