echo 'main(){}' | gcc -xc - -o /dev/stdout | ???
Existe-t-il un moyen d'exécuter le binaire de sortie sur un système de type Unix?
EDIT: J'en avais besoin pour exécuter la sortie de g ++ dans un environnement en bac à sable où je ne peux écrire aucun fichier (rien de malveillant, je le promets).
shell
executable
stdout
Alex B
la source
la source
csh
.Réponses:
Je ne pense pas que ce soit possible. L' appel système exec (2) nécessite toujours un nom de fichier ou un chemin absolu (le nom de fichier est toujours a
char*
).posix_spawn
a également des exigences similaires pour un nom de fichier.Le mieux que vous puissiez faire est de diriger la sortie vers un canal nommé et d'essayer de l'exécuter à partir du canal. Cela peut fonctionner, bien que le shell puisse refuser d'exécuter tout fichier dont les
--x--x--x
bits ne sont pas définis. Créez le tuyau avecmkfifo(1)
et voyez si vous pouvez le faire fonctionner.Une autre approche consisterait à écrire quelque chose qui lit l'entrée standard, écrit un fichier dans une zone temporelle, y définit les bits --x, les fourches et les exécutables, puis supprime le fichier. L'inode et le contenu resteront jusqu'à la fin de l'exécution du programme, mais ils ne seront pas accessibles via le système de fichiers. À la fin du processus, l'inode sera libéré et le stockage sera retourné à la liste gratuite.
EDIT: Comme le souligne Mat, la première approche ne fonctionnera pas car le chargeur tentera d'exiger une page dans l'exécutable, ce qui générera un trafic de recherche aléatoire sur le fichier, et ce n'est pas possible sur un canal. Cela laisse une sorte d'approche comme la seconde.
la source
Une solution utilisant memfd syscall: https://github.com/abbat/elfexec
Il crée un descripteur de fichier nommé en mémoire qui pourrait être utilisé dans
exec
. Un pseudo-code:la source
memfd.h
tête à moins que vous ne vouliez l'utiliserMFD_CLOEXEC
(ce qui cassera les#! /bin/sh
scripts à cause des bogues dans linux 'fexecve()
). Ce n'est pas trop compliqué, vous pouvez inclure un échantillon de travail de 20 lignes dans votre réponse (par exemple, ce git gist - bien que ce ne soit pas un remplacement pour votreelfexec
, car cela vous permettra également de spécifierargv[0]
et d'exécuter un binaire uniquement à partir d'un tuyau (mandaté par UUoC ;-)).o
fichiers dans / tmp et mourra s'il ne le peut pas.Vous pouvez essayer tcc , qui compilera et exécutera un programme en une seule étape, sans écrire de fichiers intermédiaires. Ce n'est pas gcc, ce qui peut être un problème pour vous, mais il est spectaculairement rapide, il peut donc même mieux miser que gcc pour vos besoins.
la source
Cela exécutera automatiquement la compilation de votre code, mais créera un fichier (temporairement) sur le système de fichiers afin de le faire.
(Je suis en train de tester cela maintenant, mais je suis presque sûr que cela, ou quelque chose de proche fonctionnera pour vous)
EDIT: Si le but de votre tuyauterie est de couper les disques physiques de l'équation de la vitesse, envisagez de créer un disque RAM pour contenir le fichier intermédiaire.
la source
csh
.Tout comme @TheQUUX l'a suggéré, je ne l'ai pas testé moi-même mais vous voudrez peut-être essayer
cling
- "l'interpréteur C ++ interactif, construit au-dessus des bibliothèques LLVM et Clang.".Trouvez plus d'informations ici: https://cdn.rawgit.com/root-project/cling/master/www/index.html
la source