Espace de noms Linker

L'éditeur de liens dynamique relève deux défis de la conception du VNDK Treble:

  • Bibliothèques partagées SP-HAL et leurs dépendances, y compris VNDK-SP bibliothèques, sont chargées dans des processus de framework. Il devrait y avoir pour éviter les conflits de symboles.
  • dlopen() et android_dlopen_ext() peuvent introduire certaines dépendances d'exécution qui ne sont pas visibles au moment de la compilation et peuvent être difficiles à détecter à l'aide d'une analyse statique.

L'espace de noms Linker permet de résoudre ces deux problèmes. sur le mécanisme d'attention. Ce mécanisme est fourni par l'éditeur de liens dynamique. Il vous pouvez isoler les bibliothèques partagées dans différents espaces de noms de l'éditeur de liens, Les bibliothèques ayant le même nom de bibliothèque, mais avec des symboles différents n'entreront pas en conflit.

D'autre part, le mécanisme d'espace de noms de l'éditeur de liens offre la flexibilité nécessaire afin que certaines bibliothèques partagées puissent être exportées par un espace de noms d'éditeur de liens et utilisées par un autre espace de noms de l'éditeur de liens. Ces bibliothèques partagées exportées peuvent interfaces de programmation d'application publiques pour d'autres programmes tout en en masquant les détails de leur implémentation dans leur espace de noms de l'éditeur de liens.

Par exemple, /system/lib[64]/libcutils.so et /system/lib[64]/vndk-sp-${VER}/libcutils.so sont deux partagés bibliothèques. Ces deux bibliothèques peuvent avoir des symboles différents. Elles sont chargées dans différents espaces de noms de l'éditeur de liens, de sorte que les modules du framework puissent dépendre Les bibliothèques partagées /system/lib[64]/libcutils.so et SP-HAL peuvent dépend de /system/lib[64]/vndk-sp-${VER}/libcutils.so.

En revanche, /system/lib[64]/libc.so est un exemple de Une bibliothèque publique exportée par un espace de noms d'éditeur de liens et importée dans de nombreux espaces de noms. Les dépendances de /system/lib[64]/libc.so, par exemple libnetd_client.so, sont chargées dans l'espace de noms dans lequel /system/lib[64]/libc.so se trouve. Les autres espaces de noms n'auront pas accès à ces dépendances. Ce encapsule les détails de l'implémentation tout en fournissant au public de commande.

Fonctionnement

L'éditeur de liens dynamiques charge les bibliothèques partagées spécifiées dans les entrées DT_NEEDED ou dans les bibliothèques partagées spécifiées par l'argument dlopen() ou android_dlopen_ext(). Dans les deux dans ce cas, l'éditeur de liens dynamique trouve l'espace de noms de l'éditeur de liens dans lequel l'appelant réside et tente de charger les dépendances dans le même espace de noms de l'éditeur de liens. Si l'éditeur de liens dynamique ne peut pas charger la bibliothèque partagée dans l'éditeur de liens spécifié. il demande à l'espace de noms de l'éditeur de liens associé le nom de l'éditeur partagé bibliothèques.

Format du fichier de configuration

Le format du fichier de configuration est basé sur le format de fichier INI. Une configuration type de configuration Terraform se présente comme suit:

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

[system]
additional.namespaces = sphal,vndk

namespace.default.isolated = true
namespace.default.search.paths = /system/${LIB}
namespace.default.permitted.paths = /system/${LIB}/hw
namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}
namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

namespace.sphal.isolated = true
namespace.sphal.visible = true
namespace.sphal.search.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.permitted.paths = /odm/${LIB}:/vendor/${LIB}
namespace.sphal.asan.search.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.search.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.asan.permitted.paths  = /data/asan/odm/${LIB}:/odm/${LIB}
namespace.sphal.asan.permitted.paths += /data/asan/vendor/${LIB}:/vendor/${LIB}
namespace.sphal.links = default,vndk
namespace.sphal.link.default.shared_libs = libc.so:libm.so
namespace.sphal.link.vndk.shared_libs = libbase.so:libcutils.so

namespace.vndk.isolated = true
namespace.vndk.search.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.permitted.paths = /system/${LIB}/vndk-sp-29
namespace.vndk.links = default
namespace.vndk.link.default.shared_libs = libc.so:libm.so

[vendor]
namespace.default.isolated = false
namespace.default.search.paths = /vendor/${LIB}:/system/${LIB}

