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

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

Я использую gcc / g++ 4.1.2, который согласно ABI руководящие принципы doc, включает libstdc++.Итак.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 на этой машине, то ldd его, я вижу версию 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 ответов


GCC выбирает все библиотеки в соответствии со списком поиска каталогов. Вы можете видеть это так:

gcc -print-search-dirs

список обычно предпочитает библиотеки, специфичные для версии компилятора, если таковая имеется.

однако выбор времени соединения может отличаться от выбора времени выполнения.

Если команда компоновщика включает -rpath вариант (некоторые поставщики toolchain могут включать нестандартный), то динамический компоновщик будет использовать это, чтобы найти правильные библиотеки в время выполнения. В противном случае система будет использовать библиотеку по умолчанию.

Если две библиотеки не совпадают, то могут произойти плохие вещи. Библиотека C (обычно glibc) всегда была осторожна в поддержании совместимости. Библиотека C++ не всегда имела такую роскошь. Это было безопаснее в последние годы, но многие люди по-прежнему рекомендуем не смешивания и сопоставления.


по умолчанию gcc использует библиотеки в пути /usr/lib.
1. gcc / g++ 4.1.2 не связан с последней версией libstdc++.так что ... .6.0.8.
2. g++ 4.1.2 взял/usr / lib версию libstdc++ (6.0.3) во время ссылки.

Он по-прежнему использует системный libstdc++по умолчанию.Итак.6.0.3 Если путь к библиотеке не задан явно.

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/gcc4.1.2/lib

теперь при связывании с помощью gcc / g++ 4.1.2, libstdc++.Итак.6.0.Будет использовано 8.