【问题标题】:Why system call stubs in NewLib are needed only on Linux and not on Windows?为什么 NewLib 中的系统调用存根仅在 Linux 上需要,而在 Windows 上不需要?
【发布时间】:2021-11-05 12:07:25
【问题描述】:

我在 MCUXpresso 中有一个带有自定义链接器文件的项目。该项目在 Windows 上构建良好,但在 Linux 上失败。在 Linux 上,链接器失败并出现以下错误(编译器路径被缩短):

arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-abort.o): in function `abort':
abort.c:(.text.abort+0xa): undefined reference to `_exit'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_kill_r':
signalr.c:(.text._kill_r+0xe): undefined reference to `_kill'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-signalr.o): in function `_getpid_r':
signalr.c:(.text._getpid_r+0x0): undefined reference to `_getpid'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-writer.o): in function `_write_r':
writer.c:(.text._write_r+0x10): undefined reference to `_write'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-closer.o): in function `_close_r':
closer.c:(.text._close_r+0xc): undefined reference to `_close'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-fstatr.o): in function `_fstat_r':
fstatr.c:(.text._fstat_r+0xe): undefined reference to `_fstat'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-isattyr.o): in function `_isatty_r':
isattyr.c:(.text._isatty_r+0xc): undefined reference to `_isatty'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-lseekr.o): in function `_lseek_r':
lseekr.c:(.text._lseek_r+0x10): undefined reference to `_lseek'
arm-none-eabi/bin/ld: arm-none-eabi/lib/thumb/v7-m/nofp/libc_nano.a(lib_a-readr.o): in function `_read_r':
readr.c:(.text._read_r+0x10): undefined reference to `_read'

链接器文件最初“包含”以下静态库:

GROUP (
  "libgcc.a"
  "libc_nano.a"
  "libm.a"
  "libcr_newlib_none.a"
)

现在,我可以通过在 GROUP 语句中添加 "libnosys.a" 来让链接器成功完成其工作。这就是让我感到困惑的地方。为什么只在 Linux 上需要 libnosys.a 中的这些新存根?它们在 Windows 中是如何以及在哪里定义的?我错过了什么?

我的 Windows 和 Linux 上的 GCC 版本分别为 8.3.110.2.1,因为它们与不同版本的 MCUXpresso 捆绑在一起。

提前致谢!

【问题讨论】:

  • 我认为 Windows 和 Linux 的库包括标准函数的不同实现。正如您在错误消息中看到的,所有错过的功能都非常低级。 Windows 实现可能不需要它们,因为它们可以直接调用 Win32 API 函数。
  • 感谢您的评论。有什么文件可以确认吗?
  • 您使用的“libc”(纳米)的文档是怎么说的?顺便说一句,你的目标是什么,原生 Linux 和 Windows,还是你在交叉编译?

标签: c gcc linker newlib


【解决方案1】:

所以我做了更多调查,发现这个问题与 Linux 和 Windows 无关。该问题与不同版本的 MCUXpresso 有关。此外,libcr_newlib_none 库是 MCUXpresso 独有的,在原始 GCC 中不可用。

无论如何,MCUXpresso 11.4.1 中似乎有些问题。我在 NXP 的论坛上创建了a question,以进一步跟进他们的问题。

【讨论】:

    猜你喜欢
    • 2014-07-07
    • 2019-06-06
    • 2018-11-14
    • 2013-07-12
    • 1970-01-01
    • 2019-08-17
    • 2011-08-01
    • 1970-01-01
    • 2018-03-18
    相关资源
    最近更新 更多