こんにちは、単純な hello world プログラムをアセンブリで作成し、それを .o ファイルにコンパイルしてから、標準 C ライブラリとリンクして .exe を作成し、「puts」の逆アセンブリを表示できるようにしようとしています。システムを使用してgdb -tui
います。次のユーティリティ バージョンで Cygwin を使用しています (これらは で取得しましたas --version && ld --version
)。これをすべて Windows 8 x64 で実行しようとしています。
バージョン 2.25 として
ld バージョン 2.25
テスト.asm
x86 アセンブリの学習中に、インターネットでいくつかのアセンブリ標準を見てきました。私がここに書いているのはGASだと思います。
.extern puts
_start:
mov $msg, %rdi
call puts
xor %rax, %rax
ret
msg:
.ascii "hello world"
アセンブラ
上記のファイルを問題なくアセンブルできます。as
ユーティリティは警告やエラーを表示しませんas
。ユーティリティを呼び出す方法を次に示します。
as test.asm -o test.o
リンカ
ここで問題が発生します。次のコマンドは、オブジェクトファイルを標準の c ライブラリにリンクする必要があると思う方法です。
ld test.o -o test.exe -lc
このコマンドは次のエラーを生成しますが、これには困惑しました。他の投稿やグーグルで答えを見つけようとしましたが、何か足りないかもしれません。
test.o:fake:(.text+0x3): relocation truncated to fit: R_X86_64_32S against `.text`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): undefined reference to `__imp_puts`
/usr/lib/libc.a(t-d000957.o):fake:(.text+0x2): relocation truncated to fit: R_X86_64_PC32 against undefined symbol `__imp_puts`