Неопределенная ссылка на main() из-за несоответствия сигнатур при компиляции с использованием Clang-6.0 с -ffreestanding

Я занимаюсь разработкой ядра ОС как хобби, и у меня уже есть библиотека, которая заменяет стандартную библиотеку как в размещенной, так и в автономной среде. Естественно, это обеспечивает точку входа, которая делает необходимые настройки и звонки main(),

В размещенной среде кажется, что это не имеет значения, если подписи main() декларация и в фактическом main() определение не совсем соответствует. Однако, как только я добавлю -ffreestanding флаг компиляции, компоновщик больше не может разрешить такую ​​ссылку. Смотрите минимальный пример ниже:

start.cpp

int main(int argc, char *argv[], char *envp[]);

extern "C" void _start()
{
    main(0, nullptr, nullptr);
}

main.cpp

int main()
{
    return 0;
}

Командная строка:

clang++-6.0 -nostdlib -ffreestanding start.cpp main.cpp

Кажется, что это поведение специфично для Clang, поскольку GCC 7.3.0 успешно компилирует этот пример.

Мой вопрос заключается в том, как приведенный выше пример разрешен и работает в целом, и является ли проблема, с которой я сталкиваюсь, ошибкой Clang.


Обновление 1:

Оказалось, что решением этой проблемы является добавление __attribute__((weak)) к декларации main(), Однако было бы неплохо, если бы кто-то мог объяснить более подробно, как это обычно работает с main(),

Обновление 2:

Видимо маркировка main() так как слабый символ позволяет связать без main() на все, что, очевидно, не так, как это обычно работает (учитывая все другие "неопределенные ссылки на основные" вопросы по SO). Так что если main() обычно не является слабым символом, как это действительно работает?

Обновление 3:

Оказывается, что слабый символ не является решением вообще, потому что при использовании с -ffreestanding это только скрывает тот факт, что int main(int argc, char *argv[], char *envp[]) никогда не решается и фактическое int main() не вызывается из _start() совсем. В размещенной среде, однако это все еще называют как обычно. Это все больше и больше похоже на ошибку Clang.

0 ответов

Другие вопросы по тегам