Compilador libstdc ++ versión vs. versión del sistema

Estoy tratando de entender cómo g ++ selecciona con qué versión de libstdc ++ se vincula y qué significa cuando la versión de "sistema" de la biblioteca es diferente.

Estoy usando gcc / g ++ 4.1.2, que de acuerdo con elPautas ABI doc, incluye libstdc ++. so.6.0.8, y por supuesto:

-rwxr-xr-x  1 root root 4397810 May 18  2007 /opt/gcc4.1.2/lib/libstdc++.so.6.0.8

Según mi comprensión de la compatibilidad de ABI con versiones posteriores, puedo compilar con g ++ 4.1.2 y esperar que el código se ejecute en un sistema con una versión posterior de libstdc ++ que 6.0.8, pero no en uno con una versión anterior, porque Tendrá una versión más antigua de la ABI.

En la misma máquina hay una versión anterior de libstdc ++ en / usr / lib:

-rwxr-xr-x  1 root root 804288 Jul 22  2005 /usr/lib/libstdc++.so.6.0.3

Si compilo el código usando g ++ 4.1.2 en esta máquina, entonces ldd, veo la versión de libstdc ++ en / usr / lib referenciada, que es 6.0.3:

# ldd test
.
libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x005b6000)
.

Esto se espera, ya que / usr / lib se comprueba primero. Y la aplicación funciona bien.

Mi pregunta es: ¿qué ha pasado aquí?

¿Tiene g ++ 4.1.2 vinculado a la versión de libstdc ++. Así que eso es parte de esa versión (6.0.8)? Si es así, ¿por qué el ejecutable puede usar la versión anterior en / usr / lib en tiempo de ejecución, cuando tiene un ABI más antiguo? ¿Suerte?

O, ¿g ++ 4.1.2 recogió la versión / usr / lib de libstdc ++ (6.0.3) en el momento del enlace y la usó, ya que resuelve las rutas de la biblioteca de la misma manera que los ejecutables en tiempo de ejecución? ¿Puede g ++ hacer eso, incluso si libstdc ++ no es su versión "propia"? ¿Cuál es el propósito de la versión libstdc ++ en g ++ 4.1.2 (6.0.8)? ¿Se ha utilizado en absoluto en este proceso?

Cualquier apreciación apreciada.

Respuestas a la pregunta(2)

Su respuesta a la pregunta