glibc-2.11-libgcc_eh-1.patch

本文介绍了一种检查GCC是否提供libgcc_eh库的方法,并详细解释了如何根据检查结果进行相应的链接配置。此外,还提供了不同GCC版本下具体的配置更新细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Submitted By: Joe Ciccone <jciccone@linuxfromscratch.org>
Date: 2006-11-09
Initial Package Version: 2.5
Origin: Joe Ciccone
Upstream Status: Unknown
Description: Checks to see if libgcc_eh has been provided by gcc. If it has the glibc will attempt to link to it.

             Rediffed for 2.9 by Brett Neumeier
             Rediffed for 2.10.1 by Brett Neumeier
             Rediffed for 2.11 by Brett Neumeier

diff --git a/Makeconfig b/Makeconfig
index 9f134cc..1cbed8a 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -538,12 +538,20 @@ else
   libunwind = -lunwind
 endif
 ifneq ($(have-as-needed),yes)
+ifneq ($(have-cc-with-libgcc_eh),yes)
+ libgcc_eh := $(libunwind)
+else
  libgcc_eh := -lgcc_eh $(libunwind)
+endif
 else
  libgcc_eh := -Wl,--as-needed -lgcc_s$(libgcc_s_suffix) $(libunwind) -Wl,--no-as-needed
 endif
 gnulib := -lgcc $(libgcc_eh)
-static-gnulib := -lgcc -lgcc_eh $(libunwind)
+ifneq ($(have-cc-with-libgcc_eh),yes)
+ static-gnulib := -lgcc $(libunwind)
+else
+ static-gnulib := -lgcc -lgcc_eh $(libunwind)
+endif
 libc.so-gnulib := -lgcc
 endif
 ifeq ($(elf),yes)
diff --git a/config.make.in b/config.make.in
index d65706c..807285e 100644
--- a/config.make.in
+++ b/config.make.in
@@ -64,6 +64,7 @@ have-selinux = @have_selinux@
 have-libaudit = @have_libaudit@
 have-libcap = @have_libcap@
 have-cc-with-libunwind = @libc_cv_cc_with_libunwind@
+have-cc-with-libgcc_eh = @libc_cv_cc_with_libgcc_eh@
 fno-unit-at-a-time = @fno_unit_at_a_time@
 bind-now = @bindnow@
 have-hash-style = @libc_cv_hashstyle@
diff --git a/configure b/configure
index ce76653..fe0c1b1 100755
--- a/configure
+++ b/configure
@@ -692,6 +692,7 @@ ASFLAGS_config
 libc_cv_as_needed
 libc_cv_libgcc_s_suffix
 libc_cv_Bgroup
+libc_cv_cc_with_libgcc_eh
 libc_cv_cc_with_libunwind
 VERSIONING
 BISON
@@ -6443,6 +6444,33 @@ _ACEOF
 
   fi
 
+  { $as_echo "$as_me:$LINENO: checking whether to link against libgcc_eh" >&5
+$as_echo_n "checking whether to link against libgcc_eh... " >&6; }
+if test "${libc_cv_cc_with_libgcc_eh+set}" = set; then
+  $as_echo_n "(cached) " >&6
+else
+
+    cat > conftest.c <<EOF
+int main (void) { return 0; }
+EOF
+    if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static -o conftest /
+       conftest.c -v 2>&1 >/dev/null | grep -q " -lgcc_eh "; then
+      libc_cv_cc_with_libgcc_eh=yes
+    else
+      libc_cv_cc_with_libgcc_eh=no
+    fi
+    rm -f conftest*
+fi
+{ $as_echo "$as_me:$LINENO: result: $libc_cv_cc_with_libgcc_eh" >&5
+$as_echo "$libc_cv_cc_with_libgcc_eh" >&6; }
+
+  if test $libc_cv_cc_with_libgcc_eh = yes; then
+    cat >>confdefs.h <</_ACEOF
+#define HAVE_CC_WITH_LIBGCC_EH 1
+_ACEOF
+
+  fi
+
   { $as_echo "$as_me:$LINENO: checking for -z nodelete option" >&5
 $as_echo_n "checking for -z nodelete option... " >&6; }
 if test "${libc_cv_z_nodelete+set}" = set; then
diff --git a/configure.in b/configure.in
index 182c683..7038f8b 100644
--- a/configure.in
+++ b/configure.in
@@ -1505,6 +1505,23 @@ EOF
     AC_DEFINE(HAVE_CC_WITH_LIBUNWIND)
   fi
 
