Quelles parties d'un exécutable ELF sont chargées en mémoire et où?

10

Ce que je sais déjà:

Un exécutable ELF a un certain nombre de sections, évidemment les sections .text et .data sont chargées en mémoire car ce sont les parties principales du programme. Mais pour qu'un programme fonctionne, il a besoin de plus d'informations, en particulier lorsqu'il est lié dynamiquement.

Ce qui m'intéresse, ce sont des sections comme .plt, .got, .dynamic, .dynsym, .dynstr etcetera. Les parties de l'ELF qui sont responsables de la liaison des fonctions aux adresses.

D'après ce que j'ai pu comprendre jusqu'à présent, c'est que des choses comme .symtab et .strtab ne sont pas chargées (ou ne restent pas) en mémoire. Mais .dynsym et et .dynstr sont-ils utilisés par l'éditeur de liens? Restent-ils en mémoire? Puis-je y accéder à partir du code du programme?

Et y a-t-il des parties d'un exécutable qui résident dans la mémoire du noyau?

Mon intérêt est principalement médico-légal, mais toute information sur ce sujet vous aidera. Les ressources que j'ai lues sur ces tables et les liens dynamiques sont de plus haut niveau, elles expliquent seulement le fonctionnement, rien de pratique sur le contenu en mémoire.

Faites-moi savoir si quelque chose n'est pas clair sur ma question.

Dutchy
la source

Réponses:

12

Ce qui suit est une très bonne référence: http://www.ibm.com/developerworks/linux/library/l-dynamic-libraries/ . Il contient une bibliographie à la fin d'une variété de références différentes à différents niveaux. Si vous voulez connaître chaque détail sanglant, vous pouvez aller directement à la source: http://www.akkadia.org/drepper/dsohowto.pdf . (Ulrich Drepper a écrit l'éditeur de liens dynamique Linux.)

Vous pouvez obtenir un très bon aperçu de toutes les sections de votre exécutable en exécutant une commande comme "objdump -h myexe" ou "readelf -S myexe".

La section .interp contient le nom du chargeur dynamique qui sera utilisé pour lier dynamiquement les symboles de cet objet. La section .dynamic est une distillation de l'en-tête du programme qui est formatée pour être facile à lire pour le chargeur dynamique. (Il contient donc des pointeurs vers toutes les autres sections.)

Le .got (Global Offset Table) et le .plt (Procedure Linkage Table) sont les deux structures principales qui sont manipulées par l'éditeur de liens dynamique. Le .got est une table d'indirection pour les variables et le .plt est une table d'indirection pour les fonctions. Chaque exécutable ou bibliothèque (qui sont appelés "objets partagés") a ses propres .got et .plt et ce sont des tableaux des symboles référencés par cet objet partagé qui sont réellement contenus dans un autre objet partagé.

Le .dynsyn contient toutes les informations sur les symboles dans votre objet partagé (à la fois ceux que vous définissez et les externes que vous devez référencer.) Le .dynsyn ne contient pas les noms des symboles réels. Ceux-ci sont contenus dans .dynstr et .dynsyn a des pointeurs dans .dynstr. .gnu.hash est une table de hachage utilisée pour une recherche rapide des symboles par leur nom. Il contient également uniquement des pointeurs (pointeurs vers .dynstr et pointeurs utilisés pour créer des chaînes de compartiments).

Lorsque votre objet partagé déréférence un symbole "foo", l'éditeur de liens dynamique doit rechercher "foo" dans tous les objets dynamiques auxquels vous êtes lié pour déterminer lequel contient le "foo" que vous recherchez (et ensuite ce que le parent l'adresse de "foo" se trouve à l'intérieur de cet objet partagé.) L'éditeur de liens dynamique effectue cela en recherchant la section .gnu.hash de tous les objets partagés liés (ou la section .hash pour les anciens objets partagés qui n'ont pas de .gnu. section de hachage.) Une fois qu'il trouve la bonne adresse dans l'objet partagé lié, il le place dans le .got ou .plt de votre objet partagé.

Logique errante
la source
Merci, vos liens me poussent un peu plus loin dans la recherche des mappages virtuels des sections dont j'ai besoin. Comme mon intérêt pour cette question est médico-légale, "chargé dans la DRAM" est toujours pertinent pour moi. Si une section est mappée mais jamais chargée, je ne pourrai pas la trouver dans un vidage de mémoire :)
Dutchy
Tu as raison. Lorsque vous effectuez le vidage de la mémoire, vous obtiendrez une copie de chaque page mappée, donc ma distinction entre "mappé dans vm" et "chargé dans DRAM" n'était pas pertinente. J'ai supprimé cette phrase et la réponse est améliorée. Je vous remercie!
Wandering Logic
Marqué votre réponse comme la réponse, car c'est autant d'informations que je vais obtenir :) devra faire le reste moi-même, c'est ma recherche après tout.
Dutchy
Donc, oui .dynsym et et .dynstr (et autres) sont utilisés par l'éditeur de liens dynamiques et sont chargés dans la mémoire du programme (dans le segment de texte) et pourraient être utilisés au moment de l'exécution par votre programme.
ysdx