Pregunta

He tenido numerosos problemas al compilar objetos compartidos que enlazan de forma estática contra las librerías estáticas. Este problema sólo se presenta en las plataformas x84_64. Al hacer el mismo trabajo de compilación para x86_32 no tengo ningún problema.

Tal vez esto es una cosa de configuración GCC sistema operativo específico, pero mi investigación indica que su cómo funciona GCC en plataformas x86_64. De todos modos, estoy usando gcc 4.4.3 en Ubuntu 10.04 x86_64.

¿Cómo se solucionó el problema? ... Asegurarse de que todas las dependencias de la biblioteca estática son recopilados con -fPIC.

Pregunta 1: ¿Cuál es la diferencia entre -fPIC y -fPIC (aparentemente -fPIC genera más instrucciones en x86)? ¿Por qué la tarde escribir más relevante en el contexto x86_64?

Pregunta 2: Mi suposición es que cuando se vincula en contra de código estático son difíciles de cablear las funciones en su binario en tiempo de enlace, ¿por qué necesita el nivel de indirección la "posición de código independiente "maquinaria ofrece?

Pregunta 3: Ahora bien, si no necesita x86 -fPIC / -fPIC a los objetos de enlace compartida contra archivos estáticos por qué se necesita en x86_64?

Pregunta 4: , incluso si es necesario por qué no se suministró de forma implícita? Pensé breaking se suponía cambios a ser un gran no-no

¿Fue útil?

Solución

  1. 3544035 . También se discuten aquí y hay .
  2. depende de lo que utilice tendrá para su biblioteca estática. Si sólo desea vincularlo a los programas, que no necesita código PIC (llamadas libtool que una biblioteca de conveniencia, ya que podría hacer casi sin ella, simplemente ayuda a que el proceso de compilación de un tamaño razonable, por ejemplo). De lo contrario, si la intención de bibliotecas compartidas de enlace en contra de ella, necesita el código PIC en su biblioteca estática.
  3. 3146744 y aquí
  4. Se hincha el código, así que no es el predeterminado. Una cosa es ver es que, cuando se compila un archivo único objeto, GCC no se sabe si se va a crear una biblioteca compartida fuera de ella o no. En la mayoría de mis proyectos más pequeños, que simplemente enlazar juntos un par de archivos de objetos, y no necesito código PIC, por ejemplo.

Además, mi consejo sería: si tiene que preocuparse por eso, estás haciendo mal (o le gustaría aprender de la manera difícil, lo cual es bueno porque vas a sacar más provecho de la experiencia). sistemas de compilación (libtool, cmake, todo lo que uso) deberían hacer eso por usted.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top