Chargement de fichiers .so depuis la mémoire

Duplication possible:
Dlopen de mémoire?

J’ai vu cela pour les fichiers DLL de Windows, étant chargé depuis un tampon de mémoire, mais je ne le trouve nulle part pour Linux, et le code source de “ld” est le code le plus complexe que j’ai jamais vu. Alors:

Existe-t-il un exemple de chargement de fichiers .so à partir de la mémoire? Même un simple que je peux finir? Je ne sais simplement pas par où commencer, même si j’ai lu la plupart des spécifications ELF, cela me semble encore mystérieux.

Vous regardez le code source d’une mauvaise chose: ld ne fait pas le chargement du programme et de la bibliothèque. Au lieu de cela, vous devriez regarder le code source des fonctions dlopen et dlsym trouvées dans libc. En outre, vous devriez regarder la source de l’éditeur de liens dynamic : ld-linux.so (le vrai nom varie avec la plate-forme; exécutez ldd /bin/ls pour savoir où réside l’éditeur de liens dynamic).

L’parsing ELF n’est pas difficile, mais elle nécessite une attention particulière aux détails et à la compréhension du code d’assemblage pour chaque CPU; vous avez également besoin de la spécification ABI pour votre plate-forme (et elle est différente pour Linux 32 et 64 bits, et est également différente entre les processeurs).

Si vous avez juste besoin de charger des fichiers objects depuis la mémoire au moment de l’exécution (cela ne doit pas nécessairement être un SO), vous pouvez regarder le projet X11: ils ont implémenté un système de module qui charge essentiellement du code object adresse et le transfère.

Que signifie “charger des fichiers .so depuis la mémoire”?

Si vous avez un fichier *.so , il se trouve dans un système de fichiers et possède un chemin. Ensuite, utilisez simplement dlopen dessus.

Si ce n’est pas un fichier , c’est quoi? Comment es-tu entré en mémoire? Qu’as-tu exactement en mémoire? (Avez-vous un en-tête ELF et une mise en page ELF en mémoire?)

Si vous avez suffisamment d’informations pour créer un fichier ELF *.so sauvegardez ce fichier dans un système de fichiers (utilisez un système de fichiers temporaire comme tmpfs si vous êtes concerné par les performances du disque). Alors, dlopen ça.

Si vous n’avez pas assez d’informations pour créer un fichier ELF .so , vous construisez probablement du code dynamicment en mémoire. Regardez ce que font les infrastructures existantes de génération de code machine (comme LLVM , GCCJIT , libjit , GNU lightning , LuaJit ….).

Si vous avez un code fonctionnel complet en mémoire, assurez-vous que la mémoire est exécutable avec mmap & mprotect et sautez dedans (par exemple en utilisant des astuces de pointeur de fonction).

Vous avez besoin de la famille de fonctions dlopen () (sous GNU / Linux, elles sont définies dans /usr/include/dlfcn.h).

Pour un exemple, regardez comment PHP fait des modules .