为什么我不能 运行 在我的 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 制作一个更快更简单。
我已经为我的 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 制作一个更快更简单。