bash - 如何让 bash 从 stdin 执行 ELF 二进制文件?

标签 bash pipeline execution

出于某些不明确的原因,我编写了一个 bash 脚本,它生成一些源代码,然后编译它,使用

... whatever ... | gcc -x c -o /dev/stdout

现在,我想在编译上执行结果。我怎样才能做到这一点?请不要使用文件。

最佳答案

正如 Charles Duffy 所说,要执行二进制文件,您必须告诉您的操作系统(这似乎是 Unix 的变体)加载并执行某些内容 – 而 Unix 系统只获取文件来直接执行它们。

你可以做的是有一个准备包含 ELF 二进制文件的内存区域的进程, fork 并跳转到该区域 - 但即使这样也是有问题的,考虑到有 CPU 支持完全抑制操作(R^X)。基本上,您需要的是一个运行时链接器,而 shell 不(也不应该)包含类似的东西。

让我们放弃 Bash 要求(这听起来真的像是您试图在比我脾气暴躁的旧应用程序中找到一个明显的漏洞):

通常,同时要求 ELF(一种文件 格式)和避免文件 有点复杂。 GCC 生成机器代码。如果您只想执行已知的机器代码,请将其放入某个缓冲区,构建指向该缓冲区的函数指针并调用它。就那么简单。但是,您显然没有执行 ELF 二进制文件或加载共享对象 (dlopen) 的过程所具有的所有良好的重定位和动态链接。

如果你想要那样的话,我会看看像 LLVM 这样的东西的方向——我知道,事实上,有人构建“我在运行时编译 C++ 并执行它”,将 LLVM 作为执行实例,并将 clang 作为编译器。最后,您的 gcc|something 实际上只是 JIT——一项古老的技术 :)

关于bash - 如何让 bash 从 stdin 执行 ELF 二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40665271/

相关文章:

python - 使用 Bash 脚本从文件夹名称中删除前 4 个字母

bash - 在 Ubuntu BASH 中按字母顺序复制文件夹中的文件

linux - 避免在 bash 命令中使用临时文件

linux - bash 运行 nc 和符号终止程序

perl - 如何检查 Perl-CGI 应用程序中的所有错误(例如,使用 Perl 编译器或类似 lint 的工具检查,免费开源?)

javascript - Dojo 1.6 hitch() "this"范围在 require 语句中

Bash脚本,收集集合中的信息

powershell - 使用powershell在文本文件中找到特定行后如何停止Get-Content -wait?按需退出管道

python - 泰坦尼克号管道中的 ValueError

php - 定时脚本 PHP