V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
wniming
V2EX  ›  Linux

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

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

    楼主在 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  
       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   ·   实用小工具   ·   2672 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:18 · PVG 19:18 · LAX 03:18 · JFK 06:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.