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

3

在这里,有一个使用一些外部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目录,尝试在libc.a中找到__ctype_ptr__

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

没有输出,因此这个libc确实没有定义__ctype_ptr__。
继续通过查看需要该符号的库,一个Notepad ++编辑显示以下内容:
/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,因为我需要更高的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个版本之间的不兼容性?这些更改属于哪个类别?我在哪里可以找到更详细的关于这些更改以及它们存在的原因的信息?

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


你能解决这个问题吗?我也遇到了类似的问题,卡住了。 - Salman Azmat
2
嗨@SalmanAzmat。我不记得确切的情况,但我想我(不幸地)不得不使用旧的工具链。我认为我没有找到一个令人满意的答案。 - Zuzu Corneliu
1个回答

1

_ctype_ptr_是指向_ctype_的指针,它是一个包含128个字节的表格,用于ctype.h函数(如isalpha)中使用的位集合。 这些函数将以字符作为参数,并将字符用作_ctype_数组的索引。 读取值时应用掩码,如果非零,则函数返回“true”

在最坏的情况下,您可以定义自己的_ctype_ptr_。

extern const char _ctype_[];

const char* __ctype_ptr__ = _ctype_;

如果链接器报告_ctype_未定义,则可能需要在链接器中定义它。
ctype                   = _ctype_;

并且在源代码中。
extern const char ctype[];

const char* __ctype_ptr__ = ctype;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接