0

我正在为一个名为 AMX Mod X 的开源项目做出贡献。它使用非常简单的定制构建系统(称为 AMBuild)。项目是在 Linux 上使用 Clang 构建的。

我试图通过传递编译时和链接时参数来为其启用 LTO。

作为我添加的链接时间参数

-O2 -flto=thin -fuse-ld=lld -Wl,-z,notext

并作为编译时参数。

-O2 -flto=thin -fPIC

经过仔细的谷歌搜索,我选择了这个配置。看来我非常接近实现完整的 LTO。只有一个模块无法构建,它与 pcre 链接。

生成的(由构建系统)链接命令是这样的。

clang-4.0 _public_sdk_amxxmodule.o module.o CRegEx.o utils.o -m32 -O2 -flto=thin -fuse-ld=lld -Wl,-z,notext -ldl -lm -lgcc_eh ../../../support/versionlib/version/libversion.a /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a -shared -o regex_amxx_i386.so

链接错误很多,但它们非常相似。这是其中之一。

/usr/lib/llvm-4.0/bin/ld.lld: error: pcre_compile.c:(function add_to_class): can't create dynamic relocation R_386_32 against symbol '_pcre_ucd_stage1' defined in /home/travis/build/alliedmodders/amxmodx/modules/regex/lib_linux/libpcre.a(libpcre_la-pcre_ucd.o)

读到LLD 和 bfd 有不同的默认值并且-Wl,-z,notext应该可以工作,但它没有任何效果。

libpcre.a只是与存储库捆绑在一起的二进制文件。AMBuild 不是从源头构建 pcre。这是我的PR,你可以找到失败的 travis 构建并更仔细地阅读日志。不要害怕自定义构建系统,所有执行的命令都会以最详细的形式打印到终端。应该没问题。

链接 pcre 时如何启用 LTO?我并不真正关心其他编译器(gcc、icc 等)或其他操作系统。

UPD : LTO代表L墨水时间优化_ _

4

0 回答 0