В некоторых системах объектный файл - это просто набор данных, символов и точек исправления.Объектный файл сообщит компоновщику, что этот байт 574 связанного кода должен быть исправлен так, чтобы он содержал MSB разницы между символами Foo и Bar, и компоновщик сделает это, но компоновщик не имеет понятия о значении за пределами спискавычисления, которые нужно выполнить.
В некоторых других системах компоновщик может быть гораздо более вовлечен в генерацию кода.Например, некоторые процессоры ARM могут выполнять код, который закодирован с использованием 16-битного или 32-битного набора команд.Некоторые типы кода могут эффективно выполняться только с использованием набора 32-битных команд;некоторые будут работать адекватно, но будут более компактными, используя 16-битный набор.Компоновщик ARM знает, какие подпрограммы написаны с использованием каждого набора инструкций, и если код, написанный с использованием одного набора инструкций, пытается вызвать функцию, написанную с использованием другого, компоновщик сгенерирует метод-оболочку, называемый «veneer», и получит первый вызов функции, который,Затем фанера выполнит операции, необходимые для вызова другого метода.Несмотря на то, что фанер - это «код», он полностью генерируется компоновщиком.
На самом деле нет фиксированного разделения труда между компиляторами и компоновщиками.Я видел некоторые системы, в которых «компилятор» переводит программу в «промежуточную» форму, а компоновщик выполняет всю генерацию реального кода и выполняет оптимизацию в зависимости от того, где что-то находится в памяти.Как уже отмечалось, есть другие, где компоновщик - не что иное, как «процессор исправлений».Вероятно, любое мыслимое разделение труда между этими крайностями, возможно, где-то существует.