GCC竟把路径拆成碎片?
Paths in Pieces
许多 Linux 发行版和包管理器会审计二进制文件中的绝对路径,以防构建机器的路径泄露到用户端。通常大家会用 grep 或 strings 工具来检测,但如果你用 GCC 编译 x86-64 程序,这些工具可能会失效。GCC 为了优化性能,会将长字符串常量拆分成多个 16 字节的片段存入寄存器,导致原本完整的路径在二进制文件中“消失”或变成乱码。这种优化虽然可能带来微小的性能提升,却让二进制文件的可读性大打折扣,也让 Conda 和 Spack 等依赖路径替换的工具难以正常工作。文章建议,尽管有性能考量,保留字符串常量的完整性对于二进制分析和调试至关重要。
运行 strings 命令查看二进制文件是如此简单便捷,这种获取不透明二进制 blob 内部洞察的方式,其价值远超拆分和去重带来的微小节省。