7
votes

Besoin d'aide pour déboguer pourquoi une bibliothèque partagée ne parvient pas à charger. Android NDK

J'essaie de charger une bibliothèque partagée en utilisant: System.LoadLibrary ("SharedC"); SharedC dépend de 2 autres bibliothèques partagées Shareda et Sharedb, les trois ont été effectuées à l'aide de la chaîne d'outils autonome et sont incluses comme des bibliothèques partagées prébondées. Je charge Shareda et Sharedb avant SharedC et je ne connais aucune autre dépendance. Mais quand j'essaie de charger Sharedc, je reçois un SEGV. Quand je courais de la ronde, c'est ce que je reçois:

android-linux-addr2line.exe -C -f -e libc.so 0000e7c8
strlen
??:0

android-linux-addr2line.exe -C -f -e libgnustl_shared.so 00063cd4
std::string::operator=(char const*)
??:0


3 commentaires

BTW ... Je vois cela mentionnant GetCwD à la fin, mais je ne suis pas sûr de quoi faire à ce sujet.


Avoir toutes vos bibliothèques ont été liées à libgnustl_shared.so ? Sinon, vous devriez essayer de le faire d'abord ..


Tous ceux qui dépendent de STL sont. S'il vous plaît jeter un coup d'oeil une mise à jour.


4 Réponses :


0
votes

Le plus probable libsharedc échoue à cause de la libz.so.

Même si vous enfoncez Libz avec votre colis, il ne sera pas chargé que si la bibliothèque se trouve dans le répertoire / système / libération. C'est le seul endroit Android recherche des dépendances telles que celles-ci (ne me demandez pas pourquoi!) Et vous ne pouvez mettre que des libs là si votre appareil est enraciné.

La voie la plus simple autour de celui-ci est de lier Z avec SharedC ou de Bundle Libz avec votre application et de le charger explicitement dans la terre Java avant que libsharedc.


1 commentaires

Cela se produit même si je cours sur l'émulateur et sur l'image du système d'émulateur libz.so est là dans le bon endroit. Donc, cela semble improbable. En outre, les erreurs que vous obtenez lorsqu'elles ne peuvent pas trouver une bibliothèque sont différentes.



2
votes

La manière dont j'ai débogué ce type de non-sens consiste à créer une petite bibliothèque d'assistance qui appelle dlopen () et signale toute erreur. Le code C ++ est assez long, mais est presque tout la chaudière: xxx

puis je crée une classe Java, com.cowlark.android.utils , comme suit: xxx

maintenant tout cela est fait, je peux insérer le code suivant dans ma classe d'application actuelle: xxx

si Si libdodgy.so ne parvient pas à charger, je reçois un message d'erreur réellement informatif.

Ce truc m'a sauvé si beaucoup de temps dans le passé.


5 commentaires

Consultez mon édition que j'ai faite sur votre réponse, il contient ce qui s'est passé de faire ce truc dans mon scénario. Fondamentalement, j'ai eu ceci: essayé dlopen de Handin = 0xb0012c08 Erreur: Symbole non trouvé: Essayer dlopen de Handin = 0xB0012D20 Erreur: (null) Essayer dlopen de Handin = 0xb0012e38 Erreur: (null) essaye dlopen de , alors le même SEGV a rapporté initialement. Aucune information supplémentaire sur le SEGV


Je vois le drôle lors du chargement de libpcre, mais c'est libsharedb qui en dépend de cela et c'était heureux. Je pense que puisqu'il mure en raison d'un SEGV, votre tour pourrait ne pas fournir d'informations supplémentaires ??


C'est très étrange - il semble que cela écrisse à l'intérieur l'appel à dlopen () . Ce que cela ne devrait pas. Je suis également surpris par le fait que l'erreur de charge pour libpcre.so ne vous dit pas quel symbole ne pouvait pas être trouvé; ça fait pour moi. Je vois que vous courez Eclair, qui a une version très ancienne et humide du code JNI. Je suggérerais de l'exécuter dans une image d'émulateur de sandwich à la crème glacée (ou un vrai téléphone, si vous en avez une) et voyez ce qui se passe là-bas.


Même chose sur un périphérique 2.2 vs 2.1 Émulateur. Va essayer l'émulateur ICS ensuite.


@David: J'ai copié la modification suggérée de Corbin dans sa question, s'il vous plaît, donnez-lui un look si vous êtes enclin.



3
votes

