2009-07-22 15 views
10

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?

+0

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

+0

@Lothar No, no lo requiere en general. ¿Estás mezclando objetos compilados con y sin '-fPIC'? – ephemient

Respuesta

9

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.

+0

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

+0

@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

Cuestiones relacionadas