NixOS 更新的 GLIBC 版本被 nix-shell 外部环境强制执行

NixOS newer GLIBC version forced by environment outside nix-shell

提问人:Daniel Jour 提问时间:11/15/2023 最后编辑:Daniel Jour 更新时间:11/19/2023 访问量:66

问:

我的 NixOS 系统运行在当前的 nixos-23.05 频道上。但是我在我的configuration.nix中使用了当前nixos-unstable频道的vscode,如下所示:

{ config, pkgs, ... }:
let
  unstable = import <nixos-unstable> { config = { allowUnfree = true; }; };
in
{
# ...
  users.users.musteresel = {
    isNormalUser = true;
    description = "Daniel Jour";
    packages = with pkgs; [
      # ...
      unstable.vscode.fhs
    ];
  };
# ...
}

Nixos-23.05 通道上的 glibc 版本是 2.37,不稳定通道上的 glibc 版本是 2.38。VSCode 运行良好,没有任何问题!

但是,如果我从VS Code中打开终端,请转到我的一些(C++ + cmake + nix shell)项目目录并执行

nix-shell
cmake -S . -B build-from-vscode
cmake --build build-from-vscode

然后我得到一个可执行文件,它以某种方式依赖于 GLIBC 版本 2.38(通过符号,如 readelf 和 nm 报告的那样)。fmod

如果我从“正常”(VS 代码之外)终端执行相同的操作:

nix-shell
cmake -S . -B build-outside
cmake --build build-outside

然后我得到一个不依赖于 GLIBC 2.38 的可执行文件。

这种杂质从何而来?两个 nix-shell 的 CMake、编译器等版本是相同的(相同的 nix 存储路径!)(当然,因为它们使用相同的 shell.nix 文件,并且都使用 nixos-23.05 通道中的软件包)。

编辑杂质似乎来自环境变量,并且 ,因为它们包含引用 vscode 的 fhs 环境的值(其中包含较新的 glibc):NIX_CFLAGS_COMPILENIX_CFLAGS_LINKNIX_LDFLAGS

NIX_CFLAGS_COMPILE=-idirafter /usr/include
NIX_CFLAGS_LINK=-L/usr/lib -L/usr/lib32
NIX_LDFLAGS=-L/usr/lib -L/usr/lib32

在我的:shell.nix

  shellHook = ''
    unset NIX_LDFLAGS
    unset NIX_CFLAGS_COMPILE
    unset NIX_CFLAGS_LINK
  '';

解决了从 vscode 中运行 nix-shell 时的此问题。但是,当通过 vscode(使用 nix-environment 扩展)运行构建时,它并不能解决问题。

Linux glibc nixos

评论

0赞 Daniel Jour 11/15/2023
注意:使用时没有区别nix-shell --pure

答:

1赞 Employed Russian 11/19/2023 #1

这种杂质从何而来?

我对 nix-shell 或 vscode 一无所知,但您可以通过跟踪哪个库提供符号定义来判断引用的来源,您可以通过与 flag 链接来做到这一点。GLIBC_2.38fmod-Wl,-y,fmod

毫无疑问,您的两个版本使用的是不同版本的 .“问题”版本正在使用较新版本(也可能是较新版本),该版本定义了 .libm.so.6libm.so.6math.hfmod@@GLIBC_2.38

此处介绍了链接器如何决定要使用的符号版本。