由于动态链接器,交叉编译在我的 Beaglebone Black 上不起作用

问题描述 投票:0回答:1

我已经开始为一个学校项目开发 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过程中出现错误。

c embedded cross-compiling beagleboneblack buildroot
1个回答
0
投票

我找到了适配的工具链编译器在哪里:

~/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 环境变量中。

© www.soinside.com 2019 - 2024. All rights reserved.