0

我已经为我的 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.

更新 1:

我试着用这个./led_test代替led_test。没关系,因为我的应用程序放在/bin目录中。

4

2 回答 2

3

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

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

要查看动态链接器,请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 上预设。那是错误来自的“找不到文件”。

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

看一下 buildroot 以获得一种简单的方法来制作一个新的、简单的 BeagleBone Black rootfs,它比使用 Yocto/Poky 制作一个更快、更简单。

于 2020-02-06T01:28:19.880 回答
0

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

于 2020-02-05T11:28:54.870 回答