首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在将自定义目标添加到rust (arm-未知-linux-uclibceabihf)时获得VFP寄存器参数?

为什么我在将自定义目标添加到rust (arm-未知-linux-uclibceabihf)时获得VFP寄存器参数?
EN

Stack Overflow用户
提问于 2020-07-16 22:25:48
回答 1查看 284关注 0票数 0

我正在遵循上一篇rust时事通讯中的指南:https://rust-embedded.github.io/embedonomicon/custom-target.html,我遇到了一个与软/硬浮动配置相关的问题。

我通过将mipsel-unknown-linux-uclibc.json与arm-unknown-linux-gnueabihf.json合并来创建我的新目标,以获得以下结果:

代码语言:javascript
复制
{
  "arch": "arm",
  "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64",
  "dynamic-linking": true,
  "env": "uclibc",
  "executables": true,
  "features": "+strict-align,+v6,+vfp2",
  "has-elf-tls": true,
  "has-rpath": true,
  "is-builtin": false,
  "linker-flavor": "gcc",
  "linker-is-gnu": true,
  "linker": "/home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/bin/arm-buildroot-linux-uclibcgnueabihf-gcc",
  "llvm-target": "arm-unknown-linux-uclibceabihf",
  "max-atomic-width": 64,
  "os": "linux",
  "position-independent-executables": true,
  "pre-link-args": {
    "gcc": [
      "-Wl,--as-needed",
      "-Wl,-z,noexecstack"
    ]
  },
  "relro-level": "full",
  "target-c-int-width": "32",
  "target-endian": "little",
  "target-family": "unix",
  "target-mcount": "_mcount",
  "target-pointer-width": "32",
  "vendor": "unknown"
}

当我使用新的自定义目标编译一个带有cargo的非std应用程序时:

代码语言:javascript
复制
cargo build -Z build-std=core --target arm-unknown-linux-uclibceabihf.json

我收到以下错误:

代码语言:javascript
复制
   Compiling app v0.1.0 (/home/ykoehler/work/app)
error: linking with `/home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/bin/arm-buildroot-linux-uclibcgnueabihf-gcc` failed: exit code: 1
  |
  = note: "/home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/bin/arm-buildroot-linux-uclibcgnueabihf-gcc" "-Wl,--as-needed" "-Wl,-z,noexecstack" "-Wl,--eh-frame-hdr" "-L" "/home/ykoehler/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/arm-unknown-linux-uclibceabihf/lib" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/app-92459304df1651f0.app.2jjler86-cgu.0.rcgu.o" "-o" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/app-92459304df1651f0" "-Wl,--gc-sections" "-pie" "-Wl,-zrelro" "-Wl,-znow" "-Wl,-O1" "-nodefaultlibs" "-L" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps" "-L" "/home/ykoehler/work/app/target/release/deps" "-L" "/home/ykoehler/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/arm-unknown-linux-uclibceabihf/lib" "-Wl,-Bstatic" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/librustc_std_workspace_core-375ea25c872246b5.rlib" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/libcore-34e07d1b528fc142.rlib" "/home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/libcompiler_builtins-a34a2e58700fb5e5.rlib" "-Wl,-Bdynamic"
  = note: /home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabihf/5.3.0/../../../../arm-buildroot-linux-uclibcgnueabihf/bin/ld: error: /home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/app-92459304df1651f0 uses VFP register arguments, /home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/app-92459304df1651f0.app.2jjler86-cgu.0.rcgu.o does not
          /home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/bin/../lib/gcc/arm-buildroot-linux-uclibcgnueabihf/5.3.0/../../../../arm-buildroot-linux-uclibcgnueabihf/bin/ld: failed to merge target specific data of file /home/ykoehler/work/app/target/arm-unknown-linux-uclibceabihf/release/deps/app-92459304df1651f0.app.2jjler86-cgu.0.rcgu.o
          /home/ykoehler/work/tools/arm-5.3-uclibc-1.0.12/usr/arm-buildroot-linux-uclibcgnueabihf/sysroot/usr/lib/Scrt1.o: In function `_start':
          /var/tmp/tool-chains/buildroot-2016.02-5.3-arm/src/buildroot-2016.02/output/build/uclibc-1.0.12/libc/sysdeps/linux/arm/crt1.S:217: undefined reference to `__uClibc_main'
          /var/tmp/tool-chains/buildroot-2016.02-5.3-arm/src/buildroot-2016.02/output/build/uclibc-1.0.12/libc/sysdeps/linux/arm/crt1.S:235: undefined reference to `abort'
          /var/tmp/tool-chains/buildroot-2016.02-5.3-arm/src/buildroot-2016.02/output/build/uclibc-1.0.12/libc/sysdeps/linux/arm/crt1.S:235: undefined reference to `main'
          collect2: error: ld returned 1 exit status


error: aborting due to previous error

error: could not compile `app`.

To learn more, run the command again with --verbose.

这个错误表明,当其他部分使用硬浮点数时,某些代码是使用软浮点数编译的,这是从网上读取有关错误消息的。然而,错误指定的两个文件似乎都是由rust生成的,我不清楚为什么rust会根据我在自定义目标定义文件中提供的信息生成任何软浮点代码。

感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-31 05:35:18

我相信你只需要在llvm-target上使用arm-unknown-linux-gnueabihf即可。VFP错误与可用的浮点指令集有关(即eabihf中的hf代表Hard Float)。我正在努力让armv7-unknown-linux-uclibceabihf目标在rust中工作。当让armv7-unknown-linux-uclibceabihf目标在rust中工作时,我收到了相同的VFP错误,结果证明我只需要为llvm-target使用armv7-unknown-linux-gnueabihf

另外,下面是我的armv7-unknown-linux-uclibceabihf规范文件,以供比较:

代码语言:javascript
复制
{
  "abi-blacklist": [
    "stdcall",
    "fastcall",
    "vectorcall",
    "thiscall",
    "win64",
    "sysv64"
  ],
  "arch": "arm",
  "data-layout": "e-m:e-p:32:32-Fi8-i64:64-v128:64:128-a:0:32-n32-S64",
  "dynamic-linking": true,
  "env": "uclibc",
  "executables": true,
  "features": "+v7,+vfp3,-d32,+thumb2,-neon",
  "has-elf-tls": true,
  "has-rpath": true,
  "linker-flavor": "gcc",
  "linker-is-gnu": true,
  "llvm-target": "armv7-unknown-linux-gnueabihf",
  "max-atomic-width": 64,
  "os": "linux",
  "position-independent-executables": true,
  "pre-link-args": {
    "gcc": [
      "-Wl,--as-needed",
      "-Wl,-z,noexecstack"
    ]
  },
  "relro-level": "full",
  "target-c-int-width": "32",
  "target-endian": "little",
  "target-family": "unix",
  "target-mcount": "\u0001__gnu_mcount_nc",
  "target-pointer-width": "32",
  "vendor": "unknown"
}

干杯

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62936931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档