在How to solve "FATAL: kernel too old" when running gem5 in syscall emulation SE mode?之后,我设法在某些条件下运行静态链接的hello世界。
但是如果我尝试使用以下代码运行ARM动态链接的stdlib:
./out/common/gem5/build/ARM/gem5.opt ./gem5/gem5/configs/example/se.py -c ./a.out
它失败了:
fatal: Unable to open dynamic executable's interpreter.
如何让它找到翻译?希望不要在主机的根目录上复制我的十字架'工具链的解释器。
对于x86_64,如果我使用我的本机编译器,它会起作用,并且正如预期的那样strace
表示它正在使用本机解释器,但如果我使用交叉编译器则它不起作用。
目前常见问题解答说不可能使用动态可执行文件:http://gem5.org/Frequently_Asked_Questions但我不相信它,然后这些演示文稿提到它:
但不是如何实际使用它。
QEMU用户模式具有-L
选项。
在gem5中测试49f96e7b77925837aa5bc84d4c3453ab5f07408e
https://www.mail-archive.com/gem5-users@gem5.org/msg15582.html
答案 0 :(得分:2)
有人告诉我,截至49f96e7b77925837aa5bc84d4c3453ab5f07408e(2018年5月),在系统调用仿真中运行动态链接的交叉拱形可执行文件没有方便/经过良好测试的方法:https://www.mail-archive.com/gem5-users@gem5.org/msg15585.html
但我怀疑修补gem5以支持它并不是很难。 QEMU用户模式已经支持,你只需要指向fetch('/checkout', {
// ...
credentials: 'same-origin' // or 'include' (see the link below)
})
的根文件系统。
答案 1 :(得分:2)
交叉编译的二进制文件如果是动态可执行文件,则应具有.interp条目。
使用readelf进行验证:
readelf -a $bin_name | grep interp
设置模拟器是为了在将可执行文件加载到模拟地址空间时在主可执行文件中找到此部分。如果存在此部分,则将c字符串设置为指向该文本(通常类似于/lib64/ld-linux-x86-64.so.2
之类)。然后,模拟器以该c字符串作为参数调用glibc的open函数。实际上,这将以常规文件的形式打开模拟器的动态链接加载器。然后,模拟器将文件映射为具有mmap和mmap_fixed的阶段。
对于交叉编译,此代码必须失败。如果模拟器无法打开文件,则错误消息将直接显示在错误消息之后。为此,您需要调试打开过程,然后调试加载程序,然后将其粘贴到地址空间中。有一种机制可以将程序的入口点设置到加载器中,而不是直接设置到主二进制文件的代码部分中。 (这是通过堆栈上的辅助向量完成的。)您可能还需要尝试一下。
有趣的代码是(截至 05/29/19 )在src/base/loader/elf_object.cc.
答案 2 :(得分:0)
我只是交叉编译代码后遇到了这个问题。您可以尝试在命令后添加“ --static”。