2

从 GCC 版本 4.6 开始,无法使用 GCC-4.8.5 打印回溯或堆栈转储,默认设置已更改为 -fomit-frame-pointer。通过使用 --enable-frame-pointer 配置选项配置 GCC,可以将默认值恢复为 -fno-omit-frame-pointer 一样在互联网上阅读。因此,我使用以下配置选项在我的主目录中安装了 GCC-4.5.3。

配置选项:

../gcc-4.5.3/configure -v --prefix=/home/GCC1-4.5.3/usr --infodir=/home/GCC1-4.5.3/usr/build/share/info --mandir=/home/GCC1-4.5.3/usr/build/share/man --libdir=/home/GCC1-4.5.3/usr/build/lib64 --libexecdir=/home/GCC1-4.5.3/usr/build/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java --with-gxx-include-dir=/home/GCC1-4.5.3/usr/build/include --enable-ssp --enable-frame-pointer --disable-libssp --disable-plugin --with-bugurl=http://bugs.opensuse.org/ --with-pkgversion='SUSE Linux' --disable-libgcj --disable-libmudflap --with-slibdir=/home/GCC1-4.5.3/usr/build/lib64 --enable-__cxa_atexit --enable-libstdcxx-allocator=new --disable-libstdcxx-pch --enable-version-specific-runtime-libs --enable-linker-build-id --enable-linux-futex --program-suffix=-4.5.3 --without-system-libunwind --with-arch-32=i686 --with-tune=generic --build=x86_64-suse-linux --host=x86_64-suse-linux

在包含我安装的 GCC 编译器之前,我的 Makefile.common 如下所示:

CROSS_COMPILER_PREFIX = x86_64-dx-linux-gnu
ADDR2LINE = $(CROSS_COMPILER_PREFIX)-addr2line
AR        = $(CROSS_COMPILER_PREFIX)-ar
AS        = $(CROSS_COMPILER_PREFIX)-as
CXX       = $(CROSS_COMPILER_PREFIX)-c++
CXXFILT   = $(CROSS_COMPILER_PREFIX)-c++filt
CPP       = $(CROSS_COMPILER_PREFIX)-cpp
GXX       = $(CROSS_COMPILER_PREFIX)-g++
GCC       = $(CROSS_COMPILER_PREFIX)-gcc
GCCBUG    = $(CROSS_COMPILER_PREFIX)-gccbug
GCOV      = $(CROSS_COMPILER_PREFIX)-gcov
LD        = $(CROSS_COMPILER_PREFIX)-ld

安装后,我在 Makefile.common 中包含了编译器,如下所示:

CROSS_COMPILER_PREFIX = x86_64-dx-linux-gnu (GCC-4.8.5 Prefix)
CROSS_COMPILER_PREFIX = x86_64-suse-linux(My installed GCC-4.5.3 Prefix) 
ADDR2LINE = $(CROSS_COMPILER_PREFIX)-addr2line
CXX       = $(CROSS_COMPILER_PREFIX)-c++-4.5.3
CXXFILT   = $(CROSS_COMPILER_PREFIX)-c++filt
CPP       = $(CROSS_COMPILER_PREFIX)-cpp-4.5.3
GXX       = $(CROSS_COMPILER_PREFIX)-g++-4.5.3
GCC       = $(CROSS_COMPILER_PREFIX)-gcc-4.5.3
GCCBUG    = $(CROSS_COMPILER_PREFIX)-gccbug
GCOV      = $(CROSS_COMPILER_PREFIX)-gcov-4.5.3
LD        = $(CROSS_COMPILER_PREFIX)-ld

包括当我尝试发出 make 命令后,它失败并出现以下错误

/usr/bin/ld: cannot find /usr/lib64/libmvec_nonshared.a
/usr/bin/ld: cannot find /lib64/libmvec.so.1
collect2: ld returned 1 exit status

我还观察到这两个库都存在于另一个路径中,而不存在于上述(/usr/lib64/、/lib64)路径中。我无权运行 sudo 命令或创建链接或在 /usr/ 路径中进行任何更改。下面是我运行 ld -lmvec --verbose 时的输出。

attempt to open /usr/x86_64-suse-linux/lib64/libmvec.so failed
attempt to open /usr/x86_64-suse-linux/lib64/libmvec.a failed
attempt to open /usr/lib64/libmvec.so failed
ld: cannot find -lmvec

笔记:

使用 GCC_4.8.5 制作成功,而我安装的 GCC_4.5.3 制作失败。

谁能帮我解决这个问题?我需要更改 Makefile.common 中的任何内容吗?为什么使用 GCC_4.8.5 制作成功而 GCC_4.5.3 失败?

如何在 Makefile 中进行更改以在库当前路径中进行 ld 搜索?

除了这个查询之外,任何人都可以帮我检查是否省略了帧指针?

提前致谢。

4

1 回答 1

0

如果您正在编译 gcc,请尝试使用 --with-glibc-version=xxx。我使用自己的工具链,在其中添加了 gcc 编译器中指定的 glibc 版本来解决问题。

于 2021-03-05T07:28:38.753 回答