Sé que la -fPIC
opción " " tiene algo que ver con la resolución de direcciones y la independencia entre módulos individuales, pero no estoy seguro de lo que realmente significa. ¿Puedes explicar?
Sé que la -fPIC
opción " " tiene algo que ver con la resolución de direcciones y la independencia entre módulos individuales, pero no estoy seguro de lo que realmente significa. ¿Puedes explicar?
Respuestas:
PIC significa Código Independiente de Posición
y citar man gcc
:
Si es compatible con la máquina de destino, emita un código independiente de la posición, adecuado para la vinculación dinámica y evitando cualquier límite en el tamaño de la tabla de compensación global. Esta opción marca la diferencia en m68k, PowerPC y SPARC. El código independiente de la posición requiere un soporte especial y, por lo tanto, solo funciona en determinadas máquinas.
utilícelo cuando cree objetos compartidos (* .so) en las arquitecturas mencionadas.
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
compilaba, así que agregué fPIC y lo construí.
El f
es el prefijo gcc para las opciones de que "el control de las convenciones de interfaz utilizados en la generación de código"
Las PIC
gradas para "Código Independiente Posición", que es una especialización de la fpic
de m68k y SPARC.
Editar: después de leer la página 11 del documento al que hace referencia 0x6adb015 , y el comentario de coryan, hice algunos cambios:
Esta opción solo tiene sentido para bibliotecas compartidas y le está diciendo al sistema operativo que está usando una Tabla de compensación global, GOT. Esto significa que todas las referencias de su dirección son relativas al GOT, y el código se puede compartir en múltiples procesos.
De lo contrario, sin esta opción, el cargador tendría que modificar todas las compensaciones por sí mismo.
No hace falta decir que casi siempre usamos -fpic / PIC.
man gcc
dice:
-fpic Genere un código independiente de la posición (PIC) adecuado para su uso en un biblioteca, si es compatible con la máquina de destino. Dicho código accede a todos direcciones constantes a través de una tabla de compensación global (GOT). La dinámica Loader resuelve las entradas GOT cuando se inicia el programa (la dinámica loader no es parte de GCC; es parte del sistema operativo). Si el tamaño GOT para el ejecutable vinculado excede un específico de la máquina tamaño máximo, recibe un mensaje de error del vinculador que indica que -fpic no funciona; en ese caso, vuelva a compilar con -fPIC en su lugar. (Estos máximos son 8k en SPARC y 32k en m68k y RS / 6000. El 386 no tiene tal límite). El código independiente de la posición requiere un soporte especial y, por lo tanto, funciona solo en ciertas máquinas. Para el 386, GCC admite PIC para System V pero no para el Sun 386i. Código generado para el IBM RS / 6000 siempre es independiente de la posición. -fPIC Si es compatible con la máquina de destino, emita un código independiente de la posición, adecuado para enlaces dinámicos y evitar cualquier límite en el tamaño de la tabla de compensación global. Esta opción marca la diferencia en el m68k y el SPARC. El código independiente de la posición requiere un soporte especial y, por lo tanto, funciona solo en ciertas máquinas.