我正在尝试halide,并希望在其之上构建一个小型共享库。但是Halide的AOT编译生成的代码似乎与位置无关。如何将Halide生成的对象链接到共享库中?
[更新]从我的代码中提取了一个小例子。
具体地说,我在c ++中使用了生成器:
class SimpleAddition : public Halide::Generator<SimpleAddition> {
public:
SimpleAddition() : vars(4) {}
Input<Halide::Buffer<>> lhs{"lhs"};
Input<Halide::Buffer<>> rhs{"rhs"};
Output<Halide::Buffer<>> out{"out"};
std::vector<Var> vars;
void generate() {
out(vars) = lhs(vars) + rhs(vars);
}
};
HALIDE_REGISTER_GENERATOR(SimpleAddition, simple_addition)
在CMake的帮助下:
halide_library(ops SRCS ${CMAKE_CURRENT_LIST_DIR}/src/simple_addition.cc
GENERATOR_NAME simple_addition
GENERATOR_ARGS lhs.type=float32 lhs.dim=4 rhs.type=float32 rhs.dim=4 out.type=float32)
,并出现以下错误:
/usr/bin/ld: ./genfiles/halide_rt_host/halide_rt_host.a(halide_rt_host.a.o): relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
我还尝试通过使用-e o,h
自己运行生成器(没有CMake包装器)来生成对象,类似地,使用llvm位代码后跟llc -relocation-model=pic
,也运行Func::compile_to_object
。当我尝试将生成的对象链接回共享库时,发生了类似的错误:
/usr/bin/ld: halide_runtime_x86.o: relocation R_X86_64_PC32 against symbol `_ZN6Halide7Runtime8Internal13custom_mallocE' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
我正在Ubuntu 18.10上运行它。 Halide和我的代码都是使用gcc-8.2.0编译的。 LLVM / Clang-7是其存储库中随附的一种。卤化物是用简单的cmake ../ && make && make install
构建的。
对于我的测试代码的编译器标志,在CMake中使用的命令是add_libarary(mylib SHARED ...)
。非CMake构建带有-fPIC -shared
之类的标志,因为我还在学习中,所以没什么特别的。
答案 0 :(得分:0)
默认情况下,卤化物应生成PIC(请参见Codegen_Internal.cpp,make_target_machine())。您的目标是什么架构?您正在使用什么编译器/链接器,以及哪些选项等?