6
votes

Manière simple de réorganiser les sections de fichier Elf

Je cherche un moyen simple de réorganiser les sections de fichiers ELF. J'ai une séquence de sections personnalisées que je voudrais que tous soient alignées dans un certain ordre.

La seule façon dont j'ai trouvé comment faire est d'utiliser un script de liaison. Cependant, la documentation indique que la spécification d'un script de liaison personnalisé remplace la valeur par défaut. Le script de liaison par défaut a beaucoup de contenu que je ne souhaite pas avoir à dupliquer dans mon script personnalisé pour obtenir trois sections toujours ensemble dans un certain ordre. Il ne semble pas très flexible au code difficile du comportement de la liaison comme celui-là.

Pourquoi est-ce que je veux faire cela? J'ai une section de données que j'ai besoin de connaître l'emplacement de la mémoire d'exécution de (début et fin). Donc, j'ai créé deux autres sections et mettre des variables sentinelles en eux. Je veux ensuite utiliser les emplacements de mémoire de ces variables pour connaître l'étendue de la section inconnue en mémoire. xxx

dans l'exemple ci-dessus, je saurais que les données de. Targetsection est entre l'adresse de Markera et Markerb.

Y a-t-il une autre façon d'accomplir cela? Y a-t-il des bibliothèques qui me permettraient de lire dans l'image d'ELF actuellement exécutée et de déterminer la section Emplacement et taille de la section?


4 commentaires

Quelle est votre chaîne d'outils (compilateur / liaison)? Vous pouvez copier-coller le script de liaison par défaut dans un autre fichier et ne changer que ce que vous voulez ...


J'utilise GCC. Je sais que je peux exporter le script de liaison actuel, le modifier et l'utiliser. Cependant, il y a des centaines de ces applications, non toutes développées par notre équipe et je détesterais les avoir tous liés à une "vieille" version du script de liaison. J'espérais qu'il y avait un moyen de commander des sections sans me mettre furtif dans le reste du comportement de la liaison.


Y a-t-il une raison pour laquelle vous utilisez des scripts de liaison? Peut-être que vous pouvez placer vos variables dans la structure de données de cadre (structure, classe, ...) et allouer une variable statique.


Comme l'auteur de la bibliothèque doit connaître la plage de mémoire de la section. Je ne souhaite pas imposer aucune exigence sur les écrivains d'application (une autre équipe) en plus de mettre les variables dans la section correcte.


4 Réponses :


4
votes

Vous pouvez obtenir des adresses de sections chargées en analysant le format de fichier ELF. Les détails peuvent être trouvés par ex. dans

  • Norme d'interface de l'outil (TIS) Spécification des formats portables, version 1.2 (http://refspecs.freestandards.org/elf/elf.pdf)

    Pour une courte impression que l'information est disponible sa valeur à jeter un coup d'œil à la liberté xxx

    renvoie une liste de toutes les sections contenues dans.

    1. Les sections qui ont été cartographiées en mémoire ont été typées progrès.
    2. L'adresse que vous recherchez est affichée dans la colonne Addr.
    3. Pour obtenir l'emplacement de la mémoire que vous devez ajouter l'adresse de charge de votre Objet exécutable / partagé

      Il existe quelques façons de déterminer l'adresse de charge de votre objet exécutable / partagé:

      1. Vous pouvez analyser / proc / [PID] / Maps (la première colonne contient l'adresse de charge). [PID] est l'ID de processus
      2. Si vous connaissez une seule fonction contenue dans votre fichier, vous pouvez appliquer dlsym pour recevoir un pointeur sur la fonction. Ce pointeur est le paramètre d'entrée pour dladdr renvoyer un dl_info struct contenant l'adresse de charge demandée

        Pour obtenir des informations sur elfe la bibliothèque

        • LIBEFF

          peut être un compagnon utile (je l'ai détecté après avoir étudié le TIS mentionné ci-dessus, donc je n'ai fait qu'un regarde court et je ne connais que des détails plus profonds)

          J'espère que cela L'esquisse d'une solution possible aidera.


0 commentaires

1
votes

Vous pouvez envisager d'utiliser les initialiseurs de GCC pour référencer les variables qui entraient dans une section distincte autrement et entretenir tous leurs pointeurs dans un tableau. Je recommande d'utiliser des initialiseurs car ce fichier fonctionne indépendamment.


0 commentaires

0
votes

Vous pouvez regarder bibliothèque elfio . Il contient des exemples WriteObj et Writer. En utilisant la bibliothèque, vous pourrez créer / modifier le fichier binaire ELF de manière programmatique.


0 commentaires

0
votes

J'ai peur de remplacer le script de liaison par défaut est la solution simple.

Depuis que vous êtes inquiet pour ne pas être flexible (même je pense que le script de liaison change cela souvent), vous pouvez écrire un script pour générer un script de liaison basé sur le script LD par défaut du système hôte ("LD --VERBose"). et insérez vos sections spéciales.


0 commentaires