старый линкер (использует libc5) не работает на ядре Linux 2.6.25 - PullRequest
2 голосов
/ 28 апреля 2009

У нас есть устаревший компоновщик, который использует libc5, и из-за нескольких факторов у нас есть только двоичный файл, а не исходный. Да, управление версиями спасло бы нас от нашей текущей проблемы ... которая сейчас используется для всей нашей цепочки инструментов и линейки продуктов, но этой конкретной лошади уже давно нет.

Этот компоновщик работает на ядре Linux 2.6.24, но на 2.6.25 (и 2.6.26) он выходит из строя с сообщением

    Virtual memory exceeded in `new'

У нас была похожая проблема с соответствующим устаревшим компилятором, но с некоторыми stackoverflow.com ответов , и многие исследования обнаружили, что проблема компилятора была вызвана "рандомизацией brk" в ядре linux 2.6.25 , Обходной путь для этого должен установить sysctl vars и переменную окружения:

    /proc/sys/kernel/randomize_va_space = 0 or 1
    setenv MALLOC_TOP_PAD_ 536870912

Это, однако, не помогает компоновщику.

При использовании «ldd» я обнаружил, что компоновщик имеет больше общих библиотечных зависимостей (компилятор имел только libc.so.5):

    libg++.so.27 => /usr/lib/libg++.so.27 (0xb7eca000)
    libstdc++.so.27 => /usr/lib/libstdc++.so.27 (0xb7e99000)
    libm.so.5 => /lib/libm.so.5 (0xb7e90000)
    libc.so.5 => /lib/libc.so.5 (0xb7dd3000)

И я прочитал, что мне, возможно, придется установить libc5 версию libg ++. So.27. Я не решаюсь сделать это, так как не знаю, переопределит ли это последнюю версию libg ++. So.27 и вызовет проблемы для приложений, не относящихся к libc5.

Итак, я могу найти и установить версию libc5 libg ++. So.27, или есть какой-то лучший способ отключить рандомизацию brk, или есть другое различие между ядром 2.6.24 и 2.6.25, которое вызывает компоновщик проблема?

Редактировать

См. this для всех деталей этого поиска и моего окончательного решения.

1 Ответ

4 голосов
/ 28 апреля 2009

Это не дает точного ответа на ваш вопрос, но в вашей ситуации я бы создал chroot с известной в работе комбинацией libc + libstdc ++ или даже kernel + libc + libstdc ++ (в этом случае вам нужна виртуальная машина, очевидно). Таким образом, вы можете попробовать что-то относительно легко, не нарушая ничего.

Лучший способ быть совместимым со старой библиотекой, в конце концов, использовать эту старую библиотеку, и, поскольку это «просто» проблема с цепочкой инструментов, использование какого-либо типа jail / chroot / virtual machine не должно быть слишком сложным. проблема?

...