如何在 x86 架构上交叉编译 arm64 架构的 qemu? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wniming
V2EX    Linux

如何在 x86 架构上交叉编译 arm64 架构的 qemu?

  •  
  •   wniming 2023-03-14 18:45:08 +08:00 4288 次点击
    这是一个创建于 1017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    楼主在 fedora37 和 ubuntu22.04 上试了都不行,都是在 configure 阶段遇到奇怪的,不知道怎么解决的错误。

    我在 fedora 上执行的 configure 命令行是:

    /a/source/qemu-7.2.0/configure --target-list=aarch64-softmmu --enable-debug --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

    报错是:

    ERROR: "aarch64-linux-gnu-gcc" cannot build an executable (is your linker broken?)

    我在 ubuntu 上执行的命令行是:

    ~/qemu-7.2.0/configure --target-list=aarch64-softmmu --enable-debug --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

    报错是:

    ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found

    25 条回复    2023-03-15 11:11:58 +08:00
    lechain
        1
    lechain  
       2023-03-14 18:49:39 +08:00
    错误提示很明确呀,ERROR: "aarch64-linux-gnu-gcc" cannot build an executable (is your linker broken?) 找不到 目标平台的链接器
    ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found 找不到目标平台的软件包配置
    hwdef
        2
    hwdef  
       2023-03-14 18:49:39 +08:00
    ubuntu 上装个包再试试

    ```
    sudo apt-get install -y pkg-config-aarch64-linux-gnu
    ```
    wniming
        3
    wniming  
    OP
       2023-03-14 18:53:43 +08:00
    @hwdef 有这么简单我就不会发帖问了

    root@ubuntu:/home/d# apt update
    Hit:1 http://cn.archive.ubuntu.com/ubuntu jammy InRelease
    Get:2 http://cn.archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
    Get:3 http://cn.archive.ubuntu.com/ubuntu jammy-backports InRelease [107 kB]
    Get:4 http://cn.archive.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
    Fetched 336 kB in 4s (80.6 kB/s)
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    10 packages can be upgraded. Run 'apt list --upgradable' to see them.
    root@ubuntu:/home/d# apt-get install -y pkg-config-aarch64-linux-gnu
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    E: Unable to locate package pkg-config-aarch64-linux-gnu
    root@ubuntu:/home/d#
    wniming
        4
    wniming  
    OP
       2023-03-14 18:54:23 +08:00
    @lechain 他提示什么我当然能看懂,但不知道怎么解决
    tags
        5
    tags  
       span class="ago" title="2023-03-14 18:55:04 +08:00">2023-03-14 18:55:04 +08:00
    交叉编译器没装好,sudo apt install crossbuild-essential-arm64
    wniming
        6
    wniming  
    OP
       2023-03-14 18:57:35 +08:00
    @tagorewu 感谢回复,刚刚 apt install crossbuild-essential-arm64 安装了还是一样的问题
    aapeli
        7
    aapeli  
       2023-03-14 19:08:51 +08:00
    可以试试直接安装 deb 包,
    wget http://security.ubuntu.com/ubuntu/pool/universe/g/gcc-defaults/pkg-config-aarch64-linux-gnu_7.4.0-1ubuntu2.3_amd64.deb



    # sudo apt install pkg-config
    # sudo dpkg -i pkg-config-aarch64-linux-gnu_7.4.0-1ubuntu2.3_amd64.deb
    mepwang
        8
    mepwang  
       2023-03-14 19:17:27 +08:00
    你好像没明白在不同的 linux 发行版上,包管理器是不一样的。
    在 ubuntu 22.04 上,arm v8 交叉编译器的包名是 gcc-aarch64-linux-gnu
    424778940
        9
    424778940  
       2023-03-14 19:34:43 +08:00
    sudo apt -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cpp-aarch64-linux-gnu binutils-aarch64-linux-gnu
    424778940
        10
    424778940  
       2023-03-14 19:35:40 +08:00
    建议楼主虚心学习基础知识 不要操之过急
    wniming
        11
    wniming  
    OP
       2023-03-14 19:36:40 +08:00
    @mepwang @424778940
    两位说的包我早就安装了,不行的
    424778940
        12
    424778940  
       2023-03-14 19:39:56 +08:00
    @wniming 我建议你试一试我上面给的命令 不要觉得看起来一样
    如果还是不行 就给出新的报错信息 请聪明的问问题
    wniming
        13
    wniming  
    OP
       2023-03-14 20:03:47 +08:00
    @424778940

    d@ubuntu:~/build$ sudo apt -y install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu cpp-aarch64-linux-gnu binutils-aarch64-linux-gnu
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    cpp-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
    g++-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
    gcc-aarch64-linux-gnu is already the newest version (4:11.2.0-1ubuntu1).
    binutils-aarch64-linux-gnu is already the newest version (2.38-4ubuntu2.1).
    0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
    d@ubuntu:~/build$
    d@ubuntu:~/build$
    d@ubuntu:~/build$ ~/qemu-7.2.0/configure --target-list=aarch64-softmmu --cross-prefix=aarch64-linux-gnu- --prefix=/home/d/.local

    ERROR: pkg-config binary 'aarch64-linux-gnu-pkg-config' not found

    d@ubuntu:~/build$

    我刚才是已经试过了才回帖的
    pagxir
        14
    pagxir  
       2023-03-14 20:09:12 +08:00 via Android
    安装一下 qemu-user-static 然后 update 一下 binfmt 就可以了。失败是因为 configuration 过程中需要执行编译生成的 arm64 的可执行程序。
    pagxir
        15
    pagxir  
       2023-03-14 20:10:01 +08:00 via Android
    还有一个方法就是不用交叉编译,直接手机安装 Alpine 编译。
    wniming
        16
    wniming  
    OP
       2023-03-14 20:13:03 +08:00
    @pagxir 感谢回复,update 一下 binfmt 要怎么操作?

    我开发不可能用手机的,编译效率太低了,不可能每次改了代码都交叉编译的。
    BrettD
        17
    BrettD  
       2023-03-14 20:27:25 +08:00
    因为指定了 prefix=aarch64-linux-gnu 所以 configure 去找 aarch64-linux-gnu-pkg-config ,这个 wrapper 要自己做一个,export PKG_CONFIG_PATH=你的交叉编译环境的 pkgconfig 数据路径,然后再调用 pkg-config
    424778940
        18
    424778940  
       2023-03-14 20:39:08 +08:00
    ```
    export PKG_CONFIG_DIR=""
    export PKG_CONFIG_LIBDIR=/usr/lib/aarch64-linux-gnu/pkgconfig
    pkg-config --list-all
    ```
    wniming
        19
    wniming  
    OP
       2023-03-14 20:41:45 +08:00
    @BrettD 感谢回复,我试一下
    wniming
        20
    wniming  
    OP
       2023-03-14 20:46:31 +08:00
    @424778940 感谢回复,我的系统上没有 /usr/lib/aarch64-linux-gnu/pkgconfig 这个路径,这个路径是哪个包里的?
    424778940
        21
    424778940  
       2023-03-14 20:52:29 +08:00
    @wniming 你得是装了 arm64 的 libxxx 包这个路径才会有东西吧
    装 arm 的 lib 还要添加新的 deb 源才行
    424778940
        22
    424778940  
       2023-03-14 20:55:28 +08:00   1
    这是我自己的对应 22.10 的脚本 添加 arm 源, 你如果用别的版本 记得自己改掉发行版代号
    sudo sed -i 's/^deb/deb [arch=amd64]/g' /etc/apt/sources.list
    sudo dpkg --add-architecture arm64
    sudo dpkg --add-architecture armhf
    sudo tee -a /etc/apt/sources.list.d/source-arm.list > /dev/null <<EOT
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic main restricted
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic-updates main restricted
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic universe
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic-updates universe
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic multiverse
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic-updates multiverse
    deb [arch=armhf,arm64] http://ports.ubuntu.com/ kinetic-backports main restricted universe multiverse
    EOT
    sudo apt update

    需要安装的包列表参考 https://wiki.qemu.org/Hosts/Linux#Cross_builds

    安装命令格式为 sudo apt install libssl-dev:arm64 注意替换你自己需要的包

    pkg-config 的 wrapper 在 20.04 之后好像就没有包了 自己找一个或者写一个吧 也没几句话的事情
    wniming
        23
    wniming  
    OP
       2023-03-15 09:30:23 +08:00
    @424778940 感谢大佬指点,搞定了,而且不需要自己写 pkg-config 的 wrapper

    不过我主要是想在 fedora 系统上交叉编译 qemu ,还不知道要怎么搞
    wniming
        24
    wniming  
    OP
       2023-03-15 10:11:26 +08:00
    @424778940 我发现 fedora 的交叉编译只能编译内核,bootloader 等裸程序,连 hello world 都不支持:

    https://discussion.fedoraproject.org/t/cross-compiling-to-arm/71516/6
    424778940
        25
    424778940  
       2023-03-15 11:11:58 +08:00
    @wniming 我不用 rhql 系做开发 不知道
    这类东西你想弄肯定都是有办法的 只不过就是做法干不干净整不整洁的问题
    我还是建议你用 ubuntu/xubuntu 的 2204 或者 2210 做这种开发
    发行版 ist 不要来杠我 这仅仅是我个人观点
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3534 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 26ms UTC 10:21 PVG 18:21 LAX 02:21 JFK 05:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86