GNU工具链(newlib):工具链版本之间的兼容性(未定义符号__ctype_ptr __)

时间:2019-03-01 08:08:36

标签: gcc linker-errors gnu newlib

这里有一个项目,该项目使用一些外部GNU工具链构建的库(外部提供,没有源代码)。我正在为嵌入式系统(特别是 FreeRTOS )编译一个应用,所以我使用newlib

最初尝试使用此工具链https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch64-elf/ 但这失败的原因是(其中包括)以下链接器错误

undefined reference to `__ctype_ptr__'

似乎该符号应该由libc定义。进入 newlib sysroot ,在本例中特别是 sysroot-newlib-linaro-2019.02-aarch64-elf \ usr \ lib 目录,试图在其中找到__ctype_ptr__ libc.a

aarch64-elf-nm -C --defined-only -g libc.a | grep __ctype_ptr__

无输出,因此此libc 实际上未定义__ctype_ptr __

继续查看需要符号的库记事本++编辑显示,其中包含以下内容:

/opt/gcc-linaro-5.4.1-2017.05-x86_64_aarch64-elf/aarch64-elf/libc/usr/include/machine

这意味着该库是使用 5.4.1 aarch64-elf工具链版本构建的,并且自< strong>我需要更新的C ++标准支持

也下载了5.4.1版本(仅限sysroot):https://releases.linaro.org/components/toolchain/binaries/5.4-2017.05/aarch64-elf/

同样,这次进入5.4.1 sysroot-newlib-linaro-2017.05-aarch64-elf \ usr \ lib 目录:

aarch64-elf-nm -C --defined-only -g libc.a | grep __ctype_ptr__

最终揭示:

0000000000000000 D __ctype_ptr__

这意味着确实 5.4.1 newlib libc 会导出该符号。

问题:

  1. 为什么两个版本之间的这种不兼容性?这些变化属于什么类别?在哪里可以找到有关此类更改及其发生原因的更详细信息?

  2. 我是否被迫使用旧版本,因为这些库是使用旧版本构建的?没有办法使用较新的版本吗? 通常如何处理这些情况

0 个答案:

没有答案