Estoy armando un archivo MAKE para un proyecto en el que estoy trabajando. Tengo un archivo ejecutable y una biblioteca compartida en el proyecto. Ambos usan algunos de los mismos archivos fuente que se compilan por separado en archivos de objeto. Para poder usar estos objetos en la biblioteca compartida, necesito usar el indicador -fPIC (código de posición independiente) en gcc. ¿Hay alguna implicación de compilar objetos con -fPIC que se usen en un ejecutable?¿Cuáles son las implicaciones de compilar objetos con indicador gcc -fPIC si se utilizan en ejecutables?
Respuesta
Compilar código independiente de posición cuando no es necesario es un arrastre de rendimiento en algunas plataformas (más notablemente, la arquitectura x86 con falta de registro, porque PIC elimina un registro que se puede usar más libremente cuando no es PIC), pero hay no debería haber efectos perjudiciales de lo contrario.
Yendo más lejos, incluso es posible crear un ejecutable independiente de la posición (-fPIE
) construido a partir de código de posición independiente.
Dicho esto, libtool puede producir automáticamente objetos PIC y no PIC por cada archivo fuente que compile, y debería ser fácil hacer lo mismo incluso en un sistema de compilación sin integración de libtool.
Ningún PIC no elimina un registro en x86. Esta CPU no tiene código indirecto de posición y, por lo tanto, siempre agrega una indirección a los datos/funciones. Puede olvidarse de -fPIC totalmente en x86 porque si no lo especifica, obtiene un código rápido y el vinculador duplica el segmento de código para cada ejecutable. – Lothar
@Lothar En x86-32, según el compilador, PIC elimina un registro. GCC anterior a 5.0 se reserva '% ebx', por lo que no está disponible para uso general. https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54232 – ephemient
- 1. Cuáles son las implicaciones de usar el código de seguridad
- 2. ¿Cuáles son las implicaciones de usar 'baja' seguridad en cakephp?
- 3. ¿Cuáles son las implicaciones de VMDebug.startGC en un archivo traceview
- 4. ¿Cuáles son las implicaciones de portabilidad del uso del NDK?
- 5. gcc: cómo no compilar con las advertencias
- 6. ¿Cuáles son las implicaciones de SET-ting ALLOW_SNAPSHOT_ISOLATION?
- 7. ¿Cuáles son las implicaciones de seguridad de usar boost/format?
- 8. ¿Cuáles son las implicaciones de la macro linux __user?
- 9. ¿Cuáles son las implicaciones de eliminar una cuenta de usuario?
- 10. ¿Cuáles son las costosas optimizaciones de GCC?
- 11. ¿Cuáles son las implicaciones de rendimiento de compartir objetos entre subprocesos?
- 12. ¿Cuáles son las restricciones/limitaciones de compilar con "+ native"?
- 13. ¿Cuáles son las implicaciones de usar const estático en lugar de #define?
- 14. ¿Cuáles son las implicaciones de rendimiento de usar require_dependency en las aplicaciones de Rails 3?
- 15. ¿Cuáles son los inconvenientes y las soluciones cuando se utilizan entornos virtuales de Python en Windows?
- 16. ¿Cuáles son las motivaciones detrás de compilar a byte-code?
- 17. ¿Cuáles son las implicaciones de usar un valor bajo de GCGraceSeconds en Cassandra?
- 18. ¿Cuáles son las implicaciones de no cerrar un identificador de directorio en Perl?
- 19. Implicaciones de instanciar objetos con variables dinámicas en PHP
- 20. No se puede compilar C++ con gcc
- 21. EJB3 - obtención de frijol mediante inyección frente a búsqueda: ¿cuáles son las diferencias, implicaciones, errores?
- 22. ¿Cómo puedo obligar a GCC a compilar funciones que no se utilizan?
- 23. ¿Cuáles son las implicaciones de llamar funciones C API de NumPy desde múltiples hilos?
- 24. El decimal almacena la precisión de la cadena analizada en C#? ¿Cuáles son las implicaciones?
- 25. ¿Cuáles son las implicaciones de tener clases duplicadas en java jar?
- 26. ¿Cómo compilar para Windows en Linux con gcc/g ++?
- 27. ¿Cuáles son las implicaciones de rendimiento de marcar métodos/propiedades como virtuales?
- 28. ¿Cuáles son las implicaciones de devolver un valor como constante, referencia y referencia constante en C++?
- 29. ¿Cómo compilar MPI con gcc?
- 30. ¿Cuáles son las implicaciones para redireccionar imágenes detrás de la etiqueta <image>?
Parece que GCC7 ahora requiere todo compilado con -fPIC. Al menos me sale un error y encontré esta pregunta en la búsqueda de por qué me sale el error. – Lothar
@Lothar No, no lo requiere en general. ¿Estás mezclando objetos compilados con y sin '-fPIC'? – ephemient