LINUX.ORG.RU

Одна и та же версия рантайма для разных версий gcc.


0

2

Такая history. В системе gcc 4.4.5, соответственно и либы от него же. Собрал недавно gcc 4.6.1 и установил его в home. Указал codeblocks-у путь к свежей версии. Скомпилил такое.

int main (int argc, char* argv[])
{
    std::cout<<"gcc version = "<<__GNUC__<<"."<<__GNUC_MINOR__<<"<<__GNUC_PATCHLEVEL__<<std::endl;
}

Запускаю, вижу - «gcc version = 4.6.1».

запускаю ldd и вижу:

linux-gate.so.1 =>  (0xb778d000)
        libstdc++.so.6 => /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libstdc++.so.6 (0xb7676000)
        libm.so.6 => /lib/libm.so.6 (0xb7652000)
        libgcc_s.so.1 => /usr/lib/gcc/i686-pc-linux-gnu/4.4.5/libgcc_s.so.1 (0xb7636000)
        libc.so.6 => /lib/libc.so.6 (0xb74e8000)
        /lib/ld-linux.so.2 (0xb778e000)

И не понимаю как 4.6 может использовать рантайм от 4.4.5, да и ещё без падений. Вроде же бинарной совместимости нету. Проясните плиз.

ldd ищет требуемые бинарники по переменной, ЕМНИП, LD_LIBRARY_PATH.

Попробуй так - LD_LIBRARY_PATH=«/path/to/gcc/in/home:${LD_LIBRARY_PATH}» ldd бинарник

Pinkbyte ★★★★★ ()

Бинарная совместимость таки есть. Чтобы юзать правильный libstdc++ и libgcc_s.so - LD_LIBRARY_PATH=путь_к_папке_с_либами, а еще можно правильный rpath прописать в ELF.

Deleted ()

Пути поиска этих либ (libstdc, libgcc) задаются при сборке gcc, не знаю каким образом они указывают на старый рантайм.

frey ★★ ()
Ответ на: комментарий от JackYF

>Пока эта цифра/число не меняется, бинарная совместимость есть.

Спасибо, понятно.

Пути поиска этих либ (libstdc, libgcc) задаются при сборке gcc, не знаю каким образом они указывают на старый рантайм.

Видимо просто указаны ссылки на библиотеки, а уж где сами библиотеки находятся - другой вопрос.

Тогда мне вот что интересно, совместимость-то по идее с предыдущими версиями, а не последующими.

Booster ★★ ()
Ответ на: комментарий от Booster

совместимость-то по идее с предыдущими версиями, а не последующими.

Короче, (упрощённо) пока не поменяют calling convention и/или API будет всё совместимо. Я сомневаюсь что они в каждом релизе такое делают, поэтому всё совместимо. А ещё, вроде, на уровне самих библиотек есть метаданные о совместимости. К сожалению щас ничего нагуглить не смог, dumpelf тоже не показывает ничего путного. Может с модулями ядра перепутал, там точно что-то было про версии API.

true_admin ★★★★★ ()
Ответ на: комментарий от Booster

Фишка в том, что они являются частью gcc и собираются вместе с ним, т.е. указывать нужно предположительное их место, странно, что туда как-то попали ссылки на старый рантайм.

frey ★★ ()
Ответ на: комментарий от true_admin

> на уровне самих библиотек есть метаданные о совместимости.

Symbols versioning:

objdump -T /path/to/lib.so

anonymous ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.