【问题标题】:Libtool/clang: let me pass arguments to compiler but not linkerLibtool/clang:让我将参数传递给编译器而不是链接器
【发布时间】:2017-02-01 00:25:34
【问题描述】:

我用o-llvm 混淆了许多 GitHub 项目。这是一个用 clang 实现的编译时链接器。使用 o-llvm,我正在尝试编译/混淆一个使用 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"

这使得“链接器”成为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 只使用混淆参数进行编译而不是链接?

谢谢。

【问题讨论】:

    标签: c linker clang libtool


    【解决方案1】:

    我试图避免这种情况,但我最终修改了 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
    

    基本上,将 -m* 扩展为 gcc 手册中的所有可能值,减去 -mllvm 这完全是个问题。现在我可以使用不同的编译器作为Chimera语料库的一部分,通过任意调用自动编译vlc

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 2022-01-13
      • 2011-05-07
      • 2019-08-08
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多