Le fichier de configuration comprend les éléments suivants:

  • Plusieurs propriétés de mappage de sections de répertoire au début du fichier dynamique pour sélectionner la section efficace.
  • Plusieurs sections de configuration des espaces de noms Linker: <ph type="x-smartling-placeholder">
      </ph>
    • Chaque section contient plusieurs espaces de noms (sommets de graphique) et plusieurs Liens de remplacement entre les espaces de noms (arcs de graphique).
    • Chaque espace de noms possède sa propre isolation, ses chemins de recherche, ses chemins autorisés, et les paramètres de visibilité.

Les tableaux ci-dessous décrivent chaque propriété en détail.

Propriété de mappage de section de répertoire

Propriété Description Exemple

dir.name

Un chemin d'accès à un répertoire que la section [name] s'applique.

Chaque propriété mappe les exécutables du répertoire sur un éditeur de liens. de configuration des espaces de noms. Il peut y avoir deux propriétés (ou plus) qui ont le même name, mais qui pointent vers des valeurs différentes répertoires.

dir.system = /system/bin
dir.system = /system/xbin
dir.vendor = /vendor/bin

Cela indique que la configuration spécifiée dans le La section [system] s'applique aux exécutables chargés à partir de /system/bin ou de /system/xbin.

La configuration spécifiée dans la section [vendor] s'applique aux exécutables chargés depuis /vendor/bin.

Propriétés de la relation

Propriété Description Exemple
additional.namespaces

Liste d'espaces de noms supplémentaires séparés par une virgule (en plus des default) pour la section.

additional.namespaces = sphal,vndk

Cela indique qu'il existe trois espaces de noms (default, sphal et vndk) dans [system] configuration.

namespace.name.links

Liste d'espaces de noms de remplacement séparés par une virgule.

Si aucune bibliothèque partagée est introuvable dans l'espace de noms actuel, la classe dynamique linker tente de charger la bibliothèque partagée à partir des espaces de noms de remplacement. La spécifié au début de la liste a une priorité plus élevée.

namespace.sphal.links = default,vndk

Si une bibliothèque partagée ou un exécutable demande une bibliothèque partagée qui ne peut pas être chargé dans l'espace de noms sphal, l'éditeur de liens dynamiques tente de charger la bibliothèque partagée à partir du default espace de noms.

Si la bibliothèque partagée ne peut pas être chargée default, l'éditeur de liens dynamique tente de charger l'objet bibliothèque partagée depuis l'espace de noms vndk.

Enfin, si toutes les tentatives échouent, l'éditeur de liens dynamique renvoie une erreur.

namespace.name.link.other.shared_libs

Liste de bibliothèques partagées séparées par un signe deux-points dans lesquelles les internautes peuvent effectuer des recherches Les espaces de noms other lorsque ces bibliothèques sont introuvables dans le name.

Impossible d'utiliser cette propriété avec namespace.name.link.other.allow_all_shared_libs

namespace.sphal.link.default.shared_libs = libc.so:libm.so

Cela indique que le lien de remplacement n'accepte que libc.so. ou libm.so comme nom de bibliothèque demandé. L'éditeur de liens dynamiques ignore le lien de remplacement de sphal vers default si le nom de bibliothèque demandé n'est pas libc.so ou libm.so.

namespace.name.link.other.allow_all_shared_libs

Valeur booléenne indiquant si toutes les bibliothèques partagées peuvent être recherchées dans l'espace de noms other lorsque ces bibliothèques ne peuvent pas se trouve dans l'espace de noms name.

Impossible d'utiliser cette propriété avec namespace.name.link.other.shared_libs

namespace.vndk.link.sphal.allow_all_shared_libs = true

Cela indique que tous les noms de bibliothèques peuvent passer par le lien de remplacement. de vndk à l'espace de noms sphal.

Propriétés de l'espace de noms

Propriété Description Exemple
namespace.name.isolated

Valeur booléenne indiquant si l'éditeur de liens dynamique doit vérifier où se trouve la bibliothèque partagée.

Si isolated est défini sur true, seules les bibliothèques partagées qui se trouvent dans l'un des répertoires search.paths (à l'exclusion des sous-répertoires) ou se trouvent sous l'un des Les répertoires permitted.paths (y compris les sous-répertoires) peuvent être chargé.

Si isolated est défini sur false (par défaut), la valeur l'éditeur de liens ne vérifie pas le chemin d'accès aux bibliothèques partagées.

namespace.sphal.isolated = true

