Цитата Сообщение от captain cobalt
Пусть есть уже написанная функция. У неё есть вручную прописанная сигнатура. При компиляции хэш сигнатуры попадает в таблицу экспорта.

Теперь мы хотим воспользоваться этой функцией из другого модуля. Делаем мы это только по имени. При компиляции хэш сигнатуры из упомянутой таблицы экспорта просто копируется в таблицу импорта этого нового модуля. Чтобы компоновщик проверял на равенство. Вот и всё.
с этого момента поподробнее:
1. у нас есть библиотека xyz.lib
2. у нее в таблице экспорта есть функция get_scr_addr@r_v_q

3. пишем программу которая эту функцию должна звать:
----------
require 'xyz.lib'

ld a, 5
call xyz.get_scr_addr
----------
если мифический компилятор просто будет искать в таблице экспорта библиотеки функцию начинающуюся с get_scr_addr@ и прописывать ее полное имя в таблице импорта программы то это ничего не дает кроме тех случаев когда мы сильно поменяли интерфейс данной конкретной функции. а интерфейс - это святое! если мы начинаем его постояноо менять то это уже нельзя назвать библиотекой.

причем если мы добавили в новую версию библиотеки функцию инициализации которая ДОЛЖНА вызываться первой, и пользователь об этом не знал/забыл то все эти сигнатуры не помогут. и линкер без ошибок все слинкует
Цитата Сообщение от captain cobalt
Версия это слишком грубо.
Линуксоиды это знают. Когда есть совместимая библиотека, но другой версии, с которой новый софт не собирается
однако и на винде (activex, .net) и на линуксе используются именно версии библиотеки. обычно есть minor и major версии. и софт не будет собираться если поменялась major версия, но смена мажорной версии как-раз и говорит о том что совместимости нет. если поменялась минорная версия, то как правило все собирается