Не динамическое связывание c означает, что когда я запускаю исполняемый файл, используя ./executable_name, тогда, если компоновщик не может найти файл .so, от которого зависит исполняемый файл, он должен создать sh?
Это будет sh. Время cra sh зависит от того, как вы вызываете определенную экспортируемую функцию из файла .so. Вы можете получить все экспортированные функции через указатели на функции самостоятельно, используя dlopen
dlysm
и co. В этом случае программа выполнит обработку sh при первом вызове, если она не найдет экспортируемый метод.
В случае, если исполняемый файл просто вызывает экспортированный метод из общего объекта (часть его заголовка), Линкер Dynami c использует информацию о методе, который будет вызван в его исполняемом файле (см. второй ответ), и аварийно завершает работу в случае невозможности найти библиотеку или несоответствие символов.
Что на самом деле является Dynami c связывание, если все ссылки на внешние объекты разрешены при сборке? Это какая-то предварительная проверка, выполняемая динамическим компоновщиком c? Иначе, динамический c компоновщик может использовать LD_LIBRARY_PATH для получения дополнительных библиотек для разрешения неопределенных символов.
Вам необходимо различать фактическое связывание и соединение Dynami c. Начиная с фактического связывания: В случае связывания библиотеки stati c, фактическое связывание будет копировать весь код из метода, который будет вызываться внутри исполняемого файла / библиотеки, используя его. При связывании библиотеки Dynami c вы не будете копировать код, а только символы. Символы содержат смещения или другую информацию, указывающую на фактический код в библиотеке Dynami c. Если исполняемый файл вызывает метод, который не экспортируется динамической библиотекой c, он все равно потерпит неудачу в фактической части связывания.
Теперь при запуске исполняемого файла ОС в какой-то момент попытается загрузите общий объект в память, в которой фактически находится код. Если он не находит его или также не может быть изменен (т. е. исполняемый файл был связан с библиотекой, использующей другой экспорт), он все равно может потерпеть неудачу во время выполнения.