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à. P>
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. P> dans l'exemple ci-dessus, je saurais que les données de. Targetsection est entre l'adresse de Markera et Markerb. P> 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? P> P>
4 Réponses :
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
Pour une courte impression que l'information est disponible sa valeur à jeter un coup d'œil à la liberté p> renvoie une liste de toutes les sections contenues dans. p> Il existe quelques façons de déterminer l'adresse de charge de votre objet exécutable / partagé: p> Pour obtenir des informations sur elfe la bibliothèque p> 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) p> J'espère que cela L'esquisse d'une solution possible aidera. p> p>
dlsym code> pour recevoir un pointeur sur la fonction. Ce pointeur est le paramètre d'entrée pour
dladdr code> renvoyer un
dl_info code> struct contenant l'adresse de charge demandée li>
ol>
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. P>
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. P>
J'ai peur de remplacer le script de liaison par défaut est la solution simple. P>
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. P>
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.