为什么我不能 运行 在我的 Beaglebone 板上自定义应用程序?

Why can't I run custom application on my Beaglebone board?

我已经为我的 beaglebone 板交叉编译了小应用程序:

/* led_test.c */

int main(int argc, char const *argv[])
{
    return 0;
}

编译成功,但如果我尝试 运行 目标板中的应用程序,我得到:

# cd /bin/
# ls -la | grep led_test
-rwxr-xr-x    1 default  default      13512 Feb  5  2020 led_test
# led_test 
-sh: ./led_test: not found

为什么我不能 运行 在我的 Beaglebone 板上自定义应用程序?谁能给我解释一下,好吗?

关于我的环境的一些信息:

1. work-station: Ubuntu 18.04.4 LTS x86-64
2. target machine: ARMv7 beaglebone board
3. cross-compiler: gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf
4. I built u-boot and Linux kernel with this toolchain and mounted rootfs via NFS.

UPD 1:

我尝试使用此 ./led_test 而不是 led_test。没关系,因为我的应用程序放在 /bin 目录中。

通过绝对路径尝试 运行,或者如果您在目录 运行 中作为 ./led_test 另外,显示文件的输出 文件 /bin/led_test 或 运行 应用程序与 gdb

您的用户space可能不是使用您编译二进制文件时使用的交叉工具链构建的。也许你用它编译了内核,但这没关系,重要的是rootfs。

您的程序是动态链接的。当程序 运行s 时,内核真正加载动态链接器,然后将可执行文件与库一起映射到进程的地址 space。

要查看动态链接器,运行 readelf -l 在您的主机或目标系统上的二进制文件中。示例:

$ readelf -l a.out

Elf file type is EXEC (Executable file)
[... more lines ...]
      [Requesting program interpreter: /lib/ld-linux-armhf.so.3]
[... more output ...]

program interpreter行是要查找的文件。 file 也会给出这些信息。可能是这里命名的文件没有预设在您的 rootfs 上。那就是错误的来源"file not found"。

您需要做的是为您正在使用的 rootfs 使用正确的交叉工具链(使用相同的 C 库版本),或者使用相同的工具链构建一个新的 rootfs。

查看 buildroot,了解一种制作新的、简单的 BeagleBone Black rootfs 的简单方法,它比使用 Yocto/Poky 制作一个更快更简单。