2009-06-25 8 views
2

私はLeopard MacBook Proのx64アセンブリでHello Worldを構築しようとしています。それは細かい組み立てが、私はそれをリンクしようとすると、私はこのエラーを取得する: LD:(通常crt1.o初/ dylib1.o/bundle1.oで)定義されていないdyld_stub_binding_helperシンボル推定されたアーキテクチャはx86_64用OS Xでx64アセンブリプログラムを作成するにはどうすればよいですか?

を、私はそれをロード ld -o hello64 hello64.o -lc

私のアセンブラはYasmです。

EDIT:32ビットコードとは異なり、自分でスタブヘルパーを指定する必要があります.64ビットスタブヘルパーの仕組みがわからないので、Bastienそれはそれ自身のスタブヘルパーを含んでいるので、GCCはそれをリンクしています。

Doh!私のアセンブリのエントリーポイントがの代わりに_mainだった場合、ldは自動的にcrt1.oをインクルードしていました。

答えて

3

は単にGCCは、リンカの呼び出しを処理してみましょう。このような何か:

gcc hello64.o -o hello64 

あなたのアセンブリコードは、おそらくmainシンボルを定義、または多分startする必要があります。

[編集]

私は、これは、異なるプラットフォームが異なってリンカーを起動していることである示唆していた理由。 GCCがコマンドラインオプション--verboseを使用してリンカに渡す引数を確認すると、複雑で実装に依存していることがわかります。

5

アセンブラを指定していません。個人的には、私はyasmアセンブラを使用する前にこれを行っていました(そして、その点についてはブログ記事を書いていましたが、私のブログは長い間ダウンしてしまったためリンクを投稿できません)。基本的には、ハローワールドは、次のようになります。

で組み立て
SECTION .data 
    hello db 'hello, world', 10 
    hellolen equ $ - hello 

SECTION .text 
    global start 

start: 
    mov rax, 0x2000004 ; sys_write 
    mov rdi, 1   ; stdout 
    mov rsi, qword hello ; string 
    mov rdx, hellolen  ; length 
    syscall 
    mov rax, 0x2000001 ; sys_exit 
    xor rdi, rdi   ; exit code 
    syscall 

yasm -f macho64 file.asm 
ld a.o 
./a.out 
+0

。しかしOS Xでは、文書化されていないだけでなく、バ​​ージョン番号の増加に応じて変更できるので、実際にはライブラリ関数を呼び出すことができる必要があるので、syscallsを使うべきではありません。 –

+0

@Micheal:ええ、しかし、実際にはx64 asmでコード化することはほとんどありません。その時、私は実際にx64システムコールを試していました;)あなたは何かスタンドアロン(libcへのリンクなし)。 –

0

YASMで、あなたは行うことができます:私もYasmを使用してい

yasm -f macho64 -a x86 main.asm -o main.o 
ld main.o -o my_program 
関連する問題