Sé que la opción '-fPIC
' 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?¿Qué significa -fPIC cuando construyes una biblioteca compartida?
Respuesta
PIC representa código independiente de posición
y citar man gcc
:
Si es soportado por la máquina de destino, emitir 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 hace una diferencia en m68k, PowerPC y SPARC. El código independiente de la posición requiere soporte especial, y por lo tanto funciona solo en ciertas máquinas.
utilízalo cuando construyas objetos compartidos (* .so) en esas arquitecturas mencionadas.
man gcc
dice:
-fpic Generate position-independent code (PIC) suitable for use in a shared library, if supported for the target machine. Such code accesses all constant addresses through a global offset table (GOT). The dynamic loader resolves the GOT entries when the program starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked executable exceeds a machine-specific maximum size, you get an error message from the linker indicating that -fpic does not work; in that case, recompile with -fPIC instead. (These maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The 386 has no such limit.) Position-independent code requires special support, and therefore works only on certain machines. For the 386, GCC supports PIC for System V but not for the Sun 386i. Code generated for the IBM RS/6000 is always position-independent. -fPIC If supported for the target machine, emit position-independent code, suitable for dynamic linking and avoiding any limit on the size of the global offset table. This option makes a difference on the m68k and the SPARC. Position-independent code requires special support, and therefore works only on certain machines.
El f
es el prefijo gcc para las opciones que "el control de las convenciones de interfaz utilizan en la generación de código"
Los PIC
significa "código independiente de posición", se una especialización del fpic
para m68K y SPARC.
Editar: Después de leer la página 11 de la document referenced by 0x6adb015, y el comentario de coryan, he hecho algunos cambios:
Esta opción sólo tiene sentido para las bibliotecas compartidas y que está contando el sistema operativo que está utilizando 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 a través de múltiples procesos.
De lo contrario, sin esta opción, el cargador tendría que modificar todas las compensaciones.
Huelga decir que casi siempre usamos -fpic/PIC.
Pensé que el sistema operativo era libre de cargar la biblioteca en cualquier dirección virtual, pero sin pic/PIC el cargador tiene que modificar el código y ajustar todos los saltos absolutos + indirecciones a las ubicaciones reales de las rutinas/bibliotecas. Con pic/PIC, el código no se modifica y, por lo tanto, se comparte realmente en múltiples procesos. – coryan
Los procesos múltiples son en gran parte una coincidencia; su punto clave es que el código se puede cargar en cualquier dirección virtual con un mínimo absoluto de correcciones de direcciones. –
- 1. C++ Biblioteca compartida vinculada estáticamente
- 2. ¿Cómo crear una biblioteca compartida (.so) en un script automake?
- 3. Compilar una biblioteca compartida estáticamente
- 4. Convierta una biblioteca estática a una biblioteca compartida (cree libsome.so de libsome.a): ¿dónde están mis símbolos?
- 5. Cómo exportar símbolos de una biblioteca compartida
- 6. Vinculación de dependencias de una biblioteca compartida
- 7. ¿Convertir una biblioteca estática a una biblioteca compartida?
- 8. ¿Lees una configuración de maven.xml cuando construyes con gradle?
- 9. GCC genera un archivo ELF ejecutable cuando quiero una biblioteca compartida
- 10. Biblioteca de pantalla compartida
- 11. Biblioteca compartida en Go?
- 12. Cómo inicializar una biblioteca compartida en Linux
- 13. edificio y la vinculación de una biblioteca compartida
- 14. Vinculación de una biblioteca compartida mediante gcc
- 15. Cargar copias múltiples de una biblioteca compartida
- 16. ¿Puedo determinar qué indicadores de compilador/enlazador se usaron para crear una biblioteca compartida de solo binario?
- 17. librería compartida de Linux que utiliza un símbolo indefinido biblioteca compartida
- 18. Biblioteca compartida en Fortran, el ejemplo mínimo no funciona
- 19. anddroid ndk UnsatisfiedLinkError al usar una biblioteca compartida preconstruida
- 20. ¿Por qué los símbolos de una biblioteca compartida no se resuelven en el momento del enlace?
- 21. ¿Construyes un PyObject * desde una función C?
- 22. ¿Evita que se eliminen las funciones de una biblioteca estática cuando se vinculan a una biblioteca compartida?
- 23. ¿Cómo puedo forzar el enlace con una biblioteca estática cuando hay una biblioteca compartida del mismo nombre?
- 24. ctypes no encontrar símbolos en la biblioteca compartida creada usando la configuración para crear una librería compartida en Linux CMake
- 25. Crear biblioteca compartida que se vincula a otra biblioteca compartida no estándar
- 26. Vinculación de una biblioteca compartida con una biblioteca estática: ¿la biblioteca estática debe compilarse de forma diferente que si una aplicación estuviera vinculándola?
- 27. Es una variable global en una biblioteca/dll compartida, compartida en el proceso
- 28. ¿Cómo llamar a una función desde una biblioteca compartida?
- 29. Uso de una variable global en una biblioteca compartida
- 30. ¿Cómo construyes una implementación de calificaciones?
¿Qué significa f parte de FPic? –
f no significa nada, es solo parte del nombre de la opción. – Zifre
Hay una diferencia entre fpic y fPIC. Ambos hacen lo mismo, pero fpic usa un desplazamiento relativo más corto cuando está disponible. Por lo tanto, compilar con fpic puede producir archivos más pequeños. Desafortunadamente, no siempre funciona como se esperaba, así que use fPIC. Además, tenga en cuenta que no todos los procesadores admiten las compensaciones más cortas, por lo que puede no marcar la diferencia. –