crt0.o и crt1.o В чем разница?

Недавно я пытался отлаживать низкоуровневую работу и не смог найти crt0.S для компилятора (avr-gcc), но я нашел crt1.S (и то же самое с соответствующими файлами .o).

В чем разница между этими двумя файлами? crt1 это что-то совсем другое или что? Они оба, похоже, связаны с чем-то для «загрузки» (настройка stack frame и т. д.), но почему различие?


person Earlz    schedule 25.04.2010    source источник


Ответы (1)


Оба crt0/crt1 делают одно и то же, в основном делают то, что необходимо перед вызовом main() (например, инициализируют стек, устанавливают irqs и т. д.). Вы должны связываться с одним или другим, но не с обоими. На самом деле это не библиотеки, а встроенный ассемблерный код.

Насколько я понимаю, crt бывает двух "разновидностей"

  • crt1 используется в системах, поддерживающих конструкторы и деструкторы (функции, вызываемые до и после main и exit). В этом случае main обрабатывается как обычный вызов функции.
  • crt0 используется в системах, не поддерживающих конструкторы/деструкторы.
person kriss    schedule 27.04.2010
comment
Что именно представляют собой эти конструкторы/деструкторы? Это связано с C++ или чем-то другим? В моем ответе здесь он работал без crtbeginT.o и crtend.o, которые являются конструкторами и деструкторами. - person Z boson; 22.10.2014
comment
Я написал это в своем ответе. Нет, это не (напрямую) связано с С++. Это функции, которые нужно вызывать до main и после окончания программы. Это связано с ОС, на которой работает программа. Но я не лучший человек, чтобы рассказать об этом (никогда не писал такие функции, это делали другие), и это, вероятно, заслуживает отдельного ответа. - person kriss; 25.10.2014
comment
@kris, спасибо за ответ. Я увидел это только сейчас, потому что ты не использовал @zboson. Деструктор действительно вызывается после выхода? - person Z boson; 14.11.2014