C++ API를 통해 llvm에 중첩 함수를 구현하려고합니다. (컴파일 될 프로그램이 올바른 중첩 참조 등을 갖도록 보장하기 위해) 의미 론적 검사를 수행 한 후에 llvm에서 동일한 범위의 모든 함수를 정의하고 모든 변수를 전역 변수로 설정합니다. 나는이 일을 예상하고 있었다 그러나 나는 명령으로 .o 인 파일에서 실행 파일을 가져 오는 동안 자신이 큰 문제가 발견 : 내가 얻을 글로벌 변수 중 하나 llvm::GlobalValue::WeakAnyLinkage
또는 llvm::GlobalValue::ExternalLinkage
연결을 사용하여전역 변수가있는 llvm 바이트 코드에서 오브젝트 파일을 컴파일 할 때 Clang-3.8 정의되지 않은 'main'참조
"llvm-as-3.8 output.ll| llc-3.8 -filetype=obj | clang-3.8 ../library/library.a -v -o out"
:
주요의 정의, 내 IR 코드의 정의와 함께 할 것 같다/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 12
...
/usr/bin/ld: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_line): relocation 0 has invalid symbol index 2
/usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
는 약자
; Function Attrs: nounwind uwtable define void @main() #0 {
문제는 전역 변수를 사용하지 않았을 때 같은 명령이 문제가되지 않는다는 것입니다. 물론 전역 변수를 alloca로 변경하려고했던 이유로 하위 함수에서 변수가 사용 된 경우는 예외입니다.
이 문제에 대한 해결책을 찾으십시오. 미리 감사드립니다. 주 : 내가 사용하는 LLVM-3.8
업데이트 : 결과가 있던 그 소리 명령에서 -v 제거 :이 모든 변수를 LLVM IR에서 내 프로그램의 시작 부분에 정의 된
refined_output.o: In function
bsort': refined_output.ll:(.text+0x4): undefined reference to
x' refined_output.ll:(.text+0xa): undefined reference ton' refined_output.ll:(.text+0x10): undefined reference to
changed' refined_output.ll:(.text+0x22): undefined reference toi' refined_output.ll:(.text+0x2c): undefined reference to
changed' refined_output.ll:(.text+0x42): undefined reference toi' refined_output.ll:(.text+0x48): undefined reference to
n' refined_output.ll:(.text+0x50): undefined reference toi' refined_output.ll:(.text+0x59): undefined reference to
x' refined_output.ll:(.text+0x60): undefined reference toi' refined_output.ll:(.text+0x75): undefined reference to
x' refined_output.ll:(.text+0x7c): undefined reference toi' refined_output.ll:(.text+0x95): undefined reference to
changed' refined_output.ll:(.text+0xa3): undefined reference tochanged' refined_output.o: In function
swap': refined_output.ll:(.text+0xc3): undefined reference tox.1' refined_output.ll:(.text+0xca): undefined reference to
y' refined_output.ll:(.text+0xd1): undefined reference tox.1' refined_output.ll:(.text+0xd9): undefined reference to
t' refined_output.ll:(.text+0xe0): undefined reference tox.1' refined_output.ll:(.text+0xe7): undefined reference to
y' refined_output.ll:(.text+0xf2): undefined reference toy' refined_output.ll:(.text+0xf8): undefined reference to
t' refined_output.o: In functionmain': refined_output.ll:(.text+0x102): undefined reference to
i.4' refined_output.ll:(.text+0x10c): undefined reference toseed' refined_output.ll:(.text+0x123): undefined reference to
x.2' refined_output.ll:(.text+0x12a): undefined reference toi.4' refined_output.ll:(.text+0x130): undefined reference to
seed' refined_output.ll:(.text+0x15d): undefined reference toseed' refined_output.ll:(.text+0x166): undefined reference to
i.4' refined_output.ll:(.text+0x16c): undefined reference toi.4' refined_output.ll:(.text+0x177): undefined reference to
x.2' refined_output.ll:(.text+0x18d): undefined reference tox.2' refined_output.ll:(.text+0x19e): undefined reference to
x.2' refined_output.o: In functionprintArray': refined_output.ll:(.text+0x1c4): undefined reference to
msg' refined_output.ll:(.text+0x1cb): undefined reference tox.2' refined_output.ll:(.text+0x1d1): undefined reference to
n.3' refined_output.ll:(.text+0x1d8): undefined reference tomsg' refined_output.ll:(.text+0x1e3): undefined reference to
i.4' refined_output.ll:(.text+0x1f3): undefined reference tox.2' refined_output.ll:(.text+0x1fa): undefined reference to
i.4' refined_output.ll:(.text+0x208): undefined reference toi.4' refined_output.ll:(.text+0x20e): undefined reference to
i.4' refined_output.ll:(.text+0x214): undefined reference ton.3' refined_output.ll:(.text+0x21c): undefined reference to
i.4'clang: error: linker command failed with exit code 1 (use -v to see invocation)
다음과 같이 입력하십시오 :
@x = external global i32*
@n = external global i32
@i = external global i32
@changed = external global i1
@x.1 = external global i32*
@y = external global i32*
@t = external global i32
@msg = external global i8*
@x.2 = external global i32*
@n.3 = external global i32
@i.4 = external global i32
@const_string_temp = private constant [3 x i8] c", \00", align 1
@const_string_temp.5 = private constant [2 x i8] c"\0A\00", align 1
@i.6 = external global i32
@x.7 = external global i32
@seed = external global i32
@const_string_temp.8 = private constant [16 x i8] c"Initial array: \00", align 1
@const_string_temp.9 = private constant [15 x i8] c"Sorted array: \00", align 1
이 정보가 도움이 되었으면 좋겠습니다. 아니면 IRC 생성시 문제를 찾을 수 있기를 바랍니다.
나는 그것을 기대하고 ..
void main? 확실합니까? – kfsone
int main()로 변경해도 아무 것도 변경되지 않습니다. –