gratis - gnu gcc compiler code blocks
¿Por qué gcc no proporciona implícitamente el distintivo-fPIC al compilar bibliotecas estáticas en x86_64? (1)
- Ver la pregunta 3544035 . También discutido here y akkadia.org/drepper/dsohowto.pdf .
- Depende del uso que le dé a su biblioteca estática. Si solo desea vincularlo a los programas, no necesita el código PIC (libtool llama a eso una biblioteca práctica, porque podría prescindir de ella, simplemente ayuda a que su proceso de compilación tenga un tamaño razonable, por ejemplo). De lo contrario, si tiene la intención de vincular bibliotecas compartidas con este, necesita el código PIC en su biblioteca estática.
- Ver pregunta 3146744 y también here
- Intensifica tu código, por lo que no es el predeterminado. Una cosa que hay que ver es que, cuando compila un único archivo objeto, GCC no sabe si va a crear una biblioteca compartida a partir de él o no. En la mayoría de mis proyectos más pequeños, simplemente enlace un par de archivos de objeto, y no necesito código PIC, por ejemplo.
Además, mi consejo sería: si necesitas preocuparte por eso, lo estás haciendo mal (o te gusta aprender de la peor manera, lo cual es bueno porque obtendrás más de la experiencia). Los sistemas de compilación (libtool, cmake, lo que sea que use) deberían hacer eso por usted.
He tenido numerosos problemas al compilar objetos compartidos que se vinculan estáticamente con bibliotecas estáticas. Este problema solo aparece en las plataformas x84_64. Al hacer el mismo trabajo de compilación en x86_32 no tengo ningún problema.
Tal vez esto es una cosa de configuración de GCC específica del sistema operativo, pero mi investigación indica que es cómo funciona GCC en las plataformas x86_64. De todos modos, estoy usando gcc 4.4.3 en Ubuntu 10.04 x86_64.
¿Cómo se soluciona el problema? ... Asegurándose de que todas las dependencias de la biblioteca estática estén compiladas con -fPIC.
Pregunta 1: ¿Cuál es la diferencia entre -fpic y -fPIC (aparentemente -fPIC genera más instrucciones en x86)? ¿Por qué el último tipo es más relevante en el contexto x86_64?
Pregunta 2: Mi suposición es que cuando se vincula con el código estático, está conectando las funciones en su binario en el momento del enlace, ¿por qué necesita el nivel de indirección que proporciona la maquinaria del "código independiente de posición"?
Pregunta 3: Ahora, si x86 no necesita -fpic / -fPIC para vincular objetos compartidos contra archivos estáticos ¿por qué es necesario en x86_64?
Pregunta 4: incluso si es necesario, ¿por qué no se proporciona implícitamente? Pensé que romper los cambios se suponía que era un gran no-no