una tipos sirve que programacion para librerias libreria informatica dinamicas dinamica crear creacion como bibliotecas linux 64bit g++ linker 32-bit

linux - tipos - que es una libreria en programacion y para que sirve



linux g++ que une código de biblioteca compartida de 64 bits a bibliotecas estáticas (2)

"Código de posición independiente" siempre es necesario si su módulo de objetos se utilizará en una biblioteca compartida. Es altamente dependiente de la plataforma e incurre en gastos generales.

La razón por la que tiene que especificarlo explícitamente en amd64, pero no en x386, es simplemente que es el predeterminado para x86, pero no amd64.

Tenga en cuenta también la diferencia entre "-fpic" y "-fPIC":

-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 pro- gram starts (the dynamic loader is not part of GCC; it is part of the operating system). If the GOT size for the linked execu- table 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 there fore 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. When this flag is set, the macros __pic__ and __PIC__ are defined to 1. -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, PowerPC and SPARC. Position-independent code requires special support, and therefore works only on certain machines. When this flag is set, the macros __pic__ and __PIC__ are defined to 2.

Contexto: puedo crear una biblioteca de objetos compartidos que esté vinculada a una biblioteca estática sin ningún problema en 32 bits de Linux. Cuando intento la misma compilación en 64 bits de Linux, veo este error del enlazador:

  • la reubicación R_X86_64_32S contra `un símbolo local ''no se puede usar cuando se hace un objeto compartido; recompilar con -fPIC

Este error es bastante común en la web. La solución es compilar la biblioteca enlazada estáticamente con código independiente de posición (-fPIC).

Lo que no entiendo es por qué esto no es necesario para la compilación de 32 bits. ¿Alguien puede ayudar?


Ok, la respuesta se describe en detalle aquí: http://www.technovelty.org/code/c/amd64-pic.html .

La esencia básica de la explicación es que la arquitectura i386 desreferencia implícitamente el puntero del marco para cada función (explicado en el último párrafo de la página enlazada). Este proceso implica una sobrecarga adicional, por lo que en las nuevas arquitecturas de 64 bits, esta sobrecarga de eliminación de referencias se eliminó como una optimización.

La consecuencia de esta optimización desde una perspectiva de enlace fue que, a menos que el código de 64 bits se compile explícitamente como código de posición independiente, producirá código que está codificado de forma rígida con compensaciones para su contexto de ejecución.

Esta es una explicación imperfecta del contenido en la página vinculada pero es suficiente para mis propósitos.