__udivdi3 undefined - comment trouver le code qui l'utilise?
La compilation d'un module du noyau sur 32 Bits noyau Linux résultats dans
"__udivdi3" [mymodule.ko] undefined!
"__umoddi3" [mymodule.ko] undefined!
Tout va bien sur les systèmes 64 bits. Autant que je sache, la raison pour cela est que la version 64 bits de l'entier de la division et le modulo ne sont pas pris en charge à l'intérieur d'un 32 bits noyau Linux.
Comment puis-je trouver le code d'émission les opérations en 64 bits. Ils sont difficiles à trouver manuellement, parce que je ne peux pas vérifier facilement si un "/" est 32 bits ou 64 bits de large. Si "normal" fonctions ne sont pas définies, je peux grep, mais ce n'est pas possible ici. Est-il une autre bonne façon de rechercher les références? Une sorte de "code machine grep"?
Le module se compose de quelques milliers de lignes de code. Je peux pas vraiment vérifier chaque ligne manuellement.
source d'informationauteur dmeister
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vous pouvez faire 64 bits de la division à l'aide de la
do_div
macro. (remarque le prototype estuint32_t do_div(uint64_t dividend, uint32_t divisor)
et que "dividend
" peut être évalué plusieurs fois.En outre, vous devriez être en mesure de trouver de l'utilisation de
long long int
(ouuint64_t
) dans votre code, ou alternativement, vous pouvez construire votre module avec-g
drapeau et l'utilisationobjdump -S
pour obtenir une source annoté démontage.remarque: cela s'applique pour les noyaux 2.6, je n'ai pas vérifié l'utilisation de quelque chose de plus bas
Après la phase de compilation, vous devriez être en mesure d'obtenir quelques documenté de l'assemblée, et de voir étaient ceux de la fonction sont appelés. Essaie de jouer avec les variables CFLAGS et ajouter le-S de drapeaux.
La Compilation devrait s'arrêter au stade de l'assemblage. Vous pouvez ensuite grep pour la délinquance des appels de fonction dans le fichier d'assemblage.
En fait, 64-bit integer division et modulo sont pris en charge au sein d'un Linux 32 bits noyau; toutefois, vous devez utiliser le bon de macros pour le faire (ceux qui dépendent de la version de votre noyau, depuis récemment des nouvelles de ceux qui ont été créés IIRC). Les macros faire la bonne chose dans la manière la plus efficace pour n'importe quelle architecture vous compilez pour.
La meilleure façon de trouver où ils sont utilisés (comme mentionné dans @shodanex de réponse) pour générer le code d'assemblée; IIRC, la façon de le faire est quelque chose comme
make directory/module.s
(avec ce que les paramètres que vous avez déjà pour passer àmake
). La prochaine façon la plus simple est de démonter la.o
fichier (avec quelque chose commeobjdump --disassemble
). Les deux façons vous donnera les fonctions où les appels sont générés (et, si vous savez comment lire l'assemblée, une idée générale de l'endroit où à l'intérieur de la fonction de la division de l'est).