Por qué gcc no suministra implícitamente la bandera-cLPI al compilar bibliotecas estáticas en x86 64


He tenido numerosos problemas para compilar objetos compartidos que enlazan estáticamente contra bibliotecas estáticas. Este problema solo aparece en plataformas x84_64. Al hacer el mismo trabajo de compilación en x86_32 no tengo ningún problema.

Tal vez esto sea una configuración GCC específica del sistema operativo, pero mi investigación indica que es cómo funciona GCC en plataformas x86_64. De todos modos, estoy usando gcc 4.4.3 en Ubuntu 10.04 x86_64.

¿Cómo se soluciona el problema ?... Asegurarse de que toda la biblioteca estática las dependencias se compilan con-cLPI.

Pregunta 1: ¿Cuál es la diferencia entre-clpi y-cLPI (aparentemente-cLPI genera más instrucciones en x86) ? ¿Por qué el último tipo es más relevante en el contexto x86_64 ?

Pregunta 2: Mi suposición es que cuando se enlaza contra código estático, está cableando las funciones en su binario en el momento del enlace, ¿por qué necesita el nivel de indirección que proporciona la maquinaria de "código independiente de posición"?

Pregunta 3: Ahora, si x86 no necesita-clpi / -cLPI para vincular objetos compartidos con archivos estáticos, ¿por qué se necesita en x86_64 ?

Pregunta 4: incluso si es necesario, ¿por qué no se suministra implícitamente ? Pensé que romper los cambios se suponía que era un gran no-no

Author: Hassan Syed, 2010-10-18

1 answers

  1. Ver pregunta 3544035. También se discute aquí y allí.
  2. Depende de qué uso tendrá para su biblioteca estática. Si solo desea vincularlo a programas, no necesita código PIC (libtool llama a eso una biblioteca de conveniencia, porque podría prescindir de ella, simplemente ayuda a obtener su proceso de compilación a un tamaño razonable, por ejemplo). De lo contrario, si tiene la intención de vincular bibliotecas compartidas contra él, necesita código PIC en su biblioteca estática.
  3. Ver pregunta 3146744 y también aquí
  4. Se infla su código, por lo que no es el predeterminado. Una cosa que veo es que, cuando se compila en un solo archivo de objeto, GCC no sabe si va a crear una biblioteca compartida o no. En la mayoría de mis proyectos más pequeños, simplemente enlazo un par de archivos objeto, y no necesito código PIC, por ejemplo.

Además, mi consejo sería: si necesitas preocuparte por eso, lo estás haciendo mal (o te gusta aprender de la manera difícil, lo cual es bueno porque obtendrás más de la experiencia). Los sistemas de compilación (libtool, cmake, lo que sea que uses) deberían hacer eso por ti.

 40
Author: F'x,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:01