Compilación de un módulo del núcleo de 32 bits produce un núcleo de Linux en__udivdi3 undefined: cómo encontrar el código que lo usa?
"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!
Todo está bien en sistemas de 64 bits. Hasta donde yo sé, la razón para esto es que la división de enteros de 64 bits y el módulo no son compatibles dentro de un kernel Linux de 32 bits.
¿Cómo puedo encontrar el código que emite las operaciones de 64 bits? Son difíciles de encontrar manualmente porque no puedo verificar fácilmente si un "/" tiene 32 bits de ancho o 64 bits de ancho. Si las funciones "normales" no están definidas, puedo grep, pero esto no es posible aquí. ¿Hay alguna otra buena manera de buscar las referencias? ¿Algún tipo de "grep de código de máquina"?
El módulo consta de unas mil líneas de código. Realmente no puedo verificar cada línea manualmente.
para agregar un poco de información, do_div() se define en el encabezado. –
Parece bastante ridículo que Linux insista en hacer que use una función fea para dividir, en lugar de simplemente implementar '__udivdi3', etc. Son fáciles de implementar, y si lo hace en asm, serán mucho más eficientes que las versiones de libgcc (quizás 2-3 veces más rápido). –
@WilliBallenthin, incluso después de usar, enfrentan este problema. ¿Alguien me sugiere lo que hay que hacer para resolver este problema? –