c++ - Anticipe los errores del "kernel demasiado viejo" entre las versiones 2.6.16 y 2.6.26 del kernel
linux linux-kernel (1)
Construyo una aplicación en una máquina que ejecuta Linux (Debian) con el kernel 2.6.26-2-amd64 y quiero ejecutar esta aplicación en otra máquina que ejecuta Linux (Suse) con el kernel 2.6.16.60-0.21-smp pero me sale el error. "FATAL: kernel demasiado viejo".
Sé por investigación en Internet que esto puede suceder cuando se compila con una biblioteca glibc que no se compiló para admitir versiones anteriores del kernel, pero generalmente se trata de la versión 2.4. ¿Es posible obtener tales errores para el núcleo de la misma serie (2.6) o puede ser de otra cosa?
Además, leí que la solución a este problema es reconstruir la aplicación contra otra versión de glibc compilada con la opción adecuada --enable-kernel = VERSION. Como alternativa, ¿puede simplemente vincular dinámicamente su aplicación con glibc para resolver el problema?
Gracias por tu ayuda.
ACTUALIZACIÓN : entiendo que mi pregunta puede parecer vaga o resuelta por una de las soluciones ya mencionadas (vinculación dinámica, desarrollo de otro sistema [virtual], reconstrucción de glibc [que parece bastante difícil considerando los comentarios que leí sobre eso]) pero lo que soy En última instancia, buscar formas de prevenir tales problemas.
Por ejemplo, ¿es posible encontrar qué versiones del kernel de Linux son compatibles con una compilación particular de glibc?
ACTUALIZACIÓN 2 : Finalmente encontré un parche de origen para glibc (para Debian, pero creo que hay documentos similares en línea para otras distribuciones) que (supongo) contiene la información que estaba buscando.
--- 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)
[...]
Lo que explica el error "kernel demasiado viejo". Espero que ayude a otras personas.
Una forma de determinar la versión mínima del kernel para un archivo ELF determinado es ejecutar el file
en él, de esta manera:
$ 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
La parte importante aquí es " for GNU/Linux 2.6.38
", que indica la versión mínima del kernel.