Когда говорится, что при динамическом линковании компоновщик разрешает адреса разделяемых библиотек во время выполнения, означает ли это, что тот же компоновщик, который используется в статическом компоновщике, вызывается во время выполнения? Например, при использовании gcc, такого как gcc mysource.c -o myprog , пропускает ли этап связывания, если используется динамическое связывание? Если используется динамическое связывание, вызывается ли один и тот же компоновщик gcc каждый раз, когда запускается программа, или этот компоновщик каким-то образом отличается (т.е. поставляется с операционной системой)?

Если используется динамическое связывание, а технически связывание еще не произошло, когда выводится исполняемый файл, почему этот файл является исполняемым (поскольку он пропустил этап связывания)? Или это не действительно исполняемый файл, пока не произойдет динамическое связывание?

1 ответ1

1

"Исполняемый" означает только "может быть загружен загрузчиком". Это загрузчик, который отвечает за динамическое связывание. Компоновщик во время компиляции записывает в заголовок исполняемого файла информацию о том, какие библиотеки и символы используются, а загрузчик считывает эту информацию для выполнения связывания.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .