strtod() 的可怕错误:glibc-2.13 不向后兼容 glibc-2.9
Horrid error with strtod(): glibc-2.13 NOT backwards compatible with glibc-2.9?
我正在研究需要在几个不同的嵌入式平台上运行的C和C++程序,为此我有交叉编译器,因此我可以在x86桌面上进行构建。
我对某些函数有一个可怕的问题,例如"strtod(("。这是我的简单测试程序:
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char **argv)
{
if ( (argc < 2) || (NULL == argv[1]) ) return 0;
double myDouble = strtod(argv[1], NULL);
printf("nValue: %fnn", myDouble);
return 0;
}
通常,我使用动态链接构建所有程序,以使二进制文件尽可能小。以上在x86和Power PC上工作正常。然而,在 Arm 系统(带有 Debian 的 BeagleBoard xM(上,strtod(( 行为不正常(程序总是输出"0.000000"(。
我尝试使用选项"-static"构建程序,这适用于小猎犬:
root@beaglexm:/app# ./test.dynamic 1.23值:0.000000 [动态链接版本 - 错误!!root@beaglexm:/app# ./test.static 1.23值:1.230000 [正确!!]
我还在BeagleBone Black上进行了测试,它的分布略有不同。两个版本(静态和动态(在BBB上都运行良好。
在库中翻找,我发现了以下版本号:
交叉编译器工具链:libc-2.9.so
BeagleBoard XM(不起作用(:
libc-2.13.so小猎犬骨黑(作品!(:libc-2.16.so
所以我的交叉编译器正在针对旧版本的 glibc 构建。我在几个地方读到glibc应该是向后兼容的。
我只考虑过静态链接libc,但根据这个问题,除非所有库都是静态链接的,否则这是一个坏主意。
静态链接一切确实有效,但系统存在严重限制,这意味着我需要保持二进制文件尽可能小。
任何想法会导致strtod(((和类似函数(出现可怕的问题和/或为什么glibc 2.13不向后兼容?
编辑:我没有提到"soname"(即顶级名称(在所有平台上都是相同的:"libc.so.6"从我对文档的阅读来看,"soname"中 .so 后面的数字是主要版本,只有在界面更改时才更改 - 因此所有这些版本都应该兼容。出现在实际文件名中的 .so 前面的数字(如上所示,通过符号链接找到(是次要版本。请参阅:链接
通常版本号反映了兼容性。 出现在.so
和下一个点之间的数字表示主要修订版,不保证与任何其他主要修订版兼容。
后面的数字(只有当您点击符号链接时才能看到(表示次要修订。 这些可以互换使用,符号链接就是用来做到这一点的。 该程序链接到libc.so.6
或其他任何东西,在实际文件系统上,libc.so.6
是指向(例如(libc.so.6.12
的符号链接。
glibc 试图保持兼容性,即使是跨主要修订版,但有时他们只需要接受重大更改。 通常,当发布新版本的 C 或 POSIX 标准并且函数签名以破坏二进制兼容性的方式更新时。
如果更改,出现在.so
之前的任何数字也会破坏兼容性;这些数字通常表示程序的完全重写。 例如glib
vs glib2
. 不关心 libc。
该工具ldd
对于调查库依赖项和发现库的实际加载时间非常有用。
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- 了解 glibc 错误"corrupted size vs. prev_size"
- 为什么我会收到 glibc 错误
- 错误: *** 检测到 glibc *** w5:双重释放或损坏(快速顶部):
- 所需输出后出现 glibc 错误
- 错误消息glibc检测到Malloc():内存损坏(快速)
- C++glibc双自由错误
- C++glibc检测到损坏的双链表错误C++
- Glibc错误:双重释放或损坏
- 运行时错误:"*** glibc detected ***: double free or corruption (out)"
- glibc 检测到 free() 无效大小(快速)错误
- Glibc 2.7 配置错误程序太旧
- strtod() 的可怕错误:glibc-2.13 不向后兼容 glibc-2.9
- 写出文件时出现奇怪的 glibc 错误
- glibc上valgrind的输出在C++中检测到错误
- glibc 'div()' 代码中的错误
- C++Glibc检测到错误.双重自由或腐败
- c++:编译src时出现glibc无效指针错误
- 错误glibc检测到free():无效的下一个大小(fast)
- 如何更正程序中检测到的***glibc错误