LLVM 传递链接问题:未定义的符号

LLVM Pass Linking problem: undefined symbol

本文关键字:未定义 符号 问题 链接 LLVM      更新时间:2023-10-16

我正在尝试在LLVM中编写自己的pass,但是在使用自己的库时遇到问题。

以下是我编译通行证的方法:

[shinjitumala@FPRAlienware17M FPR]$ make
[ 000% ] compiling object file obj/fpr/llvm/debug.o...
../../../tools/llvm-project/llvm/build-8.0.1/bin/clang++ -fPIC -Wall -g3 -fno-rtti -MD -o obj/fpr/llvm/debug.o -c src/fpr/llvm/debug.cpp -I../../../tools/llvm-project/llvm/build-8.0.1/../include -I../../../tools/llvm-project/llvm/build-8.0.1/include -Iinclude
[ 025% ] Done!
[ 025% ] compiling object file obj/fpr/out.o...
../../../tools/llvm-project/llvm/build-8.0.1/bin/clang++ -fPIC -Wall -g3 -fno-rtti -MD -o obj/fpr/out.o -c src/fpr/out.cpp -I../../../tools/llvm-project/llvm/build-8.0.1/../include -I../../../tools/llvm-project/llvm/build-8.0.1/include -Iinclude
[ 050% ] Done!
[ 050% ] compiling object file obj/module_pass.o...
../../../tools/llvm-project/llvm/build-8.0.1/bin/clang++ -fPIC -Wall -g3 -fno-rtti -MD -o obj/module_pass.o -c src/module_pass.cpp -I../../../tools/llvm-project/llvm/build-8.0.1/../include -I../../../tools/llvm-project/llvm/build-8.0.1/include -Iinclude
src/module_pass.cpp:24:16: warning: unused variable 'i' [-Wunused-variable]
for (auto& i : bb) {
^
src/module_pass.cpp:21:22: warning: unused variable 'context' [-Wunused-variable]
llvm::LLVMContext& context = m.getContext();
^
2 warnings generated.
[ 075% ] Done!
[ 075% ] linking binary bin/libFPRPass.so...
../../../tools/llvm-project/llvm/build-8.0.1/bin/clang++ -fPIC -shared -o bin/libFPRPass.so -L../../../tools/llvm-project/llvm/build-8.0.1/lib  obj/fpr/llvm/debug.o  obj/fpr/out.o  obj/module_pass.o
[ 100% ] Done!
[ 100% ] All Done!

但这是我运行通行证时得到的:

[shinjitumala@FPRAlienware17M FPR]$ ../../../tools/llvm-project/llvm/build-8.0.1/bin/opt -load bin/libFPRPass.so -test < main.ll > obj/main_new.ll
../../../tools/llvm-project/llvm/build-8.0.1/bin/opt: symbol lookup error: bin/libFPRPass.so: undefined symbol: _ZN3fpr3outlsIA54_cEERS0_RKT_

当我只是在某些测试程序中使用我的库时,不会发生这种情况。仅当我在 LLVM 通行证中使用它们时,才会发生这种情况。

这是通行证本身的代码:

#include <fpr/out.h>
#include <fpr/llvm/debug.h>
#include <llvm/IR/Module.h>
#include <llvm/Support/CommandLine.h>
static llvm::cl::opt<int> slice_start_line("l");
namespace fpr {
struct ModulePass : public llvm::ModulePass
{
public:
static char ID;
ModulePass()
: llvm::ModulePass(ID)
{}
bool runOnModule(llvm::Module& m) override
{
llvm::LLVMContext& context = m.getContext();
for (auto& f : m) {
for (auto& bb : f) {
for (auto& i : bb) {
fpr::out(2) << "testn";
}
}
}
return true;
}
};
}
/**
* パスの登録
*/
char fpr::ModulePass::ID = 0;
static llvm::RegisterPass<fpr::ModulePass> module_pass("test", "discription placeholder");

我试图在链接程序时添加/删除-shared标志以及将其与--no-undefined链接,但到目前为止都没有工作。

我也无法从旧答案中找到我正在寻找的确切内容,所以我在这里。

任何帮助将不胜感激。

好的。在问了比我聪明的人之后。这是因为我在out.cpp而不是out.h中实现了operator<<。这真的很傻...它与LLVM无关。