he recibido recientemente una:¿Por qué es fPIC absolutamente necesario en 64 y no en plataformas de 32 bits?
... R_X86_64_32 reubicación contra `un símbolo local' no se pueden utilizar cuando se hace un objeto compartido; recompile con -fPIC
error al intentar compilar un programa como una biblioteca compartida.
Ahora la solución a esto no es muy difícil (recompile todas las dependencias con -fPIC), pero después de algunas investigaciones resulta que este problema solo está presente en las plataformas x86-64. En 32 bits, cualquier código dependiente de la posición aún puede ser reubicado por el cargador dinámico.
answer La mejor que pude encontrar es:
x 86 tiene soporte para las reubicaciones .text (que es lo que sucede cuando se tiene código de posición-dependend). Este soporte tiene un costo, es decir, que cada página que contiene dicha reubicación queda básicamente sin compartir, incluso si se encuentra en una biblioteca compartida, lo que arruina el concepto mismo de las bibliotecas compartidas . Por lo tanto, decidimos no permitir esto en amd64 (además de que crea problemas si el valor necesita más de 32 bits, ya que todos los reubicaciones .text única tienen un tamaño 'word32')
Pero no encuentro esto muy adecuada . Si es el caso de que las reubicaciones estropeen el concepto de bibliotecas compartidas, ¿por qué se puede hacer en plataformas de 32 bits? Además, si había cambios que debían hacerse en el formato ELF para admitir 64 bits, ¿por qué no todos los campos aumentaron de tamaño para adaptarse?
Esto puede ser un punto menor, pero está motivado por el hecho de que a) el código en cuestión es un código científico y sería bueno no tener que tomar un golpe de rendimiento yb) esta información era casi imposible para encontrar en primer lugar!
[Editar: 'La respuesta'
@awoodlands answer es probablemente la mejor 'respuesta literal', @servn added una buena información.
En una búsqueda para encontrar más información sobre los diferentes tipo de movimientos que encontré this y en última instancia un x86_64 ABI reference (véase la página 68) ]
no sé la respuesta a su pregunta, pero usted debe ser consciente de que el ' -El rendimiento de fPIC' se reduce en x86-64 (relativo a x86-32) porque tiene más registros, direccionamiento relativo de PC y un ABI diseñado con PIC en mente. No voy a decir que se ha ido *, pero mídelo y podría estar gratamente sorprendido. – zwol
Ese parece ser el consenso, una pequeña penalización en el desempeño por lo que es una gran conveniencia. Tendré que intentarlo yo mismo. –
La pregunta principal es, por supuesto, por qué un compilador tiene una "opción obligatoria". "No dijiste la palabra mágica" es un juego bastante infantil. – MSalters