Соглашение о вызовах обрабатывается компилятором или компоновщиком? - PullRequest
1 голос
/ 05 мая 2011

Когда мы помещаем _stdcall (вызывающему не требуется очищать стек) в прототип функции, об этом заботится компилятор или компоновщик?

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Соглашение о вызовах равно , как вызывать функцию (конкретный машинный код для подготовки параметров и очистки ctack), а компоновщик имеет дело с , какую функцию (функцию по какому адресу) вызывать .

Таким образом, обычно компилятор генерирует правильный код и оставляет «заполнители» для точных адресов функций, а компоновщик помещает туда реальные адреса. Тем не менее, существует так называемая генерация кода времени компоновки , где оба выполняются компоновщиком.

1 голос
/ 05 мая 2011

Соглашение о вызовах влияет на генерацию кода, поэтому с ним работает компилятор.Компоновщик не должен знать об этом.

0 голосов
/ 06 декабря 2013

В некоторых системах объектный файл - это просто набор данных, символов и точек исправления.Объектный файл сообщит компоновщику, что этот байт 574 связанного кода должен быть исправлен так, чтобы он содержал MSB разницы между символами Foo и Bar, и компоновщик сделает это, но компоновщик не имеет понятия о значении за пределами спискавычисления, которые нужно выполнить.

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

На самом деле нет фиксированного разделения труда между компиляторами и компоновщиками.Я видел некоторые системы, в которых «компилятор» переводит программу в «промежуточную» форму, а компоновщик выполняет всю генерацию реального кода и выполняет оптимизацию в зависимости от того, где что-то находится в памяти.Как уже отмечалось, есть другие, где компоновщик - не что иное, как «процессор исправлений».Вероятно, любое мыслимое разделение труда между этими крайностями, возможно, где-то существует.

...