linux - 遗留系统上新 libstdc++ 中的段错误

标签 linux gcc g++ arm

我正在尝试将当前 (GCC >= 4.6) 工具链 retrofit 到基于 glibc 2.3.6 的旧式嵌入式 ARM/Linux 系统上。我已经成功构建了工具链,但现在我的测试程序在 libstdc++ 中出现段错误,例如:

int main()
{
    int* foo = new int[100];
    delete [] foo;
    return 0;
}

... libstdc++ 静态初始化中的段错误:

#0  0x40082778 in (anonymous namespace)::__future_category_instance ()
    at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:64
#1  0x40082bb0 in __static_initialization_and_destruction_0 (__priority=65535, __initialize_p=1)
    at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:103
#2  _GLOBAL__sub_I_future.cc(void) () at /path/to/src/gcc-4.6.4/libstdc++-v3/src/future.cc:109
#3  0x400e92b8 in __do_global_ctors_aux () from /path/to/symbols/libstdc++.so.6
#4  0x400627a0 in _init () from /path/to/symbols/libstdc++.so.6
#5  0x4000b5e4 in ?? () from /path/to/sysroot/lib/ld-linux.so.2
#6  0x4000b5e4 in ?? () from /path/to/sysroot/lib/ld-linux.so.2
Backtrace stopped: previous frame identical to this frame (corrupt stack?)

我还有几个例子,但崩溃站点看起来都与此类似:

Dump of assembler code for function (anonymous namespace)::__future_category_instance():
   0x40082764 <+0>: ldr r3, [pc, #264]  ; 0x40082874 <(anonymous namespace)::__future_category_instance()+272>
   0x40082768 <+4>: push    {r11, lr}
   0x4008276c <+8>: add r11, sp, #4
   0x40082770 <+12>:    sub sp, sp, #64 ; 0x40
   0x40082774 <+16>:    mov r1, #0
=> 0x40082778 <+20>:    ldr r3, [r1, r3]

我将其解释为代码试图从基地址 0(r1 = 0,在本例中 r3 为 3736)读取,这可能暗示重定位问题?

当我使用 -static-static-libgcc -static-libstdc++ 强制加载 libgcc_s 进行构建时,会发生这种特殊的崩溃.so.1 和 libstdc++.so.6 来 self 的工具链,通过 LD_LIBRARY_PATH。

我几乎被困在这里,如果能提供任何关于我的工具链可能有什么问题的线索,以及它是否应该起作用,我将不胜感激。

最佳答案

所以我现在追踪到一个 change in GCC 4.6.0这似乎破坏了我被迫在此处使用的过时 ABI (APCS) 的代码生成。

撤销更改后,我的测试代码现在可以成功运行。

关于linux - 遗留系统上新 libstdc++ 中的段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19800531/

相关文章:

c++ - 未定义对 vector<String> 的引用 g++ 链接器错误

linux - gcc 4.x 不支持 x87​​ FPU 数学?

c++ - 无法在 Linux 上使用 Sleep() 编译 C++ 代码——要包含哪个库?

gcc - GCC LTO 是否执行跨文件死代码消除?

linux - PowerShell 脚本查找文件中的特定单词并在行开头添加 “4”

c - 为什么 Gcc 会以错误的方式编译代码?

C++ GCC 为什么这段 sfinae 代码可以用 GCC 4.7 编译,但不能用 4.8 编译?

c++ - 如何从成员函数模板类型签名中删除 const?

linux - 限制每个 IP 地址每分钟的数据包

linux - 了解 NASM 程序集中的递归阶乘函数