2011-08-05 19 views
9


64ビットMac OS X Lionを使用して、基本的にXcodeでインストールされるnasmとldを使用して基本アセンブリファイルを実行しようとしています。Mac OS Xでldを使用してアセンブリファイルをリンクできません

文字を印刷するアセンブリファイルを作成しました。これをnasmを使用してビルドしました。私は、LDとリンクして行くとき

nasm -f elf -o program.o main.asm

しかし、それはかなりの数のエラー/警告で失敗します。だから、

ld -o program program.o

ld: warning: -arch not specified 
ld: warning: -macosx_version_min not specificed, assuming 10.7 
ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 
ld: warning: symbol dyld_stub_binder not found, normally in libSystem.dylib 
ld: entry point (start) undefined. Usually in crt1.o for inferred architecture x86_64 

、私はいくつかを是正しようとしましたこれらの問題のうち、どこにも行きませんでした。

は、ここで私が試したものの一つだ:私は仕事だろうと思ったが、私は間違っていた

ld -arch i386 -e _start -o program program.o

どのようにオブジェクトファイルをnasmとldが一致する互換アーキテクチャにするか?

また、どのように(今、私は多くの良いを行うにはいないようです_startの上にある.section textglobal _startを、使用しています。)プログラムのエントリポイントを定義し

アイムあなたが正常にオブジェクトファイルをバイナリファイルにリンクする方法について混乱しています。

助けてください。

+0

は、あなたの代わりにLDのGCCを使用してリンクしようとしたことがありますか?多くの場合、Cランタイムと標準ライブラリ(例えば、エントリポイントとして 'main'を使います)を使用するほうが簡単です。もう一つは 'elf'の代わりに' mach'オブジェクトファイル形式を使うことです。 – user786653

答えて

2

gccさんは、ldを直接運転するのではなく、あなたに重い荷物を運んでもらうほうが簡単でしょう。

$ gcc -m32 program.o -o program 
5

OK、あなたのサンプルを見て私は、あなたが一般的なのnasmまたはLinuxアセンブリのチュートリアルを使用のいずれかを想定しています。
最初に気をつける必要があるのは、nasmによって作成されたバイナリ形式です。
あなたのポストの状態:あなたは(例えば、Linux用のケースになります)32ビットELFオブジェクトをしたいのnasm伝え-fエルフパラメータの結果ザッツ

ld: warning: ignoring file program.o, file was built for unsupported file format which is not the architecture being linked (x86_64) 

。しかし、あなたが望んでいるのは、Mach-Oオブジェクトです。

次試してみてください。

nasm -f macho64 -o program.o main.asm 
gcc -o program program.o 

それとも、32ビットのバイナリを作成するためにwan't場合: _startシンボルについて

nasm -f macho32 -o program.o main.asm 
gcc -m32 -o program program.o 

を - あなたがするwan't場合できるだけ簡単なプログラムを作成する 提供されたlibcシステム機能を使用する場合は使用しないでください_start at al。 デフォルトエントリーポイントldはあなたのlibc/libsystemで検索され、正常に検索されます。

は、私はあなたが 「_main」のようなもので、あなたのコード内で _start を交換し、状態上記の例のようにそれをリンクしようと示唆しています。

のnasmのための一般的なlibcのベースアセンブリテンプレートは次のようになります。

;--------------------------------------------------- 
.section text 
;--------------------------------------------------- 
use32    ; use64 if you create 64bit code 
global _main  ; export the symbol so ld can find it 

_main: 
    push ebp 
    mov ebp, esp ; create a basic stack frame 

    [your code here] 

    pop ebp  ; restore original stack 
    mov eax, 0 ; store the return code for main in eax 
    ret   ; exit the program 

はこれに加えて、私はあなたがOSX上で行うすべてのコール年代を使用する必要があることを言及する必要がありますあなたのコードはちょうどクラッシュします。
そこにいくつかの良いチュートリアルがあります。OSXアセンブリガイドを検索してみてください。

5

global startstart:アンダースコアなしを使用する必要があります。また、アーチとしてelfを使用しないでください。ここで私は、Mac OS X上で私のx86-64 NASMプログラムを組み立てるために使用bashスクリプトは次のとおりです。

#!/bin/bash 

if [[ -n "$1" && -f "$1" ]]; then 
    filename="$1" 
    base="${filename%%.*}" 
    ext="${filename##*.}" 

    nasm -f macho64 -Ox "$filename" \ 
    && ld -macosx_version_min 10.7 "${base}.o" -o "$base" 
fi 

ファイルがfoo.sと呼ばれている場合、このスクリプトは最初に作成されます

nasm -f macho64 -Ox foo.s 

を実行しますfoo.o-Oxフラグを使用すると、NASMは飛び越しでいくつかの特別な最適化を行います(つまり、それらを短く、近くにまたは遠くにする)ので、自分で行う必要はありません。私はx86-64を使用していますので、私のコードは64ビットですが、32ビットをアセンブルしようとしているようです。その場合、-f macho32を使用します。有効な出力形式のリストについては、nasm -hfを参照してください。

さて、オブジェクトファイルはリンクされます:私はダウンNASMを静かで警告を防ぐために-macosx_version_minオプションを設定している

ld -macosx_version_min 10.7 foo.o -o foo 

。ライオンに設定する必要はありません(10.7)。これによりfooという実行可能ファイルが作成されます。運があれば、./fooと打ち返してプログラムを実行してください。

警告に関しては、毎回そのことを知っていますが、私はその理由をよく分かりませんが、実行可能ファイルを実行するとすべてがうまくいくように見えます。

0

mac gccコンパイラはelfオブジェクトをリンクしません。あなたはクロスコンパイラが必要です...

http://crossgcc.rts-software.org/doku.php?id=compiling_for_linux

あなたはこれに似た何かを続行することができますすると...

/usr/local/gcc-4.8.1-for-linux32/bin/i586-pc-linux-ld -m elf_i386 -T link.ld -o kernel kasm.o kc.o 
関連する問題