В macOS 10.14.6 с Xcode 11.3 код в вопросе компилируется и связывается с помощью команды:
clang -Wl,-e, -Wl,__start <Name of Your Source File>
Полученный исполняемый файл работает. Однако, поскольку он обходит код запуска для среды C, не следует ожидать, что использование подпрограмм из библиотеки C или других функций C будет работать правильно.
Обратите внимание, что необходимы два подчеркивания before start
в приведенной выше команде, поскольку исходный код содержит одно и другое, добавляемое компилятором C. Если код был изменен на использование start
вместо _start
, то команда будет использовать одно подчеркивание:
clang -Wl,-e, -Wl,_start <Name of Your Source File>
Переключатели -Wl,-e, -Wl,_start
передают -e _start
компоновщику, который сообщает ему: используйте _start
в качестве адреса исходного кода для выполнения. Мне не понятно, почему это обходит загрузку по умолчанию объектного модуля C -run-time-startup, который также определяет _start
. Я бы предпочел использовать переключатель компоновщика, который говорит ему не загружать этот модуль, но я не нашел его на странице руководства для ld
. Эксперимент показывает, что по умолчанию ld
загружает объектный модуль по умолчанию и ссылается на main
, что приводит к ошибке соединения, но, когда используется -e _start
, компоновщик устанавливает символ программы _start
как адрес запуска и не загружает объектный модуль по умолчанию.