如何执行使用链接到外部库的LLVM更改的代码

时间:2019-05-18 12:38:13

标签: c++ linux gcc llvm llvm-ir

  1. 我有一个名为server.cpp的文件,可以使用以下文件运行:
 g++ -o server server.cpp -lrpc -ldl -lpthread
  1. 使用WriteBitcodeToFile函数将文件转换为LLVM IR,对其进行修改并保存到文件中。结果文件的名称为“输出”。

  2. 使用llc命令生成“ output.o”文件,如下所示:

 llc -filetype=obj output
  1. 使用gcc命令以以下方式创建可执行文件:
gcc -lrpc -ldl -lpthread output.o

运行gcc命令给我错误:

/usr/bin/ld: output.o: relocation R_X86_64_32 against `.rodata.str1.1' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld: final link failed: nonrepresentable section on output
collect2: error: ld returned 1 exit status
  1. 通过向llc命令提供“ --relocation-model = pic”标志进行了尝试。但是,如果在那之后运行gcc命令,我会得到很多“未定义的引用”错误,例如:
/usr/bin/ld: output.o: in function `main':
llvm-link:(.text+0x41): undefined reference to `rpc::server::server(unsigned short)'
/usr/bin/ld: llvm-link:(.text+0x4d): undefined reference to `std::allocator<char>::allocator()'
/usr/bin/ld: llvm-link:(.text+0x60): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)'
/usr/bin/ld: llvm-link:(.text+0x81): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'
/usr/bin/ld: llvm-link:(.text+0x8a): undefined reference to `std::allocator<char>::~allocator()'
/usr/bin/ld: llvm-link:(.text+0x93): undefined reference to `rpc::server::run()'
/usr/bin/ld: llvm-link:(.text+0xa5): undefined reference to `rpc::server::~server()'
/usr/bin/ld: llvm-link:(.text+0xc8): undefined reference to `std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()'

如果我没有任何外部库,则可以使用上述步骤轻松地在修改后运行一个简单程序。

0 个答案:

没有答案