Cela indique que seules les bibliothèques partagées dans search.paths ou moins de permitted.paths peuvent être dans l'espace de noms sphal.

namespace.name.search.paths

Liste de répertoires séparés par un signe deux-points à rechercher dans les répertoires partagés bibliothèques.

Les répertoires spécifiés dans search.paths sont précédés d'un préfixe au nom de bibliothèque demandé si la fonction appelle dlopen() ou Les entrées DT_NEEDED ne spécifient pas le chemin d'accès complet. Répertoire spécifié au début de la liste a une priorité plus élevée.

Lorsque isolated est défini sur true, les bibliothèques partagées qui se trouvent dans l'un des répertoires search.paths (sauf sous-répertoires) peuvent être chargés, quel que soit le permitted.paths .

Par exemple, si search.paths est Les champs "/system/${LIB}" et "permitted.paths" sont vides, /system/${LIB}/libc.so peut être chargé, mais Impossible de charger /system/${LIB}/vndk/libutils.so.

namespace.default.search.paths = /system/${LIB}

Cela indique que l'éditeur de liens dynamiques recherche /system/${LIB} pour les bibliothèques partagées.

namespace.name.asan.search.paths

Liste de répertoires séparés par un signe deux-points dans lesquels rechercher des bibliothèques partagées lorsque AddressSanitizer (ASan) est activé.

namespace.name.search.paths correspond à ignoré lorsque ASan est est activé.

namespace.default.asan.search.paths = /data/asan/system/${LIB}:/system/${LIB}

Cela indique que lorsque ASan est activé l'éditeur de liens dynamiques recherche d'abord /data/asan/system/${LIB}, puis recherche /system/${LIB}.

namespace.name.permitted.paths

Une liste de répertoires (y compris les sous-répertoires) séparés par le signe deux-points, où l'éditeur de liens dynamiques peut charger les bibliothèques partagées (en plus search.paths) lorsque isolated est true

Les bibliothèques partagées qui se trouvent dans les sous-répertoires de permitted.paths peut également être chargé. Par exemple, si "permitted.paths" est "/system/${LIB}", à la fois /system/${LIB}/libc.so et /system/${LIB}/vndk/libutils.so peut être chargé.

Si isolated est false, Les permitted.paths sont ignorés et un avertissement est émis.

namespace.default.permitted.paths = /system/${LIB}/hw

Cela indique que les bibliothèques partagées sous /system/${LIB}/hw peut être chargé dans l'emplacement isolé default.

Par exemple, sans permitted.paths, Impossible de charger libaudiohal.so /system/${LIB}/hw/audio.a2dp.default.so dans la default.

namespace.name.asan.permitted.paths

Liste des répertoires, séparés par un signe deux-points, dans lesquels l'éditeur de liens dynamique peut être chargé les bibliothèques partagées lorsque ASan est activé.

namespace.name.permitted.paths correspond à ignoré lorsque ASan est activé.

namespace.default.asan.permitted.paths = /data/asan/system/${LIB}/hw:/system/${LIB}/hw

Cela indique que lorsque ASan est activé des bibliothèques partagées sous /data/asan/system/${LIB}/hw ou /system/${LIB}/hw peut être chargé dans l'instance isolée default.

namespace.name.visible

Valeur booléenne indiquant si le programme (autre que libc) peut obtenir un handle d'espace de noms d'éditeur de liens avec android_get_exported_namespace() et ouvrir une bibliothèque partagée dans l'espace de noms de l'éditeur de liens en transmettant android_dlopen_ext()

Si visible est true, android_get_exported_namespace() renvoie toujours le handle si l'espace de noms existe.

Si visible est défini sur false (par défaut), android_get_exported_namespace() renvoie toujours NULL, quelle que soit la présence de l'espace de noms. Bibliothèques partagées ne peuvent être chargés dans cet espace de noms que si (1) ils sont demandés par un autre espace de noms éditeur doté d'un lien de remplacement vers cet espace de noms, ou (2) ils sont demandées par d'autres bibliothèques partagées ou exécutables dans cet espace de noms.

namespace.sphal.visible = true

Cela indique que android_get_exported_namespace("sphal") peut renvoyer un handle d'espace de noms valide.

Création d'un espace de noms Linker

Dans Android 11, la configuration de l'éditeur de liens est créée au moment de l'exécution sous /linkerconfig au lieu d'utiliser des fichiers en texte brut dans ${android-src}/system/core/rootdir/etc La configuration est générée au démarrage en fonction de l'environnement d'exécution, ce qui inclut les éléments suivants:

  • Si l'appareil est compatible avec le VNDK
  • Version du VNDK cible de la partition du fournisseur
  • Version VNDK de la partition de produits
  • Modules APEX installés

