2012-03-30 20 views
5

Tenemos una necesidad de acceder al kernel global vars en net/ipv4/af_inet.c que no se exportan explícitamente desde un módulo de kernel cargable. Estamos usando 2.6.18 kernel actualmente.Acceda a los símbolos del kernel de Linux que no se exportan a través de EXPORT_SYMBOL *

kallsyms_lookup_name no parece estar disponible más (no se exporta)

__symbol_get devuelve NULL (tras una posterior lectura, symbol_get/__ symbol_get mira a través de tablas de símbolos de los módulos del kernel y existentes de los que sólo contiene exportan símbolo, y se está allí para asegurarse de que el módulo desde el que se exportó un símbolo está realmente cargado)

¿Hay alguna forma de acceder a los símbolos que no se exportan desde un módulo kernel?

Después de leer y ver las respuestas que las personas proporcionaron, parece que sería muy difícil encontrar un método en muchas versiones de kernel, ya que el kAPI cambia significativamente con el tiempo.

+0

Will 'objdump path/to/modulename.ko' hace lo que necesita? Debería decodificar la salida para determinar el desplazamiento correspondiente en el módulo y aplicar eso. ¿Cuál es el propósito de obtener un símbolo que no se exporta? – wallyk

+0

sí, podemos obtener la dirección a través de/proc/kallsyms en el espacio de usuario y tal vez pasarla al módulo, pero eso parece un poco harapiento, así que me preguntaba si hay algo mejor. Estamos tratando de sacar parte del código de red y convertirlo en un módulo para que podamos corregir los errores sin tener que reiniciar el kernel. –

Respuesta

4

Puedes usar el método que mencionaste antes obteniéndolo de/proc/kallsyms o simplemente usar la dirección que se da en System.map (que es lo mismo), puede parecer hackish pero así es como lo hice lo he visto hecho antes (nunca tuve que hacerlo yo mismo). O bien esto o usted puede construir su propio kernel personalizado donde realmente hace EXPORT_SYMBOL en lo que sea que quiera exportar, pero esto no es tan portátil.

+0

Jesús, ¿dónde has visto el método/proc/kallsyms? ¿Eso es en un entorno de producción? Tiene razón en que queremos trabajar con un kernel estándar sin tener que volver a compilarlo. –

+0

@softwareengineer Normalmente probamos algunas funciones que queremos agregar al núcleo sin tener que volver a compilarlo o simplemente tenerlo como una función modular extraíble. Lo he visto tal vez una o dos veces. Antes de eso, vi el System.map en el que simplemente codificaban la dirección en el módulo. –

+0

gracias, esperaré unos días y veré si alguien más puede encontrar algo, pero si no, me gustaría aceptar el suyo. –

5

Si el rendimiento no es una gran preocupación, puede recorrer toda la lista de símbolos con kallsyms_on_each_symbol() (exportada por el kernel para los módulos GPL) y verificar los nombres para obtener los que necesita. No recomendaría hacerlo a menos que no haya otra opción.

Si desea continuar, aquí está an example de uno de nuestros proyectos. Consulte el uso de kallsyms_on_each_symbol(), así como el código de symbol_walk_callback(), las otras partes son irrelevantes para esta pregunta.

+0

gracias, Eugene. sin embargo, esta función parece estar disponible solo en los kernels más recientes. No estaba en 2.6.18 o 2.6.25, pero está en 2.6.30. Sin embargo, debería haber especificado kernel 2.6.18 en mi pregunta original. –

Cuestiones relacionadas