Dupliqué possible: strong>
Dlopen de la mémoire? P> blockQuote>J'ai vu cela pour les fichiers DLL de Windows, en étant chargé à partir d'un tampon de mémoire, mais je ne peux pas le trouver n'importe où pour Linux, et le code source "LD" est le code le plus complexe que j'ai jamais vu. Donc: p>
Y a-t-il un exemple de chargement de fichiers .so de la mémoire? Même un simple que je puisse finir? Je ne sais tout simplement pas où commencer, même si j'ai lu la plupart des spécifications des elfes, il me reste mystérieux. P>
3 Réponses :
Vous envisagez le code source d'une mauvaise chose: L'analyse ELF n'est pas difficile, mais cela nécessite une attention particulière aux détails et à la compréhension du code de l'assemblage pour la CPU en question; Vous avez également besoin de spécification abi pour votre plate-forme (et il est différent pour Linux 32 et 64 bits, et est également différent entre les processeurs.) P>
Si vous avez juste besoin de charger les fichiers d'objet em> de la mémoire à l'heure d'exécution (c'est-à-dire que cela ne doit pas nécessairement être un), vous pouvez consulter le projet X11: ils ont mis en place un module système qui, fondamentalement, charge le code d'objet à une adresse et le transforme. p> ld code> ne fait pas de programme et de chargement de la bibliothèque. Au lieu de cela, vous devez regarder le code source de dlopen code> et dlsym code> des fonctions trouvées dans libc. En outre, vous devez regarder la source de la liant dynamique em> dynamique: ld-linux.so (le vrai nom varie en fonction de la plate-forme; exécuter ldd / bin / ls code> pour savoir où réside la liaison dynamique). P>
Vous avez besoin de dlopen () famille de fonctions (sur GNU / Linux, ils sont définis dans /usr/include/dlfcn.h). P>
Pour un exemple, jetez un coup d'œil à Comment PHP fait-elle des modules . P>
Je sais comment utiliser .so du disque, je veux les utiliser de la mémoire, ils n'existe pas sur le disque
Que signifie "chargement Si vous avez des Si ce n'est pas un fichier em>, qu'est-ce que c'est? Comment avez-vous eu la mémoire? Qu'est-ce que vous avez exactement en mémoire? (Avez-vous un en-tête elfe et une mise en page elfe en mémoire?) P>
Si vous avez suffisamment d'informations pour créer un elfe Si vous n'avez pas assez d'informations pour créer un fichier elf Si vous avez un code fonctionnel complet en mémoire, assurez-vous que la mémoire est exécutable avec MMAP A> & MProtect et sautez-le (par exemple, utiliser des tours de pointeur de fonction). P > .so code> des fichiers de mémoire" signifie à vous? p>
*. Donc code> fichier em>, il est dans certains fichiers et a un chemin. Ensuite, utilisez simplement dlopen code> dessus. P>
*. SO CODE> Fichier, Dump (Ecrire) ce fichier dans un système de fichiers (utilisez un système de fichiers temporaire comme TMPFS code> si Vous êtes concerné par les performances du disque). Alors dlopen code> que. P>
.so code>, vous avez probablement un code de construction dynamique en mémoire. Regardez l'infrastructure génératrice de code machine existante (comme LLVM , gccjit , libjit , GNU Lightning , Luajit ....) font. P>
Je suis assez surpris par les commentaires négatifs. Qu'est-ce que j'ai dit faux? Pourquoi ma réponse n'est-elle pas pertinente?
Ne répondant pas exactement à ce qu'il semble essayer de (obstinément) réaliser la façon dont il veut, mais ces informations sont généralement utiles. +1
Je ne comprends pas exactement l'exactitude de l'affiche originale par "chargement d'un fichier .so code> de la mémoire" ... (ou même charger n'importe quel type de fichier de mémoire), puisqu'un fichier ne peut être lu que à partir d'un système de fichiers. Je suppose que Windows avait une telle fonction car (IIRC) sur Windows Plusieurs processus ne peuvent pas fonctionner dans un fichier à la fois (par exemple, vous ne pouvez pas supprimer un fichier ouvert par un autre processus sous Windows, mais vous pouvez le faire sous Linux) .
Il envisage de passer un fichier .so sur une prise, il a donc le contenu d'un fichier entier en mémoire et veut en vigueur dlopen () code> à partir de là, au lieu de sur disque.
L'affiche originale n'a pas mentionné de doute ou de tuyau. Mais s'il obtient le contenu d'un fichier .so code> fichier elf sur un descripteur de fichier tel (non désapproprié et non recherché, non- MMAP code>, la seule option sensible est de Ecrivez-le sur un fichier, puis dlopen code> ce fichier.
Le .so est envoyé sur une connexion de socket et je cherche un compagnon de solution, pas une alternative.
@killercode Vous recherchez une solution à un problème que vous avez défini de manière assez étroite. Vous manquez actuellement de connaissances pour coder un .so de la mémoire et je veux payer quelqu'un d'autre pour le faire. Les alternatives ont plus de sens, à moins que vous ne puissiez nous donner un contexte.
le .so est envoyé sur des sockets, je ne veux pas l'écrire sur le disque car mon application peut ne pas avoir le privilège d'écrire des fichiers sur le disque. Je veux donc l'exécuter de la mémoire pour éviter tout sur n'importe quelle plate-forme et non seulement Linux.
Tuerercode ... Pourriez-vous trouver votre réponse? Avez-vous du code à afficher?