Versiones de GLIBCXX


Si compilo un programa C++ en mi máquina, y lo corro en otro (con software anterior) obtengo: /usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found.

De hecho en mi sistema glibc es más nuevo (tengo gcc-libs 4.5.1: libstdc++.so.6.0.14) y strings /usr/lib/libstdc++.so.6 | grep GLIBCXX imprime desde GLIBCXX_3.4 a GLIBCXX_3.4.14. En el otro sistema, en cambio, solo imprime hasta GLIBCXX_3.4.8 (tengo libstdc++..6.0.8).

Así que tengo algunas preguntas:

  1. ¿Por qué mi enlazador enlaza binarios de C++ con libstdc++ version GLIBCXX_3.4.9 en lugar de GLIBCXX_3.4.14?

  2. Si Cumplí mi binario contra libstdc++ versión GLIBCXX_3.4 Supongo que se ejecutaría casi en todas partes. ¿Eso implicaría algún tipo de problema? (por ejemplo: ¿usaría implementaciones de algoritmos más antiguas y, por lo tanto, peores?)

  3. Si en cambio yo estáticamente enlace mi programa contra mi libstdc++ supongo que se ejecutará en todas partes; el binario será mucho más grande (~1MB) por supuesto, cualquier otro pros/contras?

  4. ¿Puedo forzar al enlazador a enlazar mi binario contra una versión dada de libstdc++?

Author: Ignacio Vazquez-Abrams, 2010-11-09

3 answers

Use readelf -a y objdump -x para inspeccionar los archivos ELF en lugar de strings.

En realidad, todas las versiones de GLIBCXX_* no se aplican a toda la biblioteca, sino a cada símbolo (versionamiento de símbolos, ver DSO-howto). Así que puedes tener por ejemplo: std::char_traits<wchar_t>::eq@@GLIBCXX_3.4.5 y std::ios_base::Init::~Init()@@GLIBCXX_3.4 en el mismo archivo de biblioteca.

El hecho de que su programa necesite GLIBCXX_3.4.9 probablemente significa que ha sido enlazado contra un símbolo que ha sido introducido/ha cambiado la semántica en GLIBCXX_3.4.9.

 31
Author: ninjalj,
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
2010-11-09 13:04:27
  1. Que la versión de la biblioteca que está instalada en su sistema. Podrías compila manualmente la versión 3.4.14 de glibc y enlázala
  2. Eso depende. Tal vez la versión posterior solucionó algunos problemas. Los usuarios de su programa tendrían que enlazar con la versión que su programa requiere
  3. El uso de memoria es mayor
  4. Sí, pase el parámetro apropiado al enlazador. Si necesita una versión específica de la biblioteca, lo mejor es descargarla, compilarla manualmente y vincularla a ella.

EDITAR

Acabo de recordar que las bibliotecas enlazadas estáticamente aumentan el uso de memoria.

 0
Author: BЈовић,
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
2010-11-09 13:25:22

En mi opinión, si sus binarios no utilizan las nuevas características de la versión más reciente de GLIBCXX, entonces no se vincularán con esa versión. Así que tus binarios fueron enlazados con GLBCXX 3.4.9, debe haber al menos un símbolo exportado desde él, y no hay ningún símbolo exportado desde la versión más reciente que 3.4.9.

 -1
Author: Lewis Chan,
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
2016-06-01 02:33:59