YOCTO (dunfell) 安装预编译二进制文件的正确方法

YOCTO (dunfell) correct way to install pre-compiled binaries

我正在尝试为我的 RaspberryPI3 设备构建一个自定义的 Yocto 图像。实际上,我需要安装 NodeJS 版本 6.10.3(我需要这个特定版本),但我在“meta-nodejs”repo 上找到的食谱似乎已损坏。 (不能直接从 meta-nodejs 安装,它会给我类似“env python: env command not found”的错误)。因此,在我直接在 Yocto os 上进行测试后,我决定使用 ARMV7L (https://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-armv7l.tar.gz) 的预编译版本。我已经制作了我的自定义食谱并直接在我的图像上“bitbaked”,没有任何错误,但二进制文件似乎有一些问题。

root@yocto:~# node --version
Segmentation fault

我将此文件与原始文件进行了比较,发现 yocto 的 rootfs 上的文件被“剥离”了

root@yocto:~# file /usr/bin/node
/usr/bin/node: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.26, BuildID[sha1]=cbdb85ab56e5b0f7c31aeb0671fd9b6ae5984f81, stripped

root@yocto:~# file /opt/node-v6.10.3-linux-armv7l/bin/node
/opt/node-v6.10.3-linux-armv7l/bin/node: ELF 32-bit LSB executable, ARM, EABI5 version 1 (GNU/Linux), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 2.6.26, BuildID[sha1]=cbdb85ab56e5b0f7c31aeb0671fd9b6ae5984f81, with debug_info, not stripped

所以我试着“玩”我的食谱添加:

INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"

但我仍然遇到同样的错误。

我的食谱:

DESCRIPTION = "nodeJS Evented I/O for V8 JavaScript"
HOMEPAGE = "http://nodejs.org"
LICENSE = "MIT & BSD-2-Clause & BSD-3-Clause & ISC & AFL-2.0 & Apache-2.0 & OpenSSL & Zlib & Artistic-2.0 & (BSD-3-Clause | GPLv2)"

LIC_FILES_CHKSUM = "file://LICENSE;md5=41a3a0ccf7f515cac3377389dd8faac8"
    
RDEPENDS_${PN} += "bash"

SRC_URI = " https://nodejs.org/dist/v6.10.3/node-v6.10.3-linux-armv7l.tar.gz"
SRC_URI[sha256sum] = "c36f0713fcf397a6b278b61f4c1511938f7ad1e5385c31e530d074ce83163426"

S = "${WORKDIR}/node-v${PV}-linux-armv7l"

do_install_append() {
        install -d ${D}/usr/
        cp -rf ${S}/* ${D}/usr/
}

FILES_${PN} += "/usr/*"

INSANE_SKIP_${PN} += "already-stripped"
INHIBIT_PACKAGE_DEBUG_SPLIT = "1"
INHIBIT_PACKAGE_STRIP = "1"

感谢#Yocto IRC 频道的用户“RP”: 生成的图像中的二进制文件被我 conf/local.conf:

中的“预链接”选项更改了
USER_CLASSES ?= "buildstats image-mklibs image-prelink"

删除“image-prelink”并再次对图像进行 bitbake 后,一切正常。