@beduin01

Как происходит линковка приложений?

Я прочитал ряд материалов про линковку, но тем не менее остались некоторые вопросы.
Как я понял у большинства языков есть такая штука как runtime, которая отвечает за инициализацию кода, выделение памяти, обработку ошибок и тд.

Вся эта информация вшивается в бинарик каждого приложения после компиляции.

Вопросы следующие:
1. Как я понял экспорт рантайма можно сделать только из специальных библиотек типа msvcr120
2. Есть много версий библиотек рантайма, но совершенно непонятно чем они отличаются
3. Какая именно информация вшита в тот же msvcr120.dll это какая-то таблица экспорта, которая есть только в специальных библиотеках и из библиотеки foo.dll ее взять нельзя?
4. Можно ли статически слинковаться с dll ? Т.е. сделать так, чтобы либу не нужно было с собой таскать.
5. Какой оверхэд добавляет рантайм Си?
  • Вопрос задан
  • 793 просмотра
Пригласить эксперта
Ответы на вопрос 2
@xandox
runime - это по сути просто стандартная библиотека. Прослойка между вашим кодом и ABI системы. Как и любой другой код он может быть как статический так и динамический. У статического и динамического runtime-а свои плюсы и минусы.
Приведу некоторые из них
У статического
+ Нет зависимостей, все что нужно исполняемому файлу - только операционная система.
+ Как следствие предыдущего пункта, ОС что бы его запустить нужно прочитать с диска и инициализировать только один файл. Потенциально может ускорить запуск приложения.
- Размер файла сильно возрастает
- Использование dll (ну если вдруг захочется плагины, например, к себе прикрутить) сильно усложняется. Надо быть довольно осторожным.

У динамического
+ Размер файла не распухает
+ Рантайм делиться со всеми загруженными dll, по сути присутсвует в единственом экземпляре.
+ Работать с dll становиться немного проще.
- Что бы хоть чего-нибудь запустилось - нужно позаботиться о том, что на машине установлен нужный вам рантайм, что усложняет процесс доставки конечного продукта до пользователя. По сути уже нужно делать инсталер.
- Нужно следить, что все динамические библиотеки которые используется в приложение были собраны с нужным рантаймомо. Это не всегда тривиально.

Теперь про вопросы.
1) Нет. msvcr120.dll - это просто рантайм от VS2012, у VS2015 будет что-то msvcr140.dll. У gcc - что-то еще. Как я уже говорил, runtime - это просто код, который нужно куда-то положить. И у каждого поставщика стандартной библиотеки он свой.
2) Да это правда. Основное отличие - это поддержка стандартов и расширений. VS2010 от с++11 поддерживала совсем ничего, а вот VS2015 уже поддерживает c++11/14 и немного 17 (ну с оговорками на MS и о том как они поддерживают стандарты). Это тоже код и его куда-то нужно положить. Плюс, довольно распростроненная проблема - это ABI. Порядок полей в классах (например), который никак не оговаривается стандартом, делает бинарные реализации не совместимыми, если порядок не совпадает (если сильно по простому).
3) Там лежит стандартная библиотека.
4) Нет, на то она и dll. Но как правило многие библиотеки распространяются в двух видах - динамическая линковка + статическая. Или если это opensource всегда можно для себя собрать статичскеую библиотеку для того что бы статически слинковаться.
5) Конечно, что-то добавляет. Runtime C++ добавляет еще больше. Плюс надо понимать, что еще есть runtime для OC, который позволяет вызвать ее функции как функции, а не через прерывания или еще как. Теоретически можно работать без всего этого добра, но будет грустно.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
1.обычно у каждого компилятора свой runtime. Для VC - это разные версии msvcrt.dll.
2.Читайте на сайте разработчика компилятора. В основном это не сильно принципиально, разве что вы используете какие-то специфические плюшки, которые не описаны в стандарте, но есть в конкретном компиляторе и его стандартной библиотеке.
3.runtime - это как правило стандартная библиотека + точка входа и завершения программы (а ваш main вызывается уже из runtime).
4.Можно. Обычно стандартная библиотека поставляется как в виде динамической библиотеки, так и статической. Выбор какую использовать за вами, задается опциями компилятора.
5.Не большой. Но тут лучше говорить не про оверхед, а про "написание программы на чистом" WinAPI/POSIX и других OS API. На сколько это трудозатратней по сравнению с использованием стандартной библиотеки.
По собственному опыту скажу, что написание на чистом WinAPI довольно трудозатратное (и время затратное) занятие, затратнее примерно в 1.5 по сравнению использованием stdlib. Но у меня это был первый и пока единственный опыт, дальше, видимо должно быть проще.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы