В общем случае компоновщик будет использовать только то, что ему нужно. После того, как фанат превратил ваш исходный код в объектный файл, он обрабатывается почти так же, как и все другие объектные файлы. У вас есть:
- пускового код C, который подготавливает среду исполнения (устанавливает ARGV, ARGV и так далее), а затем называют свой
main
или эквивалент.
- ваш код сам.
- любые объектные файлы необходимо перетаскивать из библиотек (динамическое связывание - это особый случай связывания, который происходит во время выполнения, и я не буду об этом рассказывать, так как вы специально задали вопрос о статической привязке).
Компонент будет содержать все объектные файлы, которые вы явно указываете (если только это не является особенно умным компоновщиком и может сказать, что вы не используете объектный файл).
С библиотеками это немного отличается. В принципе, вы начинаете со списка неразрешенных символов (например, cout
). Компилятор будет искать все объектные файлы во всех указанных вами библиотеках, и, когда он найдет объектный файл, который удовлетворяет этому символу, он перетащит его и зафиксирует ссылки на символы.
Это может, конечно, добавить даже более неразрешенные символы, если, например, есть что-то в объектный файл, который зависит от функции C printf
(маловероятно, но возможно).
Линкера продолжается так, пока все символы не будут удовлетворены (когда он предоставит вам исполняемый файл), или вы не можете быть удовлетворены (когда вы горько жалуетесь на ваши методы кодирования).
Что касается исполняемого файла, это может быть вся библиотека iostream, или она может быть минимальной, необходимой для выполнения заданий. Обычно это зависит от количества объектных файлов, в которые была встроена библиотека iostream.
Я видел код, в котором вся подсистема попала в один объектный файл, так что если вы хотите просто использовать один крошечный бит, у вас все еще есть партия. В качестве альтернативы вы можете поместить каждую отдельную функцию в свой собственный объектный файл, и компоновщик, вероятно, создаст исполняемый файл как можно меньше.
Есть варианты компоновщика, который может создать карту ссылок, которая покажет вам, как организованы вещи. Вероятно, вы, скорее всего, не увидите его, если используете IDE, но он будет глубоко погружен в диалоговые окна параметров компиляции в MSVC.
И, с точки зрения вашего добавленным комментарий, код:
cout << "hello";
будет вполне возможно привести в значительных кусков как iostream и код обработки строки.
Какой компилятор? Какая операционная система? Какие параметры для компилятора и компоновщика? – bmargulies
cl.exe/EHsc hello.cpp это компилятор vc. 96 Кбайт по-прежнему большой, считают, что у меня есть только два утверждения: cout << «привет»; return 0; – Stone
Кто-то должен дать ему команду для дизассемблера на этой платформе. – Potatoswatter