私はLLVM IRで少し遊んでいますが、LLVMインタープリタlli
が明確に定義されていない関数を探しているところで解決できません。基本的なシステム機能を意味する)。私はそのような何かを行うことができ、画面上の何かを書きますLinux上で、依存関係のない簡単なプログラムを書きたい場合たとえば、次のように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
から期待どおりに開始されます。私はコード書いた場合:今
@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
も期待されているprintf
への参照を知らないので、それはまたlli
で動作しますが、私はそれld
できません。私はそのコードを動作させるために、ld
のパラメータを準備することもできますし、単にgcc file.o -o file
を使用することもできますが、これは私の問題ではありません。私のポイントは、lli
に外部ライブラリ(libcなど)を含めずに自分のコードだけを実行し、独自のエントリポイントを定義する方法です。用意されたlibc
や他のライブラリを自由に組み込むことができます。関数の名前を上書きして動作するはずですが、何が書き換えられたのか分からないので、printf
が使われていても定義されていなければ、lli
がエラーをスローすると私はうれしいでしょう。あるいは、私は何かが間違っているとlli
そのような裸の環境では実行できません。
私は 'lli -entry-function = _start file.ll 'を使ってエントリポイントを選択できます。しかし、プリロードされたコードのインタプリタを削除する方法はまだ分かりません。 '-extra-object =