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



在此处有一个 project ,即使用> 一些外部GNU-ToolChain构建的库(在外部,在外部,提供,提供没有源代码)。我正在为嵌入式系统(特别是 freertos )编译应用程序,因此I >使用Newlib

i 最初尝试使用此工具链https://releases.linaro.org/components/toolchain/binaries/7.4-2019.02/aarch644-fel.linaro.org/component但这是因为(除其他)这些链接器错误

undefined reference to `__ctype_ptr__'

似乎应该由libc 定义此符号。进入 newlib sysroot ,特别是在这种情况下, sysroot-newlib-linaro-2019.02-aarch64-fell usr usr usr lib lib 目录libc.a

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

没有输出,所以 this libc 确实不定义__ctype_ptr __

继续继续查看需要符号 Notepad 编辑eDIT揭示了,>

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

这意味着使用 5.4.1 AARCH64-ELF工具链版本版本和我试图使用版本7.4 以来strong>我需要更新的C 标准支持。

下载了5.4.1版本(仅SYSRoot):https://releases.linaro.org/components/components/toolchain/toolchain/binaries/5.4-2017.05/aarch64-15/aarch64-fell>

再次进入5.4.1 sysroot-newlib-linaro-2017.05-aarch64-elf usr usr lib lib 目录这次:

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

最终揭示了:

0000000000000000 D __ctype_ptr__

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

问题:

  1. 为什么这两个版本之间的不兼容?这些更改属于哪种类别?我在哪里可以找到有关此类更改以及它们存在的原因的更多详细信息?

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

_ctype_ptr_ 只是指向_ctype_的指针包含ctype.h函数诸如 isalpha的函数。功能将以角色为参数,并将使用字符是_ctype_数组的索引。将掩码应用于读取值,如果非零,则函数返回" true"

您可以定义自己的情况

extern const char _ctype_[];
const char* __ctype_ptr__ = _ctype_;

如果链接器未定义_ctype_,您可能必须在链接器中定义它

ctype                   = _ctype_;

和源代码。

extern const char ctype[];
const char* __ctype_ptr__ = ctype;

最新更新