lunes, 27 de mayo de 2013

Compilar linux-2.6.37 para Intel + parche

Tuve la necesidad de usar el “viejo” linux 2.6 y además compilándomelo para reducir su tamaño al mínimo, he pasado varias horas buscando en la web por algunos errores de compilación que me daba. Con lo que ha “llovido” desde entonces  probablemente esto ya esté parcheado para esta versión y resuelto nativamente para las posteriores (esto si me consta) así que simplemente considero incrementar tus probabilidades de dar con la solución que yo no pude econtrar. El primer error se refiere a una inconsistencia en la declaración de dos funciones:
extern long syscall_trace_enter(struct pt_regs *);
extern void syscall_trace_leave(struct pt_regs *);
en el archivo “./linux-2.6.37/arch/x86/include/asm/ptrace.h“. Se trata de un atributo especificado a las funciones en la implementación(“./linux-2.6.37/arch/x86/kernel/ptrace.c“) de la función y no así en la declaración. Esto se expresaba con “asmregparm” como una macro (” #define asmregparm __attribute__((regparm(3))”) del archivo (“./linux-2.6.37/arch/x86/include/asm/linkage.h“) la sustitución llevada a cabo por el preprocesador especificaba a la función el atributo __attribute__((regparm(x))) como antes mencionaba.
__attribute__((regparm(number))):
Este puede ser utilizado solo para arquitectura intel(i386 y x86-64) y se refiere a que el paso de parámetros se hará de manera directa mediante registros( EAX, EDX,y ECX) si estos son de tipo entero y no por el stack en memoria como suele ser, son pasados los que numeran entre el primero y “number”, los que siguen después de la cantidad “number” serán pasados por el stack de forma común y ello se aplica también para las funciones que reciben un número de argumentos variable. Más documentación al respecto la puedes obtener en la especificación de tu compilador, yo me he referido a gcc que es el que uso y según tengo entendido agrega esta característica desde su versión 3.4.0 para linux (i686-pc-linux-gnu). Además agregar que cuando he usado atributos para las funciones lo he puesto en la declaración de esta, no en la implementación y al final, no al inicio, no me queda claro que esto sea relevante pero lo he visto en algún libro sobre herramientas GNU que ahora no recuerdo el título.
El segundo error se debe a una variable duplicada (expeculando, la impresión que me dio fue que escribieron el cuerpo del struct en dos momentos diferentes  dejando pasar por alto este pequeño detalle) en el strcut igbvf_buffer del archivo ./linux-2.6.37/drivers/net/igbvf/igbvf.h En la documentación de gcc podemos ver en un topic(“Unnamed struct/union fields within structs/unions”) dedicado a estructuras/uniones anónimas que según lo establecido por la norma ISO C1X y por compatibilidad con otros compiladores se permite definir estructuras y uniones que contienen como alguno/os de su/us campo/os estructuras y/o uniones sin nombre. Pero nunca se deberán crear estas estructuras de manera que cause definición de campos ambiguos como en este caso(y el caso del error en el código linux):
struct {
int a;
struct {
int a;
};
} foo;
Sin más te dejo el parche );. Tal vez te sea de ayuda un post para cómo aplicarlo.
git clone https://github.com/denisacostaq/intel_asmregparm-page_anonymous_struct-2.6.37.patch.git

1 comentario:

Deje su comentario..., 0 palabras obscenas...