所以我下面这个教程https://www.cs.cornell.edu/~asampson/blog/llvm.html使一通通过添加调用外部函数(其是在rtlib.c logop)仪器的程序。但是,与教程不同的是,我试图使用masstree更大的代码库:https://github.com/kohler/masstree-beta。锵链接错误:未定义参考起作用由LLVM加入调用传递
因此,根据masstree的指示,我先运行./configure,然后编辑生成的Makefile以使用clang(而不是gcc/g ++)并运行我的pass。我还在masstree源文件中添加rtlib.c,以便将其与其他masstree源文件一起转换为rtlib.o。下面是我的变化修改Makefile文件的相关部分突出显示的箭头(我还添加了$(rtlib)将其与其他.o文件链接到可执行文件生成):
AR = ar
rtlib = rtlib.o <===
CC2 = clang -w -v -Xclang -load -Xclang /.../llvm-3.4/Release+Asserts/lib/SkeletonPass.so `llvm-config --cflags`
CXX2 = clang++ -v -w -Xclang -load -Xclang /.../llvm-3.4/Release+Asserts/lib/SkeletonPass.so -std=c++11 `llvm-config --cppflags --libs --cflags --cxxflags core --ldflags` <===
CC = clang -v <===
CXX = clang++ -v -std=c++11 <===
CPPFLAGS =
CXXFLAGS = -g -W -Wall -O3
DEPSDIR := .deps
DEPCFLAGS = -MD -MF $(DEPSDIR)/$*.d -MP
ifeq ($(strip $(MEMMGR)),)
MEMMGR =
endif
ifneq ($(strip $(KEYSWAP)),)
CPPFLAGS += -DKEYSWAP
endif
ifneq ($(strip $(NOPREFETCH)),)
CPPFLAGS += -DNOPREFETCH
endif
ifneq ($(strip $(NOSUPERPAGE)),)
CPPFLAGS += -DNOSUPERPAGE
endif
LIBS = -lpthread -lm
LDFLAGS =
all: test_atomics mtd mtclient mttest
%.o: %.c config.h $(DEPSDIR)/stamp
$(CXX2) $(CPPFLAGS) $(CXXFLAGS) $(DEPCFLAGS) -include config.h -c -o [email protected] $<
%.o: %.cc config.h $(DEPSDIR)/stamp
$(CXX2) $(CPPFLAGS) $(CXXFLAGS) $(DEPCFLAGS) -include config.h -c -o [email protected] $<
%.S: %.o
objdump -S $< > [email protected]
libjson.a: json.o string.o straccum.o str.o msgpack.o \
clp.o kvrandom.o compiler.o memdebug.o kvthread.o
@/bin/rm -f [email protected]
$(AR) cru [email protected] $^
KVTREES = query_masstree.o \
value_string.o value_array.o value_versioned_array.o \
string_slice.o
mtd: mtd.o log.o checkpoint.o file.o misc.o $(rtlib) $(KVTREES) \
kvio.o libjson.a
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
mtclient: mtclient.o misc.o testrunner.o kvio.o $(rtlib) libjson.a
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(LDFLAGS) $(LIBS)
mttest: mttest.o misc.o checkpoint.o $(rtlib) $(KVTREES) testrunner.o \
kvio.o libjson.a
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
test_string: test_string.o string.o $(rtlib) straccum.o compiler.o
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
test_atomics: test_atomics.o string.o straccum.o kvrandom.o $(rtlib) \
json.o compiler.o kvio.o
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
jsontest: jsontest.o string.o straccum.o json.o compiler.o $(rtlib)
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
msgpacktest: msgpacktest.o string.o straccum.o json.o compiler.o msgpack.o $(rtlib)
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
scantest: scantest.o compiler.o misc.o $(rtlib) $(KVTREES) libjson.a
$(CXX) $(CXXFLAGS) -o [email protected] $^ $(MEMMGR) $(LDFLAGS) $(LIBS)
我使用CC2和CXX2在CC和CXX上生成工具化的.o文件,将它们链接成可执行文件。这里是我的错误,当我运行make:
mtd.o: In function
main': /home/.../masstree-beta-master/mtd.cc:730: undefined reference to
logop' /home/.../masstree-beta-master/mtd.cc:730: undefined reference tologop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to
logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference tologop' /home/.../masstree-beta-master/mtd.cc:736: undefined reference to
logop' mtd.o:/home/.../masstree-beta-master/mtd.cc:736: more undefined references to `logop' follow clang: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [mtd] Error 1.
为什么是引用我的功能logop(这是在rtlib.c)任何想法不确定的,即使我在连接部分添加到rtlib.o生成可执行文件?
非常感谢!
可能的想法: 1)将rtlib.o放在目标文件的末尾进行链接。 2)用C++编译器构建rtlib.o。 3)检查rtlib.o要导出的函数(objdump的-t)。 4)检查mtd.o中的符号是否与rtlib.o中的导出符号匹配。 – Brian
谢谢您的回复!我使用objdump -S检查了mtd.o,并找不到对我的外部函数logop(int,int,char)的调用。这混淆了我,因为我以为错误'未定义参考logop”'意味着一个函数调用插入,但链接器无法找到函数logop的定义,而且线730和732等的衬砌,我希望logop是插入。 –
@布莱恩,我最后一次评论后有什么想法? –