我正在写一个C程序中我fork(),exec()和wait().我想把我执行的程序的输出写入文件或缓冲区.
例如,如果我exec ls 我想写入file1 file2 etc缓冲区/文件.我认为没有办法读取标准输出,所以这是否意味着我必须使用管道?这里有一个我无法找到的一般程序吗?
我想为我编写的玩具语言处理器编写一个非常小的概念验证JIT编译器(纯粹是学术性的),但我在设计的中间高度上遇到了一些麻烦.从概念上讲,我熟悉JIT的工作原理 - 您将字节码编译成(机器或汇编?)代码来运行.然而,在螺栓和螺栓水平上,我并不是在想你实际上是怎么做的.
我的(非常"新手")下意识的反应,因为我没有第一个线索从哪里开始,将尝试类似以下内容:
这甚至接近正确的算法吗?我已经尝试过阅读我知道有JIT编译器学习的不同项目(比如V8),但是由于它们的大小,这些代码库很难被消费,而我几乎不知道从哪里开始寻找.
我正在Linux下编写一个简单的用户空间ELF加载器(为什么?为了'有趣').我的加载器目前非常简单,只能加载包含与位置无关的代码的静态链接的ELF文件.
通常,当程序由内核的ELF加载程序加载时,它会被加载到自己的地址空间中.因此,数据段和代码段可以加载到ELF段中指定的正确虚拟地址.
但是,在我的情况下,我通过内核请求来自内核的地址mmap,并且可能会或可能不会获得ELF段中请求的地址.这对于代码段来说不是问题,因为它与位置无关.但是,如果未在预期地址处加载数据段,则代码将无法正确引用存储在数据段中的任何内容.
实际上,我的加载器似乎可以正常使用不包含任何数据的简单程序集可执行文件.但是一旦我添加数据段并引用它,可执行文件就无法正常运行或SEGFAULTs.
如果可能的话,我如何修复对数据段的任何引用以指向正确的位置?为此目的,是否在(静态)ELF文件中存储了重定位部分?
在我的公司,我们目前正在研究加速CI构建的各种策略.我们已经对我们的构建进行了分析,并确定我们受到I/O瓶颈的限制.我们有相当多的选项来处理那些在不久的将来(约1-2个月),但真的想看到的改进现在.
我建议使用ramdisk作为checkout和buildfile位置.构建输出和日志当然会存储在物理磁盘上.
这是一个明智的做法,或者这种方法有明显的缺点吗?我不是在寻找关于硬件方面的答案,而是寻找常见构建系统(例如MSBuild)和ramdisk之间的交互会导致任何问题,以及是否还有其他风险需要注意的问题.
我需要做一个相当不寻常的事情:手动执行elf可执行文件.即将所有部分加载到正确的位置,查询main()并调用它(然后清理).可执行文件将静态链接,因此不需要链接库.我也控制基地址,所以不用担心可能的冲突.
那么,是否有任何库?
我找到了OSKit及其liboskit_exec,但是自2002年以来项目似乎已经死了.
我可以接受部分项目(当然尊重许可证)并根据我的需要定制它们,但由于我在linux世界中相当不错,我甚至不知道在哪里可以找到这些部件!:)
PS.我需要ARM平台.
UPD嗯,加载精灵的问题似乎需要一些关于它的好知识(叹气),所以我出去阅读一些规格和手册.我想我会坚持使用仿生/链接器和libelfsh.多谢你们!
总结发现:
解析动态重定位时符号查找的搜索顺序是什么?
解析共享库的符号时,加载器首先搜索"主可执行文件"(让主可执行文件覆盖定义......)或者什么?
对于C中的全局变量
int aglobal = 5;
什么时候5被加载器转移到aglobal,它如何知道将5放入全局.
与函数中的静态声明相同的情况.喜欢
int afunc(){static int astatic = 8; 回归; }