Libtool/clang:让我将参数传递给编译器而不是链接器

Libtool/clang: let me pass arguments to compiler but not linker

我用 o-llvm 混淆了许多 GitHub 个项目。它是一个用 clang 实现的编译时链接器。使用 o-llvm,我正在尝试 compile/obfuscate 一个使用 libtool 的 GitHub 项目,但是指定混淆转换所需的标志弄乱了链接器。

我传递的额外标志如下:

/path/to/obfuscator/clang -O0 -mllvm -bcf -mllvm -boguscf-loop=1 -mllvm -ann

-bcf表示应用伪造的控制流转换,-boguscf-loop限制每个基本块运行的次数,-ann表示用printf语句注释基本块。

起初,我尝试在配置后的 make 步骤中这样做:

make CC=/path/to/obfuscator/clang CFLAGS="-O0 -mllvm -bcf -mllvm -boguscf-loop=1 -mllvm -ann

但是 gcc 是链接器,它失败了,因为它不知道“-mllvm”选项。 Libtool 还自动删除了“-bcf”、“-boguscf-loop=1”和“-ann”选项

在另一个项目中,返回配置并在 CC 中指定 CFLAGS 有效:

./configure CC="/path/to/obfuscator/clang -O0 -mllvm -bcf -mllvm -boguscf-loop=1 -mllvm -ann"

这使得 "linker" 成为 clang,它识别“-mllvm”选项,但是 libtool 删除相应的标志仍然会扰乱调用:

[...] -O0 -mllvm -mllvm -mllvm -Wl,-z -Wl,defs   -Wl,-soname [...]
clang: warning: argument unused during compilation: '-mllvm -bcf'
clang: warning: argument unused during compilation: '-mllvm -boguscf-loop=1'
clang: warning: argument unused during compilation: '-mllvm -ann'
clang: warning: argument unused during compilation: '-mllvm -mllvm'
clang: warning: argument unused during compilation: '-mllvm -Wl,-z'
/usr/bin/ld: error: cannot open defs: No such file or directory

我尝试在我的编译器专用参数前添加 -Wc,flag 或 -Xcompile 但 clang 无法识别这些参数。

是否有其他方法告诉 Libtool 或 Clang 仅使用混淆参数进行编译而不是链接?

谢谢。

我试图避免这种情况,但我最终修改了 libtool 脚本以在链接期间像其他混淆选项一样删除 -mllvm。

sed -i "s/-m\*|/-mtune=*|-march=*|-mcpu=*|-mfpmath=*|-masm=*|-mieee-fp|-mno-ieee-fp|-msoft-float|-mno-fp-ret-in-387|-mno-fancy-math-387|-malign-double|-mno-align-double|-m96bit-long-double|-m128bit-long-double|-mlarge-data-threshold=*|-mrtd|-mregparm=*|-msseregparm|-mpc32|-mpc64|-mpc80|-mstackrealign|-mpreferred-stack-boundary=*|-mincoming-stack-boundary=*|-mmmx|-mno-mmx|-msse|-mno-sse|-msse2|-mno-sse2|-msse3|-mno-sse3|-mssse3|-mno-ssse3|-msse4.1|-mno-sse4.1|-msse4.2|-mno-sse4.2|-msse4|-mno-sse4|-mavx|-mno-avx|-maes|-mno-aes|-mpclmul|-mno-pclmul|-msse4a|-mno-sse4a|-mfma4|-mno-fma4|-mxop|-mno-xop|-mlwp|-mno-lwp|-m3dnow|-mno-3dnow|-mpopcnt|-mno-popcnt|-mabm|-mno-abm|-mfused-madd|-mno-fused-madd|-mcld|-mcx16|-msahf|-mmovbe|-mcrc32|-mrecip|-mveclibabi=*|-mabi=*|-mpush-args|-mno-push-args|-maccumulate-outgoing-args|-mthreads|-mno-align-stringops|-minline-all-stringops|-minline-stringops-dynamically|-mstringop-strategy=*|-momit-leaf-frame-pointer|-mtls-direct-seg-refs|-mno-tls-direct-seg-refs|-msse2avx|-mno-sse2avx|-m32|-m64|-mno-red-zone|-mcmodel=*|-mcmodel=*|-mcmodel=*|-mcmodel=*|/g" libtool

基本上,用 gcc 手册中的每个可能的值扩展 -m*,减去 -mllvm,这完全是一个 clang 的东西。现在我可以自动编译vlc with arbitrary invocations using different compilers as part of the Chimera语料库了