Basé sur votre réponse à David donné où Dlopen se plaint d'un symbole manquant, une autre chose à essayer qui m'a aidé est de prendre tous les fichiers .O de votre bibliothèque partagée xxx p > Avec les personnes dépendantes copiées de tout appareil Android et les déchargez tous dans un répertoire, puis essayez de relier tous les fichiers .O de votre LIB partagée avec G ++ à partir de la chaîne d'outils autonome. Cela peut finir par être un peu fidèlement et une poursuite d'oie sauvage potentielle, mais cela peut vous montrer tous les symboles manquants.

La ligne que j'utilise pour lier est xxx


10 commentaires

Juste une pensée, vous pouvez essayer de copier le libc.so et gnustl_shared et d'exécuter la version à outils de la machine à outils de NM ou de la rétendation pour déterminer quelle fonction est à environ 0000E7C8 et 00063CD4, car cela peut vous donner une idée de ce qui se passe tort. Vous pourriez également essayer d'ajouter vos Makefiles NDK pour voir s'il y a quelque chose d'étrange comme amenant la mauvaise version de quelque chose?


J'ai confirmé que ce n'est pas un problème de liaison, similaire à celui suggéré. Aura l'air plus dans ce qui est à ces adresses.


J'ai un autre poignard aléatoire dans le noir, ce Stackoverflow.com/questions/6551670/... a une trace de pile (très) vaguement similaire, mais je peux voir dans votre cas que vous exécutez sur un appareil à bras. Vous n'êtes pas par hasard pour la compilation de X86?


Et il y a ce Stackoverflow.com/Questtions/5776594/... qui affirme qu'il s'agisse d'un bogue de firmware sur votre téléphone. Exécutez-vous une ROM personnalisée ou pouvez-vous mettre à jour?


/ Modifier la frappe Le X86 devine, je peux voir de l'en-tête elfe que la lib est construite pour le bras.


Une dernière chose, il sera intéressant de voir ce que NM décharge pour votre /ystem/lib/libc.so à E7C8, car je ne trouve aucune libc.so qui monte à cette adresse.


J'ai ajouté la sortie de Addr2line à ma description. Je peux voir que le problème a quelque chose à voir avec l'affectation d'une chaîne ou d'une chaine. Comment puis-je savoir où l'initialisation statique est dans le code source de la bibliothèque qui cause ce problème?


S'il s'agit d'une initialisation statique, ce qui serait de ma meilleure hypothèse également (bien que je m'attendais toujours à un cadre de pile dans votre code, je reste à corriger) alors à ce stade, je dirais que la seule voie à suivre est la division et conquérir. Essayez de commenter / mettre en place tous les appels natifs dans votre emballage JNI et voyez si la nouvelle Light Library se charge ou a le même problème. S'il a le problème, examinez ensuite toutes les statiques de là, ajoutez-vous autrement des bits indigènes une à la fois ou dans n'importe quel autre modèle de recherche que vous avez envie et continuez jusqu'à ce que vous trouviez au moins la zone qui se passe mal. Désolé je ne peux pas m'empêcher que ça


Je vous remercie pour vos efforts. Vous donner ça. En outre, en utilisant Addr2line sur une partie de ce qui était sur la pile. Devait calculer le vrai PC pour déterminer ce que RDR de l'alimenter. Postera l'exemple plus tard.


Wil, à propos de libc, vous devez saisir le même libc.SO que j'utilise, il peut être différent par libération Android, voire par appareil, mais ils doivent être compatibles avec une nouvelle version, mais cela ne vous aide pas si vous tentent d'utiliser addr2line. Donc, j'ai couru le même scénario sur l'émulateur 2.1, puis utilisé unyaffs.exe sur le système.img trouvé sous Android-SDKS \ Platforms \ Android-7 \ images pour obtenir le libc.so. Ensuite, j'ai utilisé Addr2line et cela m'a donné ce que j'ai ajouté à ma question.



0
votes

J'ai reasé cette question de manière plus straghtforward, mais je n'ai toujours pas eu de solution. Mais, je l'ai compris. Voir la réponse que j'ai posté ici:

Besoin d'aide pour le débuger plus loin dans Un problème SEGV - Android NDK

J'ai donné à la prime à la personne qui était la plus utile. Merci wil pour avoir essayé si fort d'aider! J'ai déjà essayé Addr2line avant de le mentionner, mais votre commentaire m'a fait revenir en arrière et l'essayer à nouveau. Ensuite, je dois penser ... Qu'en est-il de ces autres parties de la trace plus bas.


0 commentaires