Linux 使用gcc的外部版本编译时,可执行文件已损坏

Linux 使用gcc的外部版本编译时,可执行文件已损坏,linux,gcc,g++,cross-compiling,Linux,Gcc,G++,Cross Compiling,我有一个非常简单的测试程序foo.cpp: 现在,出于我不想深入讨论的原因,我正在尝试使用驻留在网络文件夹中的GCC4.4.0的单独副本构建代码。gcc是很久以前由其他人构建的,目的是在Centos机器上使用它,总的来说,它在许多情况下都运行良好。不幸的是,在这种情况下,它会产生错误的代码: >导出路径=/a/network/drive/gcc44/bin:$PATH >g++版本 g++GCC4.4.0 版权所有C 2009自由软件基金会,Inc. 这是自由软件;有关复制条件,请参见源。没有

我有一个非常简单的测试程序foo.cpp:

现在,出于我不想深入讨论的原因,我正在尝试使用驻留在网络文件夹中的GCC4.4.0的单独副本构建代码。gcc是很久以前由其他人构建的,目的是在Centos机器上使用它,总的来说,它在许多情况下都运行良好。不幸的是,在这种情况下,它会产生错误的代码:

>导出路径=/a/network/drive/gcc44/bin:$PATH >g++版本 g++GCC4.4.0 版权所有C 2009自由软件基金会,Inc. 这是自由软件;有关复制条件,请参见源。没有 担保甚至不是为了适销性或适合某一特定目的。 >g++foo.cpp-o foo >/富 分段故障堆芯 gdb提供以下跟踪:

程序以信号11终止,分段故障。 memcmp中的0 0x0000000000600f30@@GLIBC_2.2.5 缺少单独的调试信息,请使用:debuginfo安装glibc-2.12-1.132.el6.x86_64 libgcc-4.4.7-4.el6.x86_64 libstdc++-4.4.7-4.el6.x86_64 gdb bt memcmp中的0 0x0000000000600f30@@GLIBC_2.2.5 std::char_traits::comparechar const*,char const*,无符号长 2 0x0000000000400a3d in_u_gnu_cxx::_enable_if::_type std::operator==std::basic_string const&,std::basic_string const& 3 0x000000000040092c主接线盒 我尝试修改我的LD_LIBRARY_路径以添加/a/network/drive/gcc44/lib,然后它从那里加载libgcc_.so.1和libstdc++.so.6,但结果是一样的。在编译时添加这些库路径也没有什么区别

如果我将最后一行代码替换为返回A.compareB;,没有分段错误

我希望大多数答案都能读到,不要再做那么愚蠢的事了,但情况在很大程度上超出了我的控制范围。我至少需要试着让这项工作成功,如果它永远不会成功,那么我真的很想知道这里到底出了什么问题。我想gcc的远程副本拾取了一些头文件,这些头文件对于我主机上的libc副本无效,或者诸如此类的东西,但我正在努力确定它。有人能帮我再把这个解开一点吗

编辑

让我澄清在编译时和运行时找到的libstdc++库

为了找出找到的编译时库,我使用了g++-v,然后按顺序搜索了libstdc++的所有-L路径

编译时间:本地g++

查找/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../../../../../../lib64/libstdc++.so.6 …即/usr/lib64/libstdc++.so->libstdc++.so.6.0.13 编译时:远程g++

查找/a/network/drive/gcc44/bin/./lib/gcc/x86_64-unknown-linux-gnu/4.4.0/../../../../../../../../lib64/libstdc++.so …即/a/network/drive/gcc44/lib64/libstdc++.so->libstdc++.so.6.0.11 运行时

在LD_LIBRARY_路径上使用/a/network/drive/gcc44/lib64时:

LD_LIBRARY_路径上没有/a/network/drive/gcc44/lib64:

在运行时,我使用的libstdc++没有区别:使用本地g++构建的程序在这两种情况下都能工作,使用remove g++seg fault构建的程序在这两种情况下都能工作

编辑2


关于进一步挖掘。。。添加-O3可以消除这个问题,-B/usr/bin ie也可以从我的主机使用链接器。使用远程4.4.0链接器,memcmp的地址被映射到完全错误的偏移量——它位于可执行文件的数据部分。可能gcc版本或其编译方式存在一个模糊的错误/问题…

从使用g++-E预处理源文件开始,并手动检查输出中是否存在虚假的include。这将允许确认/排除您当前的理论。@oakad:g++-E或g++-M产生大量输出。在每种情况下,本地主机包含看起来都一样,而在这两种情况下,gcc文件夹中包含的路径显然不同。我看不到任何看起来虚假的东西,但我真的不知道我在寻找什么…GCC4.4已经很老了。当前通用条款为4.8.2。libstdc++是特定于编译器的。@BasileStarynkevitch:如果可以的话,我会使用更晚的gcc。你能详细谈谈你的其他评论吗?我尝试在编译时或运行时使用远程libstdc++,或者两者都使用-结果总是一样的。您需要了解哪个libstdc++可能与ldd foo一起使用,或者使用g++-v进行编译。
#include <string>
int main(int argc, const char** argv)
{
    std::string A = "blah";
    std::string B = "bluh";
    return A==B;
}
> ldd foo
    linux-vdso.so.1 =>  (0x00007fff725ff000)
    libstdc++.so.6 => /a/network/drive/gcc44/lib64/libstdc++.so.6 (0x00007f9a0f3f3000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003955200000)
    libgcc_s.so.1 => /a/network/drive/gcc44/lib64/libgcc_s.so.1 (0x00007f9a0f1dc000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003954600000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003953e00000)
> ldd foo
    linux-vdso.so.1 =>  (0x00007fff2ddff000)
    libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000032c1e00000)
    libm.so.6 => /lib64/libm.so.6 (0x0000003955200000)
    libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000032c3600000)
    libc.so.6 => /lib64/libc.so.6 (0x0000003954600000)
    /lib64/ld-linux-x86-64.so.2 (0x0000003953e00000)