虚拟机在升级安装glibc时执行make后报错

img


报了../sysdeps/x86_64/multiarch/strchr.S:28: Error: unrecognized symbol type "gnu_indirect_function"错误

  • 以下回答由chatgpt基于相关博客总结生成:

    在升级安装glibc时遇到了以下错误: /tmp/ccYcAjzA.s: Error: loc1@GLIBC_2.17' can't be versioned to common symbol 'loc1' /tmp/ccYcAjzA.s: Error:loc2@GLIBC_2.17' can't be versioned to common symbol 'loc2' /tmp/ccYcAjzA.s: Error: `locs@GLIBC_2.17' can't be versioned to common symbol 'locs'

    这个错误是由于定义的loc1、loc2和locs变量在链接时被标记为版本化符号,而导致冲突。我们可以通过修改glibc-2.24\misc\regexp.c文件来解决这个错误。将如下代码注释掉:

    //char loc1; //char loc2; char loc1 attribute ((nocommon)); char loc2 attribute ((nocommon));

    //char locs; char locs attribute ((nocommon));

    然后重新进行编译和安装。

    请注意,以上解决方案仅适用于特定的错误情况,如果遇到其他错误,请提供详细的错误信息,以便我能够给出更精确的解决方案。


按照LFS手册...

要先按顺序安装gmp,mpfr,mpc

可以参考下

先检查下是否已经安装了所有必要的依赖库和头文件。在编译前,可以再次检查系统是否缺少必要的依赖库和头文件,尤其是与的多版本相关的库和头文件。
再次确认下你设置的编译选项是否正确。比如是否设置了正确的编译器选项、优化选项、体系结构选项等。
尝试使用更旧的版本。有时候,升级的版本可能存在一些已知的问题,尝试使用更旧的版本可能会避免这个问题。

将编译器版本升级到最新版本试试

编译器版本不兼容

由于glibc版本与系统架构不兼容导致的。

make ARCH=x86_64 M=$(pwd)/objs/compat-libc

其中,ARCH参数指定了系统架构,M参数指定了编译的目标路径。

如果编译成功,则将生成的文件复制到虚拟机的根目录下。

在虚拟机中执行以下命令更新系统的动态链接库缓存:

sudo ldconfig

该错误通常是由于使用较旧的版本的GCC编译器导致的,该版本的GCC不支持gnu_indirect_function符号类型。解决此问题的一种方法是升级GCC编译器到较新的版本。

以下是一些可能有助于解决问题的步骤:

  1. 更新系统软件包:确保你的系统已经更新到最新版本。可以运行以下命令来更新软件包:
    bash sudo apt-get update
    sudo apt-get upgrade

  2. 安装较新版本的GCC:尝试安装较新版本的GCC编译器。可以运行以下命令来安装GCC:
    bash sudo apt-get install gcc

  3. 设置默认编译器版本:如果你已经安装了多个GCC版本,可以设置默认编译器版本为较新的GCC。可以使用update-alternatives命令进行设置。例如,如果你想将默认编译器设置为gcc-9,可以运行以下命令:
    bash sudo update-alternatives --set gcc /usr/bin/gcc-9

  4. 清理并重新构建:在尝试重新构建之前,可以尝试清理之前构建过程中生成的临时文件和对象文件。可以运行以下命令进行清理:
    bashmake clean

  5. 检查其他依赖项:确保你已经安装了所有必要的依赖项,如binutilslibc6-dev等。可以运行以下命令来安装它们:
    bash sudo apt-get install binutils libc6-dev

尝试上述步骤后,再次执行make命令,看看是否能够成功编译。如果问题仍然存在,请提供完整的错误消息和相关的编译命令,以便更进一步地帮助你解决问题。

由于编译环境中缺少某些必要的依赖项或使用了不兼容的编译器版本导致的
1、检查系统已经安装了build-essential等必要的软件包
2、将编译器版本升级到最新版本,以便与glibc的最新版本兼容。
3、尝试在编译时禁用multiarch支持。在make命令行中添加以下参数:makelibcdir="no"

引用chatgpt内容作答:
这个错误通常表示在编译glibc时使用的汇编指令集不兼容。可能是由于虚拟机的配置或其他环境问题导致的。

要解决这个问题,你可以尝试以下几个步骤:

1、确保你正在使用支持所需指令集的虚拟机。如果你在64位系统上安装32位虚拟机,或者使用不兼容的虚拟化平台,可能会导致此类错误。确保虚拟机和主机系统的位数和指令集相匹配。

2、检查你的编译环境。确保你的系统已经安装了正确版本的编译工具链(如GCC),并且没有发生任何冲突或配置问题。尝试更新编译工具链到最新版本,以确保没有已知的问题。

3、如果你使用的是自定义的编译选项,尝试使用默认的选项重新编译glibc。有时候使用非标准的选项会导致兼容性问题。尝试使用默认选项编译glibc,然后再次运行make命令。

4、也可能是因为你的 glibc 版本与你使用的编译器不兼容。解决这个问题的一种方法是升级你的编译器,以确保它与你使用的 glibc 版本兼容。

另外,也可以尝试使用与你当前的 glibc 版本匹配的编译器进行编译。你可以在 glibc 的官方文档或源代码仓库中查找与该版本兼容的编译器版本信息。

5、如果你是在 Linux 系统上升级 glibc,建议你谨慎进行操作,因为 glibc 是系统的核心库,可能会对系统稳定性产生影响。最好在备份系统之后再进行尝试。
6、清理编译缓存:有时候编译过程中的缓存可能导致问题。尝试清理缓存并重新编译。可以通过以下命令进行清理:

make clean

7、检查编译环境:确保你的编译环境正确配置。你可能需要安装必要的开发工具和库。例如,在Ubuntu上,可以使用以下命令安装相关工具:

sudo apt-get install build-essential

如果上述步骤都没有解决问题,可能需要考虑在不同的虚拟机或物理机上进行编译。有时候在特定的环境中可能会出现一些不明原因的兼容性问题。尝试在另一台机器上重新安装虚拟机并编译glibc,看看问题是否仍然存在。

参考 https://blog.csdn.net/carefree2005/article/details/117559312

以下答案参考newbing,回答由博主波罗歌编写:
根据您提供的错误信息,虚拟机在执行make命令时报错,指出发生了"unrecognized symbol type "gnu_indirect_function"的错误。这个错误通常表示所使用的glibc库版本与编译器版本不兼容。

要解决这个问题,您可以尝试以下几种方法:

  1. 更新编译器:确保您使用的编译器版本与您所使用的glibc库版本兼容。您可以尝试升级或更新您的编译器版本,并重新执行make命令。

  2. 更新glibc库:如果您的编译器版本已经是最新的,那么可能是glibc库的问题。尝试更新您的glibc库版本,然后重新执行make命令。

  3. 检查依赖关系:确保您的系统已经安装了所有必需的依赖项。有时missing或incompatible的依赖项会导致此类错误。使用适当的包管理工具安装所需的依赖项,并重新执行make命令。

请注意,在解决这个问题之前,最好先了解您的系统环境和软件版本,为解决方法提供更具体的建议。另外,请确保您的代码与问题无关,因为您的问题是与编译器和glibc库相关的。
如果我的回答解决了您的问题,请采纳!