提问人:Daniel Jour 提问时间:11/15/2023 最后编辑:Daniel Jour 更新时间:11/19/2023 访问量:66
NixOS 更新的 GLIBC 版本被 nix-shell 外部环境强制执行
NixOS newer GLIBC version forced by environment outside nix-shell
问:
我的 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_COMPILE
NIX_CFLAGS_LINK
NIX_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 扩展)运行构建时,它并不能解决问题。
答:
这种杂质从何而来?
我对 nix-shell 或 vscode 一无所知,但您可以通过跟踪哪个库提供符号定义来判断引用的来源,您可以通过与 flag 链接来做到这一点。GLIBC_2.38
fmod
-Wl,-y,fmod
毫无疑问,您的两个版本使用的是不同版本的 .“问题”版本正在使用较新版本(也可能是较新版本),该版本定义了 .libm.so.6
libm.so.6
math.h
fmod@@GLIBC_2.38
此处介绍了链接器如何决定要使用的符号版本。
评论
nix-shell --pure