测试是否有效的可执行文件

测试是否有效的可执行文件

是否有一种(相对)简单的方法来测试可执行文件是否不仅存在,而且有效?

我所说的有效是指 x86_64 Mach-O (OS X) 可执行文件无法在 ARM Raspberry Pi 上运行。但是,简单地tool-osx || tool-rpi在 OS X 上运行即可,其中可执行文件运行,但不会回退到tool-rpix86_64 失败时。

当一个可执行文件对于处理器架构无效时,如何回退到另一个可执行文件?

答案1

与其测试有效的可执行文件,不如测试当前的体系结构,然后根据该体系结构选择正确的可执行文件。例如:

if [ $(uname -m) == 'armv6l' ]; then
    tool-rpi
else
    tool-osx
fi

但是,如果您要测试可执行文件真的如果你想做的话,GNUfile可以告诉你可执行文件的架构:

user@host:~$ file $(whereis cat)
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.26, BuildID[sha1]=0x4e89fd8f129f0a508afa325b0f0f703fde610971, stripped

答案2

在 Linux glibc 上,您可以使用一种技巧来测试动态链接的可执行文件是否可以成功运行但不实际运行它,那就是LD_DEBUG=help在其环境中进行设置。如果它是好的,它会发出一条帮助消息(您忽略它)并成功退出,如果它无效,那么您将收到错误。

不幸的是,这是特定于 Linux glibc 的,听起来你在问 MacOS。此外,它对于静态链接的二进制文件以及 setuid 或 setgid 二进制文件无效。

相关内容