linux - 如何在 64 位机器上测试 32 位内核特定的系统调用?

标签 linux system-calls

我的问题很具体。我必须编写一个简单的程序,它可以处理文件,并且应该在arm 32位(android)上运行。关键的一点是它必须使用 _llseek 系统调用。此系统调用存在于 32 位 Linux 内核中,但在 64 位 Linux 内核中不存在。

从技术上讲,我可以在 ARM 设备(我的例子是手机)上编写并运行这个程序,但我在 64 位机器上执行操作,通常用于测试和调试。在这种情况下,由于缺少此系统调用,我的程序无法在 64 位机器上编译和运行。

有什么解决方法吗?我需要一些友好的测试/调试环境。安装 32 位虚拟 Linux 是唯一的选择吗? 提前致谢,亚历克斯

<小时/>

-m32 标志有效,并且 64 位内核确实接受了字节码。我太愚蠢了,我自己没有想到这个简单的选择,谢谢。

或者换句话说。我没有注意到 64 位内核并行实现了所有 32 位调用,甚至是 native 64 位代码中没有的调用。

最佳答案

您可以在分区中安装整个 Linux 32 位(x86/32,即 ia32)系统 - 或者只是一个子目录 - 并在 64 位 x86-64 Linux 内核中的 chroot 下运行它(因为 x86-64 的 64 位内核通常配置为能够运行 32 位 x86 代码,即 execve(2) 为 32 位 x86 ELF 可执行二进制文件)debootstrap 命令(在 Debian 及相关系统上)正在记录这种用法,另请参阅schroot(您可能不需要在 32 位 chroot 中安装每个包,只需安装相关的包)。

您还可以使用 gcc -m32 在 64 位 x86-64 机器上编译为 32 位 x86 ELF 二进制文件。您可能需要其他软件包(名称中通常带有 multilibia32x86)。

当然你需要重新编译应用程序,因为 ARM 与 x86/32 位不同

但是,您无法在 64 位 x86-64 Linux 上运行 ARM 32 位应用程序(仅限 x86 32 位应用程序)。要在 x86 上运行 ARM 应用程序,您需要 ARM emulator(例如 qemu ....)

因此,首先在 64 位 x86-64 Linux 系统上使用 32 位 chroot 环境调试 x86/32 位上的内容。

关于linux - 如何在 64 位机器上测试 32 位内核特定的系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31315932/

相关文章:

linux - 在远程服务器 linux 上复制/移动文件

java - 从命令行运行时 Spring Boot 缺少插件

linux - 如何将 CMAKE 生成器添加到 Linux 版本的 CMAKE?

windows - Maven 多平台依赖包

c - 你如何在 C 中进行系统调用中断?

c++ - 强制读取系统调用阻塞

linux - 如何将aufs目录下的docker镜像移动到overlay2?

c - 为什么管道不能像变量一样被覆盖?

c - 实现匿名管道

c - 使用自定义系统调用编译 Linux 内核模块时出错