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

Howto test 32bit kernel specific syscall on a 64bit machine?

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

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

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


-m32 标志有效,64 位内核确实接受了字节码。够蠢的,我自己没有来这个简单的选项,谢谢。

或者换个说法。我没有注意到 64 位内核并行实现了所有 32 位调用,甚至是本机 64 位代码中不存在的调用。

您可以在分区中安装整个 Linux 32 位(x86/32 即 ia32)系统 - 或者只是一个子目录 - 并且 运行 它位于 chroot 下一个 64 位 x86-64 Linux 内核(因为 x86-64 的 64 位内核通常配置为能够 运行 32 位 x86 代码,即 execve(2) a 32 bits 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 (e.g. qemu...)

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