2

こんにちは、単純な 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`
4

2 に答える 2