【问题标题】:Yocto native build of some recipes for 32 bit on 64bit systemYocto 在 64 位系统上为 32 位构建了一些食谱
【发布时间】:2020-05-21 18:16:42
【问题描述】:

我正在尝试在 yocto 中将一些原生包构建为 32 位(实际上是 2.6.1,在 64 位 linux 上)。我的目标根本不使用 multilib。假设我正在构建配方a,它需要(所有构建时,静态链接)包b 以及zlib 和libcrypto。通过简单地将-m32 添加到 gcc 调用中,我设法将 a 和 b 构建为 32 位,并且链接/运行正常。但是,构建系统不知道它并将所有内容放在work/x86_64-linux 下。

我必须使用预构建的 32 位 zlib 和 libcrypto 库才能工作,因为 yocto 当然会在我允许的时候尝试给我 64 位版本的 zlib 和 libcrypto (DEPENDS_class-native = "b-native zlib-native openssl-native"),从而导致链接器错误.让 yocto 在正确的架构中为我构建它们会很好。

我已经尝试过TARGET_ARCH 和BUILD_ARCH,但它要么根本没有将其更改为 32 位,要么它给出了一个它找不到的错误,例如quilt 为 32 位(应用补丁,可以/应该使用 64 位被子完成)。

具体的错误前面有很多

WARNING: a-native-1_0.4-r0 do_prepare_recipe_sysroot: 
Manifest /yoctoroot/work/sstate-control/manifest-i586-quilt-native.populate_sysroot 
not found in i586 (variant '')?
....
WARNING: a-native-1_0.4-r0 do_prepare_recipe_sysroot: 
Manifest /yoctoroot/work/sstate-control/manifest-i586-openssl-native.populate_sysroot 
not found in i586 (variant '')?
....
ERROR: a-native-1_0.4-r0 do_patch: 
Command Error: 'quilt --quiltrc /yoctoroot/work/i586-linux/a-native/1_0.4-r0/recipe-sysroot-native/etc/quiltrc push' 
exited with 0  Output:    /bin/sh: quilt: command not found
ERROR: a-native-1_0.4-r0 do_patch: Function failed: patch_do_patch
ERROR: Logfile of failure stored in: ...

当我添加时

BUILD_ARCH_native = "i586"
BUILD_ARCH_class-native = "i586"
TARGET_ARCH_native = "x86"
TARGET_ARCH_class-native = "x86"

到 a 和 b 接收器。

包 a 和 b 不是纯原生的,它们也是为目标构建的,并使用 BBCLASSEXTEND = "native" 来启用原生构建;理想情况下,解决方案不应破坏目标构建,也不应破坏生态系统中的所有其他原生内容。

我想要它们 32 位的原因是包 a 和 b 执行混合的指针/整数运算,当这些数据类型的大小不匹配时会中断;如果我不必更改这些来源,我将不胜感激。我是不是要求太多了?

提前感谢您的任何想法和指示!

【问题讨论】:

    标签: yocto bitbake


    【解决方案1】:

    我搞定了,但感觉并不比使用预构建的二进制文件好多少,而且如果有两个以上的依赖项似乎不可行。

    我在 a 和 b 食谱中添加了以下几行(嗯,BBCLASSEXTEND 已经存在):

    BUILD_ARCH_class-native = "i586"
    TARGET_ARCH_class-native = "x86"
    PATCHTOOL_class-native = "patch"
    BBCLASSEXTEND = "native"
    

    这会使被子错误消失并将它们放在i586-linux 目录而不是x86_64-linux。

    对于 zlib 和 openssl,我将原始配方复制到我自己的一层(包括补丁文件等)中,分别为 zlib32bitxyz-native 和 openssl32bitxyz-native,添加了以下几行:

    BUILD_ARCH = "i586"
    TARGET_ARCH = "x86"
    PATCHTOOL = "patch"
    inherit native
    BP = "openssl-${PV}" # or zlib
    

    以及在某些地方将${PN} 分别替换为openssl 和zlib。

    让它们构建 32 位对 openssl 来说是一个小菜一碟,它很简单。

    对于 zlib,事情从找不到 xz 来解压下载的存档开始。我在 hosttools 目录中手动添加了指向我的/usr/bin/xz 的链接。

    另外,我调整了

    do_configure() {
        CFLAGS="-m32" ./configure --prefix=${WORKDIR}/recipe-sysroot-native/usr --libdir=${WORKDIR}/recipe-sysroot-native/usr/lib --uname=GNU
    }
    

    这使构建成为 32 位并删除了未使用的共享内容的构建。

    然后,在配方 a 中,native 依赖现在读取

    DEPENDS_class-native += "b-native openssl32bitxyz-native zlib32bitxyz-native"
    

    所有构建和链接都可以(但有很多警告,请参阅问题)并且是 32 位的。

    如果这让你不寒而栗,请随时指导我正确的方式。

    编辑:什么不起作用

    一天晚上,我想,为什么不在我的图层中简单地使用zlib_%.bbappend 和openssl_%.bbappend,只包含

    BUILD_ARCH_class-native = "i586"
    TARGET_ARCH_class-native = "x86"
    PATCHTOOL_class-native = "patch"
    BBCLASSEXTEND = "native nativesdk"
    

    另外,对于 zlib,do_configure_class-native 如上所述,然后在配方中替换 a DEPENDS_class-native += "b-native zlib-native openssl-native"

    对于a,这确实有效!!但是,它几乎破坏了所有其他原生的东西,例如do_configure from kmod_native by

    | checking for zlib... no
    | configure: error: Package requirements (zlib) were not met:
    | 
    | No package 'zlib' found
    | 
    | Consider adjusting the PKG_CONFIG_PATH environment variable if you
    | installed software in a non-standard prefix.
    | 
    | Alternatively, you may set the environment variables zlib_CFLAGS
    | and zlib_LIBS to avoid the need to call pkg-config.
    | See the pkg-config man page for more details.
    | NOTE: The following config.log files may provide further information.
    | NOTE: /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/build/config.log
    | ERROR: configure failed
    | WARNING: /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/temp/run.do_configure.28023:1 exit 1 from 'exit 1'
    | ERROR: Function failed: do_configure (log file is located at /media/hegny/1.42.6-5592/yo419/tisdk_workdir-external-arm-toolchain/work/x86_64-linux/kmod-native/25+gitAUTOINC+aca4eca103-r0/temp/log.do_configure.28023)
    ERROR: Task (/media/hegny/1.42.6-5592/yo419/tisdk/sources/oe-core/meta/recipes-kernel/kmod/kmod-native_git.bb:do_configure) failed with exit code '1'
    

    难道没有像原生 multilib 这样简单的东西吗?

    【讨论】:

      猜你喜欢
      • 2020-08-16
      • 2011-12-18
      • 2013-05-29
      • 2011-06-30
      • 2021-11-18
      • 2011-11-11
      • 2012-03-16
      • 1970-01-01
      • 2011-03-31
      相关资源
      最近更新 更多