+  AC_CACHE_CHECK(whether to link against libgcc_eh,
+                 libc_cv_cc_with_libgcc_eh, [
+    cat > conftest.c <<EOF
+int main (void) { return 0; }
+EOF
+    if ${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS -static -o conftest /
+       conftest.c -v 2>&1 >/dev/null | grep -q " -lgcc_eh "; then
+      libc_cv_cc_with_libgcc_eh=yes
+    else
+      libc_cv_cc_with_libgcc_eh=no
+    fi
+    rm -f conftest*])
+  AC_SUBST(libc_cv_cc_with_libgcc_eh)
+  if test $libc_cv_cc_with_libgcc_eh = yes; then
+    AC_DEFINE(HAVE_CC_WITH_LIBGCC_EH)
+  fi
+
   AC_CACHE_CHECK(for -z nodelete option,
          libc_cv_z_nodelete, [dnl
   cat > conftest.c <<EOF
--
1.6.3.3

<think>好的,用户遇到了关于compat-libstdc++-33包的问题。他们执行了rpm -q命令,结果显示“package compat-libstdc++ is not installed”,但随后又查询特定版本compat-libstdc++-33时却显示已安装。需要分析原因并提供解决方案。 首先,我需要理解用户的问题所在。看起来用户可能在安装某些软件时遇到了依赖问题,特别是在处理compat-libstdc++相关的包时。用户的命令输出显示,当查询不带版本号的包名时,系统提示未安装,但指定版本号时又显示已安装。这可能是因为包名中的版本号处理方式不同,或者用户混淆了包名。 接下来,我需要回忆RPM包管理的相关知识。RPM包的全名通常包括名称、版本、发行号和架构,例如compat-libstdc++-33-3.2.3-72.el7.x86_64。当使用rpm -q查询时,如果只提供部分名称,可能会不匹配,需要完全匹配包名。用户第一次使用rpm -q compat-libstdc++,而实际安装的是compat-libstdc++-33,因此提示未安装。而指定了完整的包名compat-libstdc++-33后,正确显示了已安装的版本。这说明用户可能输入了错误的包名,或者软件依赖需要的是不带版本号的包名,导致冲突。 然后,我需要确定用户的实际需求。用户可能是在安装某个软件时,遇到了依赖错误,提示缺少compat-libstdc++,但实际已经安装了compat-libstdc++-33。这可能是因为依赖声明中的包名不一致,或者系统需要特定名称的包。例如,某些软件可能依赖compat-libstdc++,而实际上需要安装compat-libstdc++-33,但由于包名不同,系统无法识别已安装的包。 接下来,思考解决方案。首先,确认用户是否真的需要安装compat-libstdc++,或者是否应该安装compat-libstdc++-33。如果依赖问题是因为包名不同,用户可能需要安装另一个包,或者创建符号链接。另外,检查是否安装了正确架构的包,比如x86_64和i686都需要。还可能涉及到yum仓库的配置,确保包可用。如果用户已经安装了正确的包,但依赖仍然报错,可能需要更新系统或启用特定仓库。 然后,考虑用户可能的错误操作。用户在命令行中输入的目录名包含空格,例如“compat-libstdc -33-3.2.3-72.el7.x86_64”,这可能导致路径问题,但根据输出结果,用户似乎是在该目录下执行命令,这可能与问题无关。但需要注意路径中的空格是否影响了命令执行,比如在脚本或安装过程中。 最后,总结问题并提供步骤:用户的问题在于包名不匹配,需要正确安装或解决依赖。解决方案包括使用yum安装正确的包名,检查依赖关系,处理多架构安装,以及可能的符号链接或仓库配置。</think>以下是针对 `compat-libstdc++-33` 包问题的分析和解决方案: --- ### **问题分析** 从你的输出中可以看到两个矛盾的结果: 1. 执行 `rpm -q compat-libstdc++` 时显示 `package compat-libstdc++ is not installed`。 2. 执行 `rpm -q compat-libstdc++-33` 时显示已安装 `compat-libstdc++-33-3.2.3-72.el7.x86_64` 和 `i686` 版本。 **原因**: `compat-libstdc++-33` 是 `compat-libstdc++` 的一个**子包**,且包名中包含版本号 `-33`。当直接查询 `compat-libstdc++` 时,系统默认寻找无版本号的包名,而实际安装的是带有 `-33` 的版本,因此显示未安装。 --- ### **解决方法** 根据场景选择以下方案: --- #### **场景 1:依赖要求明确需要 `compat-libstdc++-33`** 如果软件依赖中明确指定需要 `compat-libstdc++-33`,则当前已安装该包,无需额外操作。 --- #### **场景 2:依赖要求模糊(仅 `compat-libstdc++`)** 若软件依赖声明中仅要求 `compat-libstdc++`(无版本号),但实际需要 `compat-libstdc++-33`,需通过以下步骤修复: 1. **检查可用包** 使用 `yum` 确认仓库中是否提供无版本号的 `compat-libstdc++` 包: ```bash yum list compat-libstdc++ ``` 2. **安装兼容包** 如果仓库中存在独立包: ```bash sudo yum install compat-libstdc++ ``` 3. **强制关联依赖(备用方案)** 如果仓库中无独立包,但已安装 `compat-libstdc++-33`,可尝试通过符号链接解决依赖问题: ```bash # 创建软链接(谨慎操作!) sudo ln -s /usr/lib64/libstdc++.so.6.0.3 /usr/lib64/libstdc++.so.33 ``` --- #### **场景 3:多架构冲突** 如果同时需要 `x86_64` 和 `i686` 架构的包: 1. 确认已安装双架构版本: ```bash rpm -qa | grep compat-libstdc++-33 ``` 2. 若缺少某一架构,手动安装: ```bash sudo yum install compat-libstdc++-33.i686 # 安装i686版本 sudo yum install compat-libstdc++-33.x86_64 # 安装x86_64版本 ``` --- ### **补充说明** - **包名差异**: `compat-libstdc++-33` 是专为兼容旧版 GCC 3.3 库设计的包,而 `compat-libstdc++` 可能指向其他版本(如 GCC 4.x 的兼容包)。 - **仓库配置**: 如果无法通过 `yum` 找到包,检查是否启用了 `base`、`extras` 和 `updates` 仓库: ```bash yum repolist ``` --- ### **验证操作** 1. 检查依赖是否满足: ```bash rpm -q --whatprovides libstdc++.so.33 ``` 2. 确认库文件路径: ```bash ls -l /usr/lib64/libstdc++.so.33* ``` 通过以上步骤可解决包名与依赖不匹配的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值