Obtenir l'adresse de début et de fin de la section de texte dans un exécutable
J'ai besoin d'obtenir le début et la fin de l'adresse d'un fichier exécutable du texte de l'article. Comment puis-je l'obtenir?
Je peux obtenir l'adresse de départ de la _init
symbole ou le _start
symbole, mais ce sujet de la fin de l'adresse? Dois-je envisager l'adresse de fin de la text
section à la dernière adresse avant le démarrage de la .rodata
section?
Ou doit-je modifier la valeur par défaut ld script et ajouter mes propres symboles pour indiquer le début et la fin de la section de texte, et de le passer à GCC lors de la compilation? Dans ce cas, où est-ce que je place les nouveaux symboles, devrais-je considérer que l'init et fini l'article?
Ce qui est un bon moyen d'obtenir le début et la fin de l'adresse de la section de texte?
source d'informationauteur phoxis
Vous devez vous connecter pour publier un commentaire.
GNU binutils par défaut de l'éditeur de liens des scripts pour ELF-plateformes normalement définir un certain nombre de symboles différents qui peuvent être utilisés pour trouver le début et la fin des diverses sections.
La fin de la section de texte est généralement référencé par un choix de trois différents symboles:
etext
_etext
ou__etext
; le départ peut être trouvé comme__executable_start
. (Notez que ces symboles sont généralement exportés à l'aide de la FOURNISSEZ une (des) mécanisme, ce qui signifie qu'ils seront annulés si quelque chose d'autre dans votre exécutable définit plutôt que de simplement référencement. En particulier, cela signifie que_etext
ou__etext
sont susceptibles d'être des choix plus sûrs queetext
.)Exemple:
Je ne crois pas que l'un de ces symboles sont spécifiés par la norme, donc il ne devrait pas être supposé pour être portable (je n'ai aucune idée si même GNU binutils leur fournit pour tous ELFE de plates-formes, ou si l'ensemble de symboles fournis a changé au cours des différentes binutils versions), bien que je pense que si: a) vous faites quelque chose qui a besoin de cette information, et b) que vous envisagez d'piraté linker scripts comme une option, puis la portabilité n'est pas trop un souci!
Pour voir l'ensemble exact des symboles que vous obtenez lors de la construction d'une chose en particulier sur une plate-forme en particulier, donner la
--verbose
drapeau àld
(ou-Wl,--verbose
àgcc
) pour imprimer le linker script, il choisit de l'utiliser (il y a vraiment différentes par défaut de l'éditeur de liens des scripts, qui varient selon les options du linker et le type d'objet que vous êtes en train de construire)..rodata
n'est pas garanti de toujours venir directement après.text
. Vous pouvez utiliserobjdump -h file
etreadelf --sections file
pour obtenir plus d'infos. Avec objdump vous obtenez à la fois la taille et la position dans le fichier.Pour Linux, pensez à utiliser
nm(1)
outil pour inspecter ce que les symboles de l'objet fichier fournit. Vous pouvez choisir à travers cet ensemble de symboles, où vous pourrez apprendre à la fois de la signification des symboles que Matthieu Slattery fournis dans sa réponse.