echo 'main(){}' | gcc -xc - -o /dev/stdout | ???
Apakah ada cara untuk menjalankan biner keluaran pada sistem seperti unix?
EDIT: Saya membutuhkannya untuk menjalankan output dari g ++ di lingkungan sandboxed di mana saya tidak bisa menulis setiap berkas (tidak berbahaya, aku janji).
shell
executable
stdout
Alex B
sumber
sumber
csh
.Jawaban:
Saya tidak percaya ini mungkin. The exec (2) system call selalu membutuhkan nama file atau path absolut (nama file selalu
char*
).posix_spawn
juga memiliki persyaratan serupa untuk nama file.Yang paling dekat Anda bisa lakukan adalah pipa output ke pipa bernama dan coba jalankan dari pipa. Itu mungkin berhasil, meskipun shell mungkin menolak untuk mengeksekusi file apa pun yang tidak memiliki
--x--x--x
bit yang ditetapkan. Buat pipa denganmkfifo(1)
dan lihat apakah Anda bisa membuatnya bekerja.Pendekatan lain adalah menulis sesuatu yang membaca input standar, menulis file ke area temporay, menetapkan --x bit di atasnya, garpu dan eksekutif kemudian menghapus file. Inode dan konten akan tetap sampai program selesai dieksekusi tetapi tidak dapat diakses melalui sistem file. Ketika proses berakhir inode akan dirilis dan penyimpanan akan dikembalikan ke daftar gratis.
EDIT: Seperti yang ditunjukkan oleh Mat, pendekatan pertama tidak akan berhasil karena loader akan berusaha untuk meminta halaman pada file yang dapat dieksekusi, yang akan menghasilkan lalu lintas pencarian acak pada file, dan ini tidak mungkin dilakukan pada sebuah pipa. Ini meninggalkan semacam pendekatan seperti yang kedua.
sumber
Solusi menggunakan memfd syscall: https://github.com/abbat/elfexec
Itu menciptakan deskriptor file bernama dalam memori yang dapat digunakan di
exec
. Kode semu:sumber
memfd.h
tajuk kecuali Anda ingin menggunakanMFD_CLOEXEC
(yang akan merusak#! /bin/sh
skrip karena bug di linux 'fexecve()
). Itu tidak terlalu rumit, Anda dapat memasukkan sampel 20-baris yang berfungsi dalam jawaban Anda (mis. Inti git ini - meskipun itu bukan pengganti drop-in untuk Andaelfexec
, karena itu juga akan memungkinkan Anda untuk menentukanargv[0]
, dan akan menjalankan biner hanya dari pipa (amanat UUoC ;-)).o
file ke / tmp dan mati jika tidak bisa.Anda dapat mencoba tcc , yang akan mengkompilasi dan menjalankan program dalam satu langkah, tanpa menulis file perantara. Ini bukan gcc, yang mungkin menjadi masalah bagi Anda, tetapi sangat cepat, sehingga bahkan mungkin bertaruh lebih baik daripada gcc untuk tujuan Anda.
sumber
Ini secara otomatis akan menjalankan kompilasi kode Anda, tetapi membuat file (sementara) pada sistem file untuk melakukannya.
(Saya sedang menguji ini sekarang, tapi saya cukup yakin ini, atau sesuatu yang dekat dengan itu akan bekerja untuk Anda)
EDIT: Jika tujuan perpipaan Anda adalah untuk memotong disk fisik dari persamaan untuk kecepatan, pertimbangkan untuk membuat ram ram untuk menyimpan file perantara.
sumber
csh
.Seperti yang disarankan @TheQUUX , saya belum mengujinya sendiri tetapi Anda mungkin ingin mencoba
cling
- "interpreter C ++ interaktif, dibangun di atas perpustakaan LLVM dan Dentang.".Temukan info lebih lanjut di sini: https://cdn.rawgit.com/root-project/cling/master/www/index.html
sumber