0

I'm trying out halide and want to build a small shared library on top of it. But the code generated by Halide's AOT compilation seems not being position independent. How do I link the objects generated by Halide into my shared library?

[Update] extracted a small example from my code.

Specifically I used a generator with 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)

with helpers from 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)

and got the following error:

/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

I also tried generating object by running the generator myself (without CMake wrapper) with -e o,h, and similarly with llvm bitcode followed by llc -relocation-model=pic, also Func::compile_to_object. similar error occurred when I try to link the generated object back to shared library:

/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

I'm running this on Ubuntu 18.10. Both Halide and my code are compiled with gcc-8.2.0. LLVM/Clang-7 is the one shipped in their repository. Halide is built with simple cmake ../ && make && make install.
For compiler flags of my testing code, command used in CMake is add_libarary(mylib SHARED ...). Non-CMake build is with flags like -fPIC -shared, nothing special since I'm still learning.

jiamingy
  • 56
  • 6

1 Answers1

1

Halide should be generating PIC by default (see Codegen_Internal.cpp, make_target_machine()). What architecture are you targeting? What compiler/linker are you using, with what options, etc?

Steven Johnson
  • 266
  • 1
  • 4
  • I added a small example extracted from my code. Also tried a similar standalone test with both using generator and using `Func::compile_to_object`. The error is occurs in all my tests. I'm running this on x86_64 AMD CPU. – jiamingy Mar 19 '19 at 20:43