¿Ya no se permiten direcciones absolutas de 32 bits en Linux x86-64?

Linux de 64 bits utiliza el modelo de memoria pequeña de forma predeterminada, que coloca todo el código y los datos estáticos por debajo del límite de dirección de 2 GB. Esto asegura que pueda usar direcciones absolutas de 32 bits. Las versiones anteriores de gcc usan direcciones absolutas de 32 bits para matrices estáticas para guardar una instrucción adicional para el cálculo de la dirección relativa. Sin embargo, esto ya no funciona. Si trato de hacer una dirección absoluta de 32 bits en el ensamblaje, aparece el error del enlazador: "la reubicación R_X86_64_32S contra '.data' no se puede usar al hacer un objeto compartido; recompilar con -fPIC". Este mensaje de error es engañoso, por supuesto, porque no estoy creando un objeto compartido y -fPIC no ayuda. Lo que he descubierto hasta ahora es esto: gcc versión 4.8.5 utiliza direcciones absolutas de 32 bits para matrices estáticas, gcc versión 6.3.0 no. la versión 5 probablemente tampoco. El enlazador en binutils 2.24 permite direcciones absolutas de 32 bits, verson 2.28 no.

La consecuencia de este cambio es que las bibliotecas antiguas deben volver a compilarse y el código de ensamblaje heredado no funciona.

Ahora quiero preguntar: ¿Cuándo se realizó este cambio? ¿Está documentado en alguna parte? ¿Y hay una opción de enlace que lo haga aceptar direcciones absolutas de 32 bits?

Respuestas a la pregunta(1)

Su respuesta a la pregunta