intentar compilar código no PIC en una biblioteca compartida en x64 con gcc
resulta en un error, algo así como:¿Por qué gcc fuerza PIC para x64 libs compartidas?
/usr/bin/ld: /tmp/ccQ2ttcT.o: relocation R_X86_64_32 against `a local symbol' can not be used when making a shared object; recompile with -fPIC
Esta pregunta trata sobre por qué esto es así. Sé que x64 tiene un direccionamiento relativo al RIP que fue diseñado para hacer que el código PIC sea más eficiente. Sin embargo, esto no significa que la reubicación en tiempo de carga no pueda (en teoría) aplicarse a dicho código.
Algunas fuentes en línea, incluyendo this one (que es ampliamente citado en este tema) afirman que hay alguna limitación inherente que prohíbe código no PIC en bibliotecas compartidas, porque de RIP-direccionamiento relativo. No entiendo por qué esto es verdad.
Considere "viejo x86" - una instrucción call
también tiene un operando relativo a IP. Y, sin embargo, el código x86 con call
en él compila muy bien en una lib compartida sin PIC, pero usando el load-time relocationR_386_PC32
. ¿No se puede hacer lo mismo con el direccionamiento relativo de RIP de datos en x64?
Tenga en cuenta que entiendo completamente los beneficios del código PIC, y que el direccionamiento relativo al RIP de penalización de rendimiento lo ayuda a aliviar. Aún así, tengo curiosidad sobre el motivo por el cual no se permite el uso de código que no sea PIC. ¿Hay un razonamiento técnico real detrás de esto, o es solo para animar a escribir el código PIC?
@ user786653: Estoy familiarizado con ese (excelente) documento pero no creo que tenga una respuesta para mi pregunta. Si piensas lo contrario, dime dónde encontrarlo –
@ user786653: gracias, eres extremadamente útil hoy. Mencioné este mismo enlace en mi pregunta. Me alegro de que lo hayas leído antes de contestar –
Lo siento, me tropecé con eso más tarde y había olvidado que estaba enlazado en tu q. – user786653