Предвидеть ошибки «ядра слишком старые» между версиями ядра 2.6.16 и 2.6.26 - PullRequest
16 голосов
/ 04 августа 2011

Я создаю приложение на машине под управлением Linux (Debian) с ядром 2.6.26-2-amd64 и хочу запустить это приложение на другой машине под управлением Linux (Suse) с ядром 2.6.16.60-0.21-smp, но я получить ошибку «FATAL: ядро ​​слишком старое».

Из интернет-исследований я знаю, что это может произойти при сборке библиотеки glibc, которая не была скомпилирована для поддержки старых версий ядра, но обычно это касается версии 2.4. Можно ли получить такие ошибки для ядра той же серии (2.6) или это может быть от чего-то еще?

Кроме того, я прочитал, что решение этой проблемы состоит в том, чтобы перестроить приложение под другую версию glibc, скомпилированную с соответствующей опцией --enable-kernel = VERSION. В качестве альтернативы вы можете просто динамически связать свое приложение с glibc для решения проблемы?

Спасибо за вашу помощь.

ОБНОВЛЕНИЕ : я понимаю, что мой вопрос может показаться неопределенным или решенным одним из уже упомянутых решений (динамическое связывание, построение на другой [виртуальной] системе, перестройка glibc [что кажется довольно сложным, учитывая комментарии, которые я читайте об этом]) но в конечном итоге я ищу способы предотвращения подобных проблем.

Например, можно ли найти, какие версии ядра Linux совместимы с конкретной сборкой glibc?

ОБНОВЛЕНИЕ 2 : В конце концов я нашел исходный патч для glibc (для Debian, но, думаю, в Интернете есть аналогичные документы для других дистрибутивов), который (я полагаю) содержит информацию, которую я искал.

С этой страницы :

--- eglibc-2.11.2.orig/debian/sysdeps/linux.mk
+++ eglibc-2.11.2/debian/sysdeps/linux.mk
@@ -0,0 +1,51 @@
[...]
+MIN_KERNEL_SUPPORTED := 2.6.18
[...]
+# Minimum Kernel supported
+with_headers = --with-headers=$(shell pwd)/debian/include
--enable-kernel=$(call xx,MIN_KERNEL_SUPPORTED)
[...]

Что объясняет ошибку «ядро слишком старое». Надеюсь, что это помогает другим людям.

1 Ответ

16 голосов
/ 05 ноября 2011

Один из способов определить минимальную версию ядра для данного файла ELF - запустить на нем file, например:

$ echo 'int main(){}' > test.c
$ gcc -o test test.c
$ file test
test: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.38, not stripped

Важной частью здесь является "for GNU/Linux 2.6.38",которая указывает минимальную версию ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...