installed gcc linker llvm clang llvm-gcc

installed - ¿Son compatibles llvm-gcc y clang binary con gcc?-particularmente mingw gcc en Windows



clang vs gcc (5)

Si construyo una biblioteca estática con llvm-gcc, luego la vinculo con un programa compilado usando mingw gcc, ¿funcionará el resultado?

Lo mismo para otras combinaciones de llvm-gcc, clang y normal gcc. Estoy interesado en cómo funciona esto en Linux (por supuesto, usando gcc normal no mingw) y otras plataformas, pero el énfasis está en Windows.

También estoy interesado en todos los idiomas, pero con un fuerte énfasis en C y C ++: obviamente clang no es compatible con Fortran, etc., pero creo que llvm-gcc sí lo hace.

Supongo que todos utilizan el formato de archivo ELF, pero ¿qué pasa con las convenciones de llamadas, diseños de tablas virtuales, etc.?


Lo siento, volvía a llvm después de un descanso y nunca he hecho mucho más que el tutorial. La primera vez, me quemé después de la lucha para lograr que LLVM 2.6 se basara en MinGW GCC; afortunadamente no es un problema con LLVM 2.7.

Al revisar el tutorial nuevamente hoy, noté en el Capítulo 5 del tutorial no solo una declaración clara de que LLVM usa la ABI (Interfaz Binaria de la Aplicación) de la plataforma, sino que el compilador del tutorial depende de esto para permitir el acceso a funciones externas como pecado y cos.

Sin embargo, aún no sé si el ABI compatible se extiende a C ++. Eso no es un problema de convenciones de llamada, sino de manipulación de nombres, diseño estructurado y diseño vtable.

Ser capaz de hacer llamadas a la función C es suficiente para la mayoría de las cosas, todavía hay algunos problemas en los que me preocupo por C ++.


No conozco la respuesta, pero la diapositiva 10 en esta presentación parece implicar que los archivos ".o" producidos por llvmgcc contienen el bytecode LLVM (.bc) en lugar del código de objeto específico del destino habitual, por lo que la optimización del tiempo de enlace es posible. Sin embargo, el enlazador LLVM debería poder vincular el código LLVM con el código producido por el GCC "normal", ya que la siguiente diapositiva dice "enlace en los archivos .o nativos y las bibliotecas aquí".

LLVM es una herramienta de Linux, a veces he encontrado que los compiladores de Linux no funcionan bien en Windows. Me gustaría saber si lo haces funcionar o no.


Ojalá lo hayan solucionado, pero evito llvm-gcc porque (también) uso llvm como compilador cruzado y cuando usas llvm-gcc -m32 en una máquina de 64 bits, se ignora el -m32 y obtienes una entrada de 64 bits. falsificado en su máquina de destino de 32 bits. Clang no tiene ese error ni gcc. Además, cuanto más uso clang más me gusta. En cuanto a su pregunta directa, no lo sé, en teoría en estos días los objetivos tienen convenciones de llamadas bien conocidas o utilizadas. Y esperaría que tanto gcc como llvm se ajusten a lo mismo, pero nunca se sabe. la forma más sencilla de averiguarlo es escribir un par de funciones simples, compilar y desensamblar utilizando ambos conjuntos de herramientas y ver cómo pasan los operandos a las funciones.


Sí, para C, el código Clang y GCC son compatibles (de hecho, ambos usan GNU Toolchain para vincular). Solo debes asegurarte de decirle a Clang que cree objetos compilados y no objetos de código de bits intermedio. C ABI está bien definido, por lo que el único problema es el formato de almacenamiento.

C ++ no es portátil entre compiladores en lo más mínimo; los diferentes compiladores utilizan diferentes llamadas de tablas virtuales, constructores, destrucción, manipulación de nombres, implementaciones de plantillas, etc. Como regla general, debe asumir que los objetos de un compilador de C ++ no funcionarán con otro.

Sin embargo, sí, en el momento de escribir esto, Clang ++ también puede usar las bibliotecas compiladas de GCC / C ++; Recientemente instalé una plataforma para compilar programas C ++ con clang usando la biblioteca de tiempo de ejecución estándar de G ++ y compila + enlaces muy bien.


Utilizo -m i386pep cuando vinculo los archivos .lang de clang con ld. La dedicación de llvm a la integración con gcc se ve abiertamente en http://dragonegg.llvm.org/ por lo que es muy intuitivo suponer que la familia llvm será enormemente compatible con la cadena de herramientas de gcc.