2017-01-14 7 views
0

이 튜토리얼 https://www.cs.cornell.edu/~asampson/blog/llvm.html에 따라 외부 함수 (rtlib.c의 logop)에 대한 호출을 추가하여 프로그램을 계측하는 패스를 작성합니다. 하지만 튜토리얼과는 달리 나는 더 큰 코드베이스 인 masstree를 장비하려고합니다 : https://github.com/kohler/masstree-beta.Clang 링크 오류 : LLVM이 추가 한 함수 호출에 대한 정의되지 않은 참조

masstree의 지시에 따라 먼저 ./configure를 실행하지만 생성 된 Makefile을 편집하여 clang (gcc/g ++ 대신)을 사용하고 내 패스를 실행합니다. masstree 소스 파일에 rtlib.c를 추가하여 나머지 masstree 소스 파일과 함께 rtlib.o로 변환되도록합니다. 내가 CC2와 CXX2를 사용

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) 

: 여기 내 변경 수정 된 메이크의 관련 부분은 화살표로 강조이다 (나는 또한 $ (rtlib) 실행 파일을 생성하기 위해 다른 .o 인 파일을 연결하는 추가) 계측 된 .o 파일을 생성하고 CC 및 CXX를 사용하여 실행 파일에 연결합니다.

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.

(rtlib.c에) 내 기능 logop에 대한 참조 이유에 대한 모든 아이디어는 내가에 연결하는 부분에 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에 대한 정의되지 않은 참조 '라는 오류가 함수 호출이 삽입되었지만 링커가 function logop의 정의를 찾을 수 없다는 것을 의미하는 것으로 생각하기 때문에 혼란 스럽습니다. 또한 logop이 예상되는 줄 730과 732 등이 줄 지어 있습니다. 삽입. –

+0

@Brian, 내 마지막 코멘트 후 어떤 생각? –

답변

1

내 보낸 기호가 같지 않았습니다. nm --format sysv *file.o*을 사용하여 rtlib.o에서 내보내는 심볼과 사용 된 심볼이 같은지 확인했습니다.