我有一个LLVM传递,应该执行一些转换。其中,它应将函数调用插入文件foo.c
中定义的函数中。
我的想法是使用LLVM通过重新编译coreutils
,以便我可以测试生成的二进制文件。
coreutils
的构建过程非常简单。应该克隆存储库,然后执行以下操作:
$ ./bootstrap
$ ./configure
$ make
简单的交换编译器似乎可以正常工作:
$ export CC=clang
$ ./configure
$ make
但是(据我所知)要加载我的通行证,我必须像这样调用clang(前提是我按照here所述设置了自动通行证调用):
clang -Xclang -load -Xclang path/to/Pass.so file_to_compile.c
如果我尝试将CC
设置为上述形式:
$ export CC="clang -Xclang -load -Xclang path/to/Pass.so foo.c"
我在./configure
上遇到了错误:
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /usr/bin/mkdir -p
checking for gawk... gawk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether make supports nested variables... (cached) yes
checking whether make supports the include directive... yes (GNU style)
checking for gcc... clang -Xclang -load -Xclang myPass.so foo.c
checking whether the C compiler works... no
configure: error: in `~/coreutils':
configure: error: C compiler cannot create executables
See `config.log' for more details
config.log
是:
configure:5245: clang -Xclang -load -Xclang myPass.so foo.c -V >&5
clang-7: error: argument to '-V' is missing (expected 1 value)
clang-7: error: no such file or directory: 'foo.c'
clang-7: error: no input files
configure:5256: $? = 1
configure:5245: clang -Xclang -load -Xclang myPass.so foo.c -qversion >&5
clang-7: error: unknown argument '-qversion', did you mean '--version'?
clang-7: error: no such file or directory: 'foo.c'
clang-7: error: no input files
configure:5256: $? = 1
configure:5245: clang -Xclang -load -Xclang myPass.so foo.c -version >&5
clang-7: error: unknown argument '-version', did you mean '--version'?
clang-7: error: no such file or directory: 'foo.c'
clang-7: error: no input files
configure:5256: $? = 1
configure:5276: checking whether the C compiler works
configure:5298: clang -Xclang -load -Xclang myPass.so foo.c conftest.c >&5
clang-7: error: no such file or directory: 'foo.c'
总而言之,我的基本思想是使用Clang和我的自定义遍历重新编译coreutils
,该遍历将对外部函数的调用注入。