ein*_*ica 6 bash pipeline execution
由于一些晦涩的原因,我编写了一个 bash 脚本,它生成一些源代码,然后使用
... whatever ... | gcc -x c -o /dev/stdout
Run Code Online (Sandbox Code Playgroud)
现在,我想在编译上执行结果。我怎样才能做到这一点?请不要使用文件。
正如 Charles Duffy 所说,要执行二进制文件,你必须告诉你的操作系统(这似乎是 Unix 变体)加载并执行 \xe2\x80\x93 的内容,而 Unix 系统只接受文件直接执行它们。
\n\n你可以做的是有一个进程来准备一个包含 ELF 二进制文件的内存区域,分叉并跳转到该区域 - 但即使这样也是有问题的,考虑到有 CPU 支持来精确抑制该操作 (R^X)。基本上,您需要的是运行时链接器,而 shell 不(也不应该)包含类似的东西。
\n\n让我们放弃 Bash 要求(这听起来真的就像你试图在一个比我脾气暴躁的应用程序中找到一个明显的漏洞):
\n\n一般来说,要求 ELF(一种文件格式)并同时避免使用文件有点复杂。GCC 生成机器代码。如果您只想执行已知的机器代码,请将其放入某个缓冲区中,构建指向该缓冲区的函数指针并调用它。就那么简单。但是,您显然不具备执行 ELF 二进制文件或加载共享对象的过程中的所有良好的重定位和动态链接(dlopen。
如果你想要的话,我会朝 LLVM \xe2\x80\x93 之类的方向看,事实上,我知道有人用 LLVM 构建“我在运行时编译 C++ 并执行它”执行实例,并 clang 作为编译器。最后,你的gcc|something实际上只是 JIT \xe2\x80\x93 一项旧技术:)
| 归档时间: |
|
| 查看次数: |
3156 次 |
| 最近记录: |