在此处有一个 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 导出此符号。
问题:
为什么这两个版本之间的不兼容?这些更改属于哪种类别?我在哪里可以找到有关此类更改以及它们存在的原因的更多详细信息?
我被迫使用旧版本,因为这些库是使用它构建的吗?是否没有办法使用较新版本?这些情况通常如何处理?
_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;