已掉线,重新登录

找到400785个回复

yingshaoxo 15楼回复 yingshaoxo浅谈如何绕过glibc的版本不兼容限制,制造c版本的"python" (06-10 10:45//)
用户被禁言,发言自动屏蔽。
c 6楼回复 c还有统计源码吗? (06-10 10:40//)
公开

@hik,你这个我挂梯子都注册不了,十几年前用过但是忘记名字了
掌缘生灭(白)

c 5楼回复 c还有统计源码吗? (06-10 10:31//)
公开

@方妹@芯夏雨,我现在是在go里面写死了函数,感觉有点憨憨
掌缘生灭(白)

c 4楼回复 c还有统计源码吗? (06-10 10:30//)
公开

@hik,ok
掌缘生灭(白)

上善若水 14楼回复 yingshaoxo浅谈如何绕过glibc的版本不兼容限制,制造c版本的"python" (06-10 09:49//)

@yingshaoxo,打包成docker镜像呢
一加ace2Pro(灰|24+1024)

胡椒舰长 19楼回复 demotodesk远控太恶心了 (06-10 07:44//)
yingshaoxo 13楼回复 yingshaoxo浅谈如何绕过glibc的版本不兼容限制,制造c版本的"python" (06-10 07:19//)
用户被禁言,发言自动屏蔽。
yucho 9楼回复 MK谁知道那有便宜的服务器卖。 (06-10 06:54//)

@hui214,可能需要挂梯子,因为注册时会使用 reCaptcha 进行验证

上善若水 10楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-10 03:03//)
公开

@无名啊,flac吧音质好,文件体积小
一加ace2Pro(灰|24+1024)

无名啊 9楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-10 00:37//)
公开

@咯叽,手机空间小,还是得挤挤水分,不然不够用。。

为了能存下大量电视剧 / 有声书,我都被逼的找到这个 12 kbps 的格式了。。

罐子 18楼回复 demotodesk远控太恶心了 (06-10 00:32//)

@胡椒舰长,headscale没有用这个,这个自建没有ui配置麻烦。
用的tailscale官方协调控制
一加8Pro

咯叽 8楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-10 00:32//)
公开
层主 @咯叽 于 2025-07-10 16:21 删除了该楼层。
无名啊 7楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-10 00:18//)
公开

@tasy5kg,诶。。尴尬,怎么 opus 的 UBB 是「链接」。。

@老虎会游泳,是不是上传 opus 后,被识别成普通文件,而不是音乐了。。

tasy5kg 6楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-10 00:13//)
公开

为啥 opus 音乐不能在线预览呢

我试了把 opus 的音频链接 UBB 设置成“音频流”就能在线预览了

无名啊 5楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-09 23:49//)
公开

@tasy5kg,现在纠结,该用 Opus、AAC-LC、xHE-AAC、MP3 哪种格式多少码率保存,音质损失最小。。

知乎上,我就看到很多人说,🍎 256 Kbps AAC 音质最好,近乎无损。。

但又有人说,AAC 容易变糊,MP3 听感更好。。(如该帖

从 OPUS 曲线上看,确实不错。但我自己测试,极低时 opus 打不过 xHE-AAC。但又有人说 xHE-AAC 不适合高码率。。

我已经凌乱了。。

无名啊 2楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-09 23:37//)
公开

@老虎会游泳,为啥 opus 音乐不能在线预览呢。。

我看 caniuse 说,除了 🍎 MacOS 需要 15.4+,其他系统应该都支持了呀。。

无名啊 4楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-09 23:35//)
公开

@tasy5kg,居然不对比 xHE-AAC,感觉这格式挺优秀的呀,为啥这么多年都不流行。。

tasy5kg 3楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-09 23:33//)
公开
@无名啊
https://trac.ffmpeg.org/wiki/Encode/HighQualityAudio#Encoders
https://opus-codec.org/comparison/
无名啊 1楼回复 无名啊用什么格式保存音乐好呢?有啥办法比较音质吗? (06-09 23:26//)
公开

@tasy5kg,你还记得,当时你是在哪儿看到,各种音频格式质量对比,

才有了《2024年,将相册里的视频压缩为AV1编码》里的结论吗?

有给出各码率质量分数曲线图📈之类的吗?

音频使用libopus编码器,这是普遍认为音质最佳的有损编码器,并且受大部分设备和软件支持。

流光 12楼回复 yingshaoxo浅谈如何绕过glibc的版本不兼容限制,制造c版本的"python" (06-09 23:01//)

这个问题我还真不知道,帮你问问Gemini 2.5 pro

好的,这是一个非常经典且常见的Linux系统运维和开发问题。当你在一个低版本的Linux系统上运行一个在高版本系统上编译的程序时,经常会遇到 GLIBC_2.XX not found 的错误。

这是因为程序在编译时,动态链接到了新版本的Glibc(GNU C Library)。Glibc为了向后兼容,使用了符号版本(Symbol Versioning)机制。你的程序需要一个新版本Glibc才提供的函数符号,而系统里的旧Glibc没有,所以无法运行。

在开始之前,必须强调:

警告:直接替换或升级系统底层的Glibc是一个极其危险的操作,99%的情况下会导致系统崩溃且无法启动。除非你完全明白你在做什么,否则绝对不要尝试全局替换 libc.so.6

下面我将从最推荐到最不推荐的顺序列出几种绕过或解决Glibc版本不兼容问题的方法。


方法一:最安全、最推荐的方法

1. 升级你的操作系统

这是最根本、最稳定、最安全的解决方案。如果条件允许,将你的操作系统(例如 CentOS 6/7 升级到 CentOS 8/Stream 或更高版本,Ubuntu 16.04 升级到 20.04/22.04)升级到一个支持所需Glibc版本的发行版。

  • 优点:一劳永逸,系统环境统一,安全补丁和功能都是最新的。
  • 缺点:在生产环境中可能难以实施,需要停机和大量测试。

2. 使用容器技术(Docker, Podman)

这是现代化的标准解决方案,也是我个人最推荐的“绕过”方法。它将应用及其所有依赖(包括需要的Glibc)打包到一个隔离的环境中运行,不影响宿主机系统。

  • 操作步骤

    1. 在你的旧系统上安装Docker或Podman。
    2. 创建一个 Dockerfile,选择一个包含新版Glibc的基础镜像(如 ubuntu:22.04debian:bullseye)。
    3. Dockerfile 中,将你的应用程序复制到镜像里。
    4. 构建并运行这个容器。
  • 示例 Dockerfile

    # 使用一个包含新版 Glibc 的基础镜像
    FROM ubuntu:22.04
    
    # 将你的二进制文件复制到容器中
    COPY ./your_program /usr/local/bin/your_program
    
    # 赋予执行权限
    RUN chmod +x /usr/local/bin/your_program
    
    # 设置容器启动时执行的命令
    CMD ["your_program"]
    
  • 优点

    • 完美隔离:完全不影响宿主机系统,零风险。
    • 环境一致性:确保开发、测试和生产环境完全一致。
    • 易于分发:打包成镜像后可以轻松部署到任何支持容器的机器上。
  • 缺点

    • 需要学习容器的基本知识。
    • 有一定的性能开销(尽管通常很小)。

3. 在目标机器上重新编译

如果你有应用程序的源代码,这是最直接的解决方法。

  • 操作步骤

    1. 在你的旧版本Linux系统上安装好编译工具链(gcc, g++, make 等)。
    2. 将源代码复制到这台机器上。
    3. 执行编译流程(./configure && make && make install)。
  • 优点:编译出的二进制文件会链接到系统自带的旧版Glibc,完美兼容。

  • 缺点

    • 必须拥有源代码。
    • 目标机器上可能缺少各种开发依赖库,安装它们可能很麻烦。

方法二:高级“Hacker”方法(有风险,但可行)

当你无法升级系统、无法使用容器、也没有源代码时,可以尝试以下方法。这些方法的核心思想是:不替换系统Glibc,而是让你的程序使用一个你单独提供的、新版本的Glibc。

4. 使用 patchelf 工具修改程序的动态链接器和Rpath

这是最常见的“黑科技”手段。patchelf 是一个可以修改ELF可执行文件动态链接信息的小工具。

核心原理:

  1. 修改解释器(Interpreter):告诉操作系统,运行这个程序时,不要使用系统的加载器(如 /lib64/ld-linux-x86-64.so.2),而是使用我们指定的新版加载器。
  2. 修改运行时搜索路径(Rpath):告诉程序,运行时去我们指定的目录里寻找 .so 动态库文件,而不是只在系统默认路径(如 /lib64, /usr/lib64)里找。

操作步骤:

  1. 准备新版Glibc文件

    • 从一个新版系统(或相应的 rpm/deb 包)中提取出Glibc相关文件。你需要 libc.so.6, ld-linux-x86-64.so.2 以及其他可能依赖的库(如 libpthread.so.0, libdl.so.2 等)。

    • 例如,在Debian/Ubuntu系统上,你可以下载libc6包并解压:

      # 找一个新版的 libc6 deb 包,比如从 packages.debian.org
      apt-get download libc6
      dpkg -x libc6_*.deb ./new_glibc_files
      
    • 将解压出来的 libetc 目录放到一个地方,例如 /opt/myapp/glibc/

    • 最终你的目录结构可能像这样:

      /opt/myapp/
      ├── your_program
      └── glibc/
          └── lib/
              └── x86_64-linux-gnu/
                  ├── ld-2.31.so  # 这是 ld-linux-x86-64.so.2 的实际文件
                  ├── libc-2.31.so # 这是 libc.so.6 的实际文件
                  ├── libc.so.6 -> libc-2.31.so (符号链接)
                  └── ... (其他 so 文件)
      
    • 找到新版加载器的确切路径,例如是 /opt/myapp/glibc/lib/x86_64-linux-gnu/ld-2.31.so

    • 找到新版库文件的目录,例如是 /opt/myapp/glibc/lib/x86_64-linux-gnu

  2. 安装 patchelf

    # บน CentOS/RHEL
    sudo yum install patchelf
    # บน Debian/Ubuntu
    sudo apt-get install patchelf
    
  3. 修改你的程序

    # 1. 修改 Interpreter
    patchelf --set-interpreter /opt/myapp/glibc/lib/x86_64-linux-gnu/ld-2.31.so your_program
    
    # 2. 修改 Rpath
    patchelf --set-rpath /opt/myapp/glibc/lib/x86_64-linux-gnu your_program
    

    注意ld-2.31.so 和路径要换成你自己的实际路径。

  4. 运行测试
    现在,直接运行 ./your_program,它应该就会使用你指定的Glibc版本了。

  • 优点:精确控制,只影响目标程序,不影响系统。
  • 缺点
    • 操作复杂,容易出错。
    • 你需要手动管理所有相关的Glibc库文件,如果依赖链很长,可能会很麻烦。
    • Glibc的一些功能(如NSS)可能因为环境变化而出现意想不到的问题。

5. 使用 chrootproot

chroot 是一个传统的工具,可以创建一个隔离的文件系统根目录。你可以在这个“伪根”里安装一套新版Linux系统的基本文件(包括Glibc),然后在其中运行你的程序。

  • 优点:比 patchelf 隔离性更好。
  • 缺点:设置比 patchelf 更复杂,通常需要root权限。proot 是一个用户态的 chroot 实现,不需要root,但性能更低。

方法三:不推荐,但理论上可行

6. 编译时静态链接

如果在编译时,你就预见到了这个问题,可以尝试将程序静态链接。

gcc -static my_program.c -o my_program
  • 优点:生成一个不依赖外部动态库的独立可执行文件,可移植性极高。
  • 缺点
    • Glibc官方不推荐:完全静态链接Glibc可能会导致DNS解析、用户/组查询等NSS(Name Service Switch)功能失效或行为异常。
    • 文件巨大:所有库都被打包进了可执行文件。
    • 安全更新困难:库有安全漏洞时,必须重新编译整个程序。

总结与决策树

方法 难度 风险 推荐度 适用场景
升级操作系统 ★★★★★ 条件允许的任何情况,尤其是生产环境。
使用容器 (Docker) 极低 ★★★★★ 现代应用部署的标准实践,强烈推荐。
在目标机重新编译 ★★★★☆ 有源代码,且目标机可以安装编译环境。
使用 patchelf ★★★☆☆ 没有源码、不能用容器时的“最后一招”。
使用 chroot ★★☆☆☆ 需要比patchelf更强隔离性,且不介意复杂度的场景。
静态链接 低(编译时) ★☆☆☆☆ 仅适用于非常简单、不涉及网络或用户查询的小工具。

决策建议

  1. 首选方案:优先考虑 使用Docker容器。这是解决此类依赖问题的最佳实践。
  2. 次选方案:如果不能用容器,但有源代码,选择 在目标机重新编译
  3. 最后手段:如果以上都不行,再谨慎尝试 patchelf。动手前一定要备份好你的程序,并在测试环境中充分验证。

避免直接操作系统的 /lib/lib64 目录,这是通往系统崩溃的捷径。

下一页 上一页 (61 / 20040页)

9月20日 21:55 星期六

本站由hu60wap6驱动

备案号: 京ICP备18041936号-1