Версия компилятора libstdc ++ против версии системы

я пытаюсь понять, как g ++ выбирает, с какой версией libstdc ++ он ссылается и что означает, когда "система» версия библиотеки другая.

используя gcc / g ++ 4.1.2, который в соответствии сРуководство по ABI doc, включает libstdc ++. so.6.0.8 и, конечно же,

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

Основываясь на моем понимании прямой совместимости ABI, я могу собрать с g ++ 4.1.2 и ожидать, что код будет работать в системе с более поздней версией libstdc ++, чем 6.0.8, но не на одной с более ранней версией, потому что это будет иметь более старую версию ABI.

На той же машине есть более старая версия libstdc ++ в / usr / lib:

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

Если я скомпилирую код, используя g ++ 4.1.2 на этом компьютере, а затем добавлю его, я увижу версию libstdc ++ в / usr / lib, на которую ссылаются, которая является 6.0.3:

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

Это ожидается, так как / usr / lib проверяется первым. И приложение работает нормально.

Мой вопрос: чтоздесь произошло?

G ++ 4.1.2 связана с версией libstdc ++., Так что это часть этого выпуска (6.0.8)? Если так, почему исполняемый файл может использовать более старую версию в / usr / lib во время выполнения, когда у него есть более старый ABI? Удача?

Или g ++ 4.1.2 выбрал / usr / lib версию libstdc ++ (6.0.3) во время компоновки и использовал ее, потому что он разрешает пути к библиотекам так же, как исполняемые файлы во время выполнения? Может ли g ++ сделать это, даже если libstdc ++ не является его "своя" версия? Какова цель версии libstdc ++ в g ++ 4.1.2 (6.0.8)? Был ли он вообще использован в этом процессе?

Любые идеи приветствуются.

Ответы на вопрос(2)

Ваш ответ на вопрос