我已经开始为一个学校项目开发 Beaglebone Black,并且我们一直在使用 buildroot 来构建我们的自定义图像。现在我们正在使用基本的 5.3 图像。
我们使用builroot-2022.02.9。
对于图像,我们使用
make beaglebone_defconfig
从 beaglebone_defconfig 开始,我们在 buildroot -5.3 版本中使用自定义“内核版本”。在 Toolchain 菜单中,在 Kernel Headers 中我们选择它与正在构建的内核相同,在 Custom kernel headers 系列中我们选择 5.3.x。
目标是交叉编译一个 C 程序,该程序将利用 Beaglebone 的 LED,但我仅使用 helloworld 程序运行测试,但它不起作用。
此外,helloworld 文件是使用 tftp 传输的,我使用 ls 在我的目录中看到它,并且我添加了可执行标志,只是为了告诉您它存在于我的 beaglebone 上。
问题是这样的:
当我在 VM 上编译 helloworld 文件后,在 beaglebone 上运行该文件时,我收到此错误消息:
-sh: ./helloworld: not found
起初,我以为我使用了错误的编译器,所以我用了很多。我可以列出:
arm-linux-gnueabihf
arm-linux-gnueabi
我已经尝试了这两个工具链的许多版本。我给出的提示很简单:
arm-linux-gnueabihf-gcc helloworld.c –o helloworld
所以我做了研究,发现消息
-sh: ./helloworld: not found
具有误导性 - 请参阅这篇文章中经过验证的答案:为什么我不能在我的 Beaglebone 板上运行自定义应用程序?
所以这是一个动态链接器问题,在我的情况下,当我使用
readelf -a
查找文件时,它是:/lib/ld-linux.so.3.
因此,考虑到没有找到它,我继续在 Beagleboard 上的 /lib/ 目录中搜索它。
结果我什至没有它,没有它的任何单一版本。
我的猜测是,在使用 buildroot 自定义它时,我应该将其包含在我的配置中,但我不知道如何设置它以及选择哪一个作为该主题的新内容。
因此,我需要做的是为我正在使用的 rootfs 使用正确的交叉工具链(使用相同的 C 库版本),或者使用相同的工具链构建新的 rootfs。
在buildroot中,当我进入工具链菜单时使用的C库是
uClibc-ng
,所以我尝试将其设置为glibc
,但我得到的只是在make过程中出现错误。
我找到了适配的工具链编译器在哪里:
~/Documents/buildroot/output/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc
命令行就非常简单了:
~/Documents/buildroot/output/host/bin/arm-buildroot-linux-uclibcgnueabihf-gcc -o hello hello.c
你显然可以将其添加到 PATH 环境变量中。