Действительно ли llvm-gcc и лязг двоичные совместимый с gcc? - особенно mingw gcc в Windows

Если я создам статическую библиотеку с llvm-gcc, то свяжу его с программой, скомпилированной с помощью mingw gcc, то результат будет работать?

То же для других комбинаций llvm-gcc, лязгайте и нормальный gcc. Я интересуюсь тем, как это удается на Linux (использующий нормальный non-mingw gcc, конечно) и другие платформы также, но акцент находится в Windows.

Я также интересуюсь всеми языками, но с сильным акцентом на C и C++ - очевидно, лязгают, не поддерживает Фортран и т.д., но я полагаю, что llvm-gcc делает.

Я предполагаю, что они все используют формат файла ELF, но что относительно конвенций вызова, виртуальные сервировки и т.д.?

27
задан Steve314 10 July 2010 в 01:55
поделиться

3 ответа

Извините - я возвращался к llvm после перерыва, и никогда не делал больше, чем учебник. В первый раз я вроде как перегорел после того, как с трудом заставил LLVM 2.6 собираться на MinGW GCC - к счастью, с LLVM 2.7 проблем не возникло.

Просматривая сегодня учебник снова, я заметил в главе 5 учебника не только четкое утверждение, что LLVM использует ABI (Application Binary Interface) платформы, но и то, что компилятор учебника зависит от этого, чтобы обеспечить доступ к внешним функциям, таким как sin и cos.

Однако я до сих пор не знаю, распространяется ли совместимый ABI на C++. Это не столько вопрос соглашений о вызовах, сколько вопрос объединения имен, расположения структур и vtable.

Для большинства вещей достаточно иметь возможность делать вызовы функций C, но есть еще несколько вопросов, в которых мне важен C++.

1
ответ дан 28 November 2019 в 05:46
поделиться

Надеюсь, они исправили это, но я избегаю llvm-gcc, потому что я (также) использую llvm в качестве кросс-компилятора, и когда вы используете llvm-gcc -m32 на 64-битной машине, -m32 игнорируется и вы получите 64-битные целые числа, которые нужно подделать на вашей 32-битной целевой машине. У Clang нет этой ошибки, как и у gcc. Кроме того, чем больше я использую clang, тем больше мне нравится. Что касается вашего прямого вопроса, не знаю, теоретически в наши дни цели хорошо известны или используют соглашения о вызовах. И вы могли бы надеяться, что и gcc, и llvm соответствуют одному и тому же, но вы никогда не знаете. Самый простой способ выяснить это - написать пару простых функций, скомпилировать и дизассемблировать, используя оба набора инструментов, и посмотреть, как они передают операнды функциям.

-2
ответ дан 28 November 2019 в 05:46
поделиться

Я не знаю ответа, но слайд 10 в этой презентации, похоже, подразумевает, что файлы ".o", создаваемые llvmgcc, содержат байткод LLVM (.bc) вместо обычного объектного кода, специфичного для конкретной цели, так что возможна оптимизация при компоновке. Однако компоновщик LLVM должен уметь компоновать LLVM-код с кодом, созданным "обычным" GCC, как сказано на следующем слайде: "компонуйте родные .o файлы и библиотеки здесь".

LLVM - это инструмент Linux, я иногда обнаруживал, что компиляторы Linux не совсем корректно работают в Windows. Мне было бы интересно узнать, получится ли у вас это или нет.

2
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: