저는 LLVM IR로 놀고 있는데, LLVM 인터프리터 lli
이 명확하게 정의되지 않은 함수를 찾고있는 곳에서 (Google 및 doc의 도움으로) 해결할 수 없습니다. 기본 시스템 기능을 의미 함).LLVM 인터프리터가 외부 함수 (라이브러리?)를 찾고 있습니다.
@message = private constant [12 x i8] c"hello world\0A"
define i32 @puts(i8* %s) {
call i32 asm sideeffect "movl $$0x2, %edi\0Amovl $$0xC, %edx\0Amovl$$1, %eax\0Asyscall\0A", "=A,{si}"(i8* %s) #1
ret i32 %1
}
define void @exit(i32 %c) {
call i32 asm sideeffect "movl $$60, %eax\0Asyscall\0A", "=A,{di}"(i32 %c) #1
ret void
}
define void @main() {
getelementptr [12 x i8], [12 x i8]* @message, i64 0, i64 0
call i32 @puts(i8* %1)
call void @exit(i32 0)
ret void
}
define void @_start() {
call void @main()
ret void
}
main
및 _start
는 ld
및 lli
와 상호 호환성을위한 것입니다 : 예를 들어 내가 그런 일을 할 수있는 화면에 무언가를 작성합니다 리눅스에 종속되지 간단한 프로그램을 작성하려는 경우. 그래서 위 코드는 둘 다 동일하게 작동합니다. 이 코드는 lli
이고 코드는 main
또는 llc
이고 그 다음은 ld
이 될 수 있으며 코드도 _start
에서 시작됩니다. 내가 코드를 작성하는 경우 지금 : 그것은 또한 lli
에서 작동
@formatString = private constant [4 x i8] c"%d\0A\00"
declare i32 @printf(i8*, ...)
define i32 @main() {
%d = shl i32 2, 3
%s = getelementptr [4 x i8], [4 x i8]* @formatString, i64 0, i64 0
%call = call i32 (i8*, ...) @printf(i8* %s, i32 %d)
ret i32 0
}
을하지만 난 수 없습니다 ld
그것은 ld
때문에도 예상된다 printf
을 참조 모르겠어요. 그 코드가 작동하도록하기 위해 ld
매개 변수를 준비하거나, 단순히 gcc file.o -o file
을 사용하는 것도 포함 할 수 있습니다. 그러나 이것은 제 요점이 아닙니다. 내 요점은 lli
에 외부 라이브러리 (예 : libc)를 포함하지 않고 단지 내 코드 만 실행하고 내 자신의 진입 점을 정의하는 방법입니다. 준비된 libc
또는 다른 라이브러리를 포함시킬 수 있습니다. 함수의 이름을 덮어 쓰고 작동해야하지만, 무엇이 다시 작성되었는지 확신 할 수 없기 때문에 printf
이 사용되었지만 정의되지 않은 경우 lli
이 오류를 던집니다. 또는 내가 잘못한 점을 알고 lli
같은 환경에서 수행 할 수 없습니다.
'lli -entry-function = _start file.ll'에서 어떤 진입 점을 선택할 수 있습니다. 그러나 미리로드 된 코드의 인터프리터를 제거하는 방법을 여전히 모릅니다. '-extra-object =