La configuration de l'éditeur de liens est créée en résolvant les dépendances entre les espaces de noms de l'éditeur de liens. Pour Par exemple, s'il existe des mises à jour des modules APEX incluant des mises à jour de dépendances, est générée pour refléter ces modifications. Plus de détails pour créer une configuration Linker se trouvent dans ${android-src}/system/linkerconfig

Isolation de l'espace de noms Linker

Il existe trois types de configuration. En fonction de la valeur de PRODUCT_TREBLE_LINKER_NAMESPACES et BOARD_VNDK_VERSION dans BoardConfig.mk, les la configuration correspondante est générée au démarrage.

PRODUCT_TREBLE_
LINKER_NAMESPACES
BOARD_VNDK_
VERSION
Configuration sélectionnée Exigence VTS
true current VNDK Obligatoire pour les appareils lancés avec Android 9 ou version ultérieure
Vide VNDK Lite Obligatoire pour les appareils lancés avec Android 8.x
false Vide Legacy Pour les appareils non aigus

La configuration VNDK Lite isole les bibliothèques partagées SP-HAL et VNDK-SP. Sous Android 8.0, cette doit être le fichier de configuration de l'éditeur de liens dynamique PRODUCT_TREBLE_LINKER_NAMESPACES est true.

La configuration VNDK isole également les bibliothèques partagées SP-HAL et VNDK-SP. De plus, cette configuration fournit l'isolation totale de l'éditeur de liens dynamique. Il garantit que les modules de la partition système ne dépendent pas du bibliothèques dans les partitions du fournisseur et vice versa.

Sur Android 8.1 ou version ultérieure, la configuration VNDK est la configuration par défaut Il est fortement recommandé d'activer l'isolation complète de l'éditeur de liens dynamiques De BOARD_VNDK_VERSION à current.

Configuration VNDK

<ph type="x-smartling-placeholder">

La configuration VNDK isole les dépendances de la bibliothèque partagée entre la partition du système et les partitions du fournisseur. Par rapport à mentionnées dans la sous-section précédente, les différences sont décrits comme suit:

  • Processus de framework

    • default, vndk Les espaces de noms sphal et rs sont créés.
    • Tous les espaces de noms sont isolés.
    • Les bibliothèques partagées du système sont chargées dans l'espace de noms default.
    • Les ressources SP-HAL sont chargées dans l'espace de noms sphal.
    • Les bibliothèques partagées VNDK-SP ont été chargées dans l'espace de noms vndk.
  • Processus pour les fournisseurs

    • Les espaces de noms default, vndk et system sont créés.
    • L'espace de noms default est isolé.
    • Les bibliothèques partagées des fournisseurs sont chargées dans l'espace de noms default.
    • Les bibliothèques partagées VNDK et VNDK-SP sont chargées dans l'espace de noms vndk.
    • Le NDK et ses dépendances sont chargés dans l'espace de noms system.

La relation entre les espaces de noms de l'éditeur de liens est illustrée ci-dessous.

Graphique de l&#39;espace de noms Linker décrit dans la configuration VNDK

Figure 1 : Isolation de l'espace de noms Linker (configuration VNDK).

Dans l'image ci-dessus, LL-NDK et VNDK-SP correspondent à bibliothèques partagées:

  • LL-NDK <ph type="x-smartling-placeholder">
      </ph>
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libGLESv3.so
    • libandroid_net.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libneuralnetworks.so
    • libsync.so
    • libvndksupport.so
    • libvulkan.so
  • VNDK-SP <ph type="x-smartling-placeholder">
      </ph>
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libRSCpuRef.so
    • libRSDriver.so
    • libRS_internal.so
    • libbase.so
    • libbcinfo.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so
    • libz.so

Vous trouverez plus d'informations dans /linkerconfig/ld.config.txt depuis l'appareil.

Configuration de VNDK Lite

À partir d'Android 8.0, l'éditeur de liens dynamique est configuré pour isoler le SP-HAL et les bibliothèques partagées du VNDK-SP de sorte que leurs symboles n'entrent pas en conflit avec d'autres bibliothèques partagées du framework. La relation entre les espaces de noms de l'éditeur de liens est comme indiqué ci-dessous.

Graphique de l&#39;espace de noms Linker décrit dans la configuration de VNDK Lite <ph type="x-smartling-placeholder">
</ph> Figure 2 : Isolation de l'espace de noms Linker (configuration VNDK Lite)

LL-NDK et VNDK-SP désignent les bibliothèques partagées suivantes:

  • LL-NDK <ph type="x-smartling-placeholder">
      </ph>
    • libEGL.so
    • libGLESv1_CM.so
    • libGLESv2.so
    • libc.so
    • libdl.so
    • liblog.so
    • libm.so
    • libnativewindow.so
    • libstdc++.so (pas dans la configuration)
    • libsync.so
    • libvndksupport.so
    • libz.so (déplacé vers VNDK-SP dans la configuration)
  • VNDK-SP <ph type="x-smartling-placeholder">
      </ph>
    • android.hardware.graphics.common@1.0.so
    • android.hardware.graphics.mapper@2.0.so
    • android.hardware.renderscript@1.0.so
    • android.hidl.memory@1.0.so
    • libbase.so
    • libc++.so
    • libcutils.so
    • libhardware.so
    • libhidlbase.so
    • libhidlmemory.so
    • libhidltransport.so
    • libhwbinder.so
    • libion.so
    • libutils.so

Le tableau ci-dessous répertorie la configuration des espaces de noms pour le framework des processus, extrait de la section [system] la configuration de VNDK Lite.

Espace de noms Propriété Valeur
default search.paths /system/${LIB}
/odm/${LIB}
/vendor/${LIB}
/product/${LIB}
isolated false
sphal search.paths /odm/${LIB}
/vendor/${LIB}
permitted.paths /odm/${LIB}
/vendor/${LIB}
isolated true
visible true
links default,vndk,rs
link.default.shared_libs LL-NDK
link.vndk.shared_libs VNDK-SP
link.rs.shared_libs libRS_internal.so
vndk (pour VNDK-SP) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
permitted.paths /odm/${LIB}/hw
/odm/${LIB}/egl
/vendor/${LIB}/hw
/vendor/${LIB}/egl
/system/${LIB}/vndk-sp-${VER}/hw
isolated true
visible true
links default
link.default.shared_libs LL-NDK
rs (pour RenderScript) search.paths /odm/${LIB}/vndk-sp
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-sp-${VER}
/odm/${LIB}
/vendor/${LIB}
permitted.paths
/odm/${LIB} /vendor/${LIB}
/data (pour le noyau RS compilé)
isolated true
visible true
links default,vndk
link.default.shared_libs LL-NDK
libmediandk.so
libft2.so
link.vndk.shared_libs VNDK-SP

Le tableau ci-dessous présente la configuration des espaces de noms pour les processus des fournisseurs, extrait de la section [vendor] la configuration de VNDK Lite.

Espace de noms Propriété Valeur
default search.paths
/odm/${LIB} /odm/${LIB}/vndk
/odm/${LIB}/vndk-sp
/vendor/${LIB}
/vendor/${LIB}/vndk
/vendor/${LIB}/vndk-sp
/system/${LIB}/vndk-${VER}
/system/${LIB}/vndk-sp-${VER}
/system/${LIB} (obsolète)
/product/${LIB} (obsolète)
isolated false

Pour en savoir plus, consultez /linkerconfig/ld.config.txt sur l'appareil.

Historique du document

Modifications apportées à Android 11

  • Dans Android 11, les fichiers ld.config.*.txt statiques sont du codebase. LinkerConfig les génère à la place dans l'environnement d'exécution.

Modifications apportées à Android 9

  • Sous Android 9, l'espace de noms Linker vndk est ajouté au fournisseur les processus et les bibliothèques partagées VNDK sont isolés de l'éditeur de liens par défaut. espace de noms.
  • Remplacer PRODUCT_FULL_TREBLE par une valeur plus spécifique PRODUCT_TREBLE_LINKER_NAMESPACES
  • Android 9 modifie le nom de la configuration de l'éditeur dynamique suivante : .
    Android 8.x Android 9 Description
    ld.config.txt.in ld.config.txt Pour les appareils avec isolation d'espace de noms de l'éditeur de liens d'exécution
    ld.config.txt ld.config.vndk_lite.txt Pour les appareils dotés de l'isolation d'espace de noms de l'éditeur de liens VNDK-SP
    ld.config.legacy.txt ld.config.legacy.txt Pour les anciens appareils équipés d'Android 7.x ou version antérieure
  • Supprimez android.hardware.graphics.allocator@2.0.so.
  • Les partitions product et odm sont ajoutées.