为将来查找此内容的人进行编辑:我现在的理解是“没有这样的文件或目录”具有误导性。如果你有一个 elf,你可以通过 chmod a+x 和 ./programname.elf 来运行它。它在我的系统上失败的原因是 elf 可能意味着(在本例中确实如此),您有一个动态链接的可执行文件。因为我使用的SDK是动态链接的,所以SDK使用的第3方函数的源代码没有内置到elf中。动态链接的可执行文件只是在运行时查找所有必需的包含内容,静态链接的可执行文件在编译时将所有必需的代码写入二进制文件。我的问题的解决方案似乎是要么弄清楚如何使 SDK 静态编译我的程序,要么弄清楚如何制作一个包含我需要的相关函数的静态链接库,并使用它在我的目标平台上本地构建我的程序。
我尝试使用 bash./program.elf 运行 elf,但得到响应“无法执行二进制文件”。
运行文件program.elf给出
file.elf: ELF 32-bit LSB executable, ARM, EABI5 version 1(SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
运行 uname -a 给出
Linux analog 3.19.0-g7f929ec #1 SMP PREEMPT Thu Sep 3 18:06:48 EEST 2015 armv71 armv71 armv71 GNU/Linux
都说ARM,那为什么这个程序不行呢?
根据某人的建议,这里是 readelf-A ./program.elf
Attribute Section: aeabi
File Attributes
Tag_CPU_name: "7-A"
Tag_CPU_arch: v7
Tag_CPU_arch_profile: Application
Tag_ARM_ISA_use: Yes
Tag_FP_arch: VFPv3
Tag_Advanced_SIMD_arch: NEONv1
Tag_ABI_PCS_wchar_t: 4
Tag_ABI_FP_rounding: Needed
Tag_ABI_FP_denomal: Needed
Tag_ABI_FP_exceptions: Needed
Tag_ABI_FP_number_model: IEEE 754
Tag_ABI_align_needed: 8-byte
Tag_ABI_enum_size: int
Tag_ABI_HardFP_use: SP and DP
答案1
据我所知,ARMv7 处理器更常见的是 ARMv7-A 型号(分别用于 Galaxy S4 和 Nexus 5 中的 Snapdragon 600/800 以及 Raspberry Pi 2/型号 B 的处理器) ),但是您的输出将系统芯片列为 ARMv71(又名 ARMv7 修订版 1)。您在编译/构建程序时选择的 ARMv7 处理器 SDK 的变体似乎完全有可能是 ARMv7 的错误子集,类似于您本来打算为 ARMv7-A 构建,但却为 ARMv7-M 构建。现在这只是一个猜测,因为我不知道你正在构建什么处理器/设备,或者在这方面进行构建,但考虑到 SoC 处理器在运行不是专门为它们编译的程序时是多么挑剔,我建议编译源代码如果可能的话,直接在有问题的机器上。
答案2
该命令bash ./program.elf
将通过 bash 解释器发送文件。
elf 文件是编译后的二进制文件,应该从命令行运行,如下所示:./program.elf
不要忘记使用以下命令设置文件的可执行位:
chmod a+x ./program.elf