web-dev-qa-db-fra.com

mylib.so a des relocalisations de texte. Cela gaspille de la mémoire et constitue un risque pour la sécurité. S'il-vous-plaît, réparez

Mon Android (à l'aide d'une bibliothèque native) affiche cet avertissement sur Android 4.4:

l'éditeur de liens mylib.so contient des relocalisations de texte. Cela gaspille de la mémoire et constitue un risque pour la sécurité. S'il-vous-plaît, réparez.

Avez-vous une idée de ce que c'est et comment y remédier? Merci,

41
Jerome

Cela semblerait résulter de deux bogues ndk-gcc mentionnés à l'emplacement https://code.google.com/p/Android/issues/detail?id=232

et a déclaré avoir été corrigé à partir de ndk-r8c.

Il semblerait que la vérification des bibliothèques avec le problème n'ait été ajoutée que récemment.

Remarque: veuillez ne pas éditer ce message pour masquer l'URL du lien. C'est explicite parce que la destination est ce qui la rend autoritaire.

Remarque complémentaire La modification des versions de NDK n’est un correctif que lorsque l’avertissement est dû au code de votre application. Cela n'aura aucun effet si l'avertissement se trouve plutôt sur un composant système tel que libdvm - qui ne peut être corrigé que par une mise à jour du système.

26
Chris Stratton

Vous devez rendre le code indépendant de votre position de bibliothèque ... add -fpic ou -fPIC à ton LOCALC_FLAGS dans votre Android.mk et vous devez également vous assurer que vous ne créez pas de lien avec des bibliothèques statiques ou partagées contenant des relocalisations de texte. S'ils le font et que vous pouvez les recompiler, utilisez l'un des drapeaux mentionnés ci-dessus.

En bref, vous devez compiler votre bibliothèque avec l’un des drapeaux -fpic Ou -fPIC, Où [~ # ~] pic [~ # ~] est une abréviation de Code indépendant de la position .

La réponse longue est que votre yourlib.so a été compilé d'une manière non conforme à Google Android standard pour un fichier ELF, où cette entrée Dynamic Array Tag est inattendue. Dans le meilleur des cas, la bibliothèque sera toujours exécutée, mais il s'agira toujours d'une erreur et la future version d'AOS ne lui permettra probablement pas de s'exécuter.

DT_TEXTREL 0x16 (22)

Pour vérifier ce qui se trouve dans votre bibliothèque, utilisez quelque chose le long de la ligne:

# readelf --wide -S yourlib.so

There are 37 section headers, starting at offset 0x40:

Section Headers:
  [Nr] Name              Type            Address          Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            0000000000000000 000000 000000 00      0   0  0
  [ 1] .text             PROGBITS        0000000000000000 002400 068f80 00  AX  0   0 16
  [ 2] .rodata           PROGBITS        0000000000000000 06b380 05ad00 00  WA  0   0 32
  ...
  [16] .rela.text        RELA            0000000000000000 26b8e8 023040 18     14   1  8
  ...
  [36] .rela.debug_frame RELA            0000000000000000 25a608 0112e0 18     14  27  8

Key to Flags:
  W (write), A (alloc), X (execute), M (merge), S (strings), l (large)
  I (info), L (link order), G (group), T (TLS), E (exclude), x (unknown)
  O (extra OS processing required) o (OS specific), p (processor specific)

Veuillez consulter ma réponse détaillée sur le sujet, pour plus de détails DT entry. Pour plus de détails sur la façon d'écrire des bibliothèques dynamiques appropriées c'est une lecture incontournable .

3
not2qubit

J'ai la même erreur avec mon application. L'application utilisait un démon natif qui utilisait une bibliothèque native qui n'implémentait pas toutes les fonctions de son fichier d'en-tête. Lorsque j'ai ajouté les implémentations requises à la bibliothèque native, tout fonctionnait bien.

Je ne sais pas si vous avez exactement le même problème, mais cela signifie probablement que votre côté natal a un déséquilibre.

1
Ravit D