/ / Antecipar erros do “kernel too old” entre as versões do kernel 2.6.16 e 2.6.26 - c ++, linux, linux-kernel

Antecipar erros do “kernel too old” entre as versões do kernel 2.6.16 e 2.6.26 - c ++, linux, linux-kernel

Eu construo uma aplicação em uma máquina rodando Linux(Debian) com o kernel 2.6.26-2-amd64 e eu quero rodar esta aplicação em outra máquina rodando Linux (Suse) com kernel 2.6.16.60-0.21-smp mas recebo o erro "FATAL: kernel too old".

Eu sei da pesquisa na internet que issopode acontecer quando se constrói contra uma biblioteca glibc que não foi compilada para suportar versões mais antigas do kernel, mas geralmente diz respeito à versão 2.4. É possível obter tais erros para o kernel da mesma série (2.6) ou isso pode ser de outra coisa?

Além disso, li que a solução para issoO problema é reconstruir o aplicativo em relação a outra versão do glibc compilada com a opção --enable-kernel = VERSION apropriada. Como alternativa, você pode apenas vincular dinamicamente seu aplicativo ao glibc para resolver o problema?

Obrigado pela ajuda.

ATUALIZAR: Eu entendo minha pergunta pode parecer vaga ouresolvido por uma das soluções já mencionadas (dinamicamente linkando, construindo em outro sistema [virtual], reconstruindo o glibc [que parece bastante complicado considerando os comentários que eu li sobre ele]) mas o que eu estou procurando são formas de prevenir tais problemas.

Por exemplo, é possível encontrar quais versões do kernel Linux são compatíveis com uma compilação específica da glibc?

ATUALIZAÇÃO 2: Eu finalmente encontrei um patch fonte para glibc (para o Debian, mas eu acho que existem documentos similares online para outras distros) que (eu acho) contém a informação que eu estava procurando.

Desta página:

--- 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)
[...]

O que explica o erro "kernel too old". Espero que ajude outras pessoas.

Respostas:

16 para resposta № 1

Uma maneira de determinar a versão mínima do kernel para um determinado arquivo ELF é executar file sobre isso, assim:

$ 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

A parte importante aqui é o "for GNU/Linux 2.6.38", que indica a versão mínima do kernel.