2017-01-14 36 views
0

所以我下面這個教程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 to logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to logop' /home/.../masstree-beta-master/mtd.cc:732: undefined reference to logop' /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生成可執行文件?

非常感謝!

+0

可能的想法: 1)將rtlib.o放在目標文件的末尾進行鏈接。 2)用C++編譯器構建rtlib.o。 3)檢查rtlib.o要導出的函數(objdump的-t)。 4)檢查mtd.o中的符號是否與rtlib.o中的導出符號匹配。 – Brian

+0

謝謝您的回覆!我使用objdump -S檢查了mtd.o,並找不到對我的外部函數logop(int,int,char)的調用。這混淆了我,因爲我以爲錯誤'未定義參考logop」'意味着一個函數調用插入,但鏈接器無法找到函數logop的定義,而且線730和732等的襯砌,我希望logop是插入。 –

+0

@布萊恩,我最後一次評論後有什麼想法? –

回答

1

導出的符號是不一樣的。我檢查使用nm --format sysv *file.o*,以確保從rtlib.o導出的符號,無論他們使用的是相同的。

相關問題