5
/*********
exit.asm
*/

[SECTION .text]

global _start


_start:
xor eax, eax
xor ebx, ebx
mov al, 1
int 0x80

//****************************

まず、nasm -f elf exit.asm を使用してオブジェクト ファイルを生成しました。

次に、Mac OS X 10.7 で次の「ld」コマンドを実行しました。これらの出力と警告が表示されます。32 ビット Linux マシンで実行しようとしましたが、すべてうまくいきました。リンカーは私の Mac で動作しますか?

ありがとうございました!

Alfred says: ld -o exiter exit.o
ld: warning: -arch not specified
ld: warning: -macosx_version_min not specified, assuming 10.7
ld: warning: ignoring file exit.o, file was built for unsupported file format ( 0x7f 0x45      0x4c 0x46 0x 1 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the   architecture being linked (x86_64): exit.o
Undefined symbols for architecture x86_64:
  "start", referenced from:
    implicit entry/start for main executable
ld: symbol(s) not found for inferred architecture x86_64

アーチとバージョンを指定すると、次のようになりました。

Alfred says: ld -arch x86_64 -macosx_version_min 10.7 -o exiter exit.o
ld: warning: ignoring file exit.o, file was built for unsupported file format ( 0x7f 0x45     0x4c 0x46 0x 1 0x 1 0x 1 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 0x 0 ) which is not the   architecture being linked (x86_64): exit.o
 Undefined symbols for architecture x86_64:
 "start", referenced from:
    implicit entry/start for main executable
 ld: symbol(s) not found for architecture x86_64
4

4 に答える 4

5

Mac OS X は ELF を使用しないため、そのシステムでリンクする Mach-O オブジェクトを生成する必要があります。私のマシンnasmでは 32 ビット出力しかサポートしていないように見えるので、リンクするときもそのアーキテクチャに合わせる必要があります。

また、リンクするために変更_startする必要がありました。start

コードを使用した実際の例を次に示します。

$ cat exit.asm 
[SECTION .text]

global start

start:
xor eax, eax
xor ebx, ebx
mov al, 1
int 0x80
$ nasm -f macho exit.asm 
$ ld -arch i386 -macosx_version_min 10.7  -o exiter exit.o 
$ ./exiter 
$ echo $?
236

このプログラムは、Linux と同じようにシステム コールを行わないため、Mac OS X ではおそらく期待どおりに動作しないことに注意してください。

于 2013-05-28T21:04:11.267 に答える
3

ほとんどの場合、次のエラーが表示されます。

ld: warning: PIE disabled. Absolute addressing (perhaps -mdynamic-no-pic) not 
allowed in code signed PIE, but used in _start from hello.o. To fix this 
warning, don't compile with -mdynamic-no-pic or link with -Wl,-no_pie

これは、「start:」というラベルの「main()」関数(ラベル) を探しているためです。"ld -e" を使用してメイン ラベルを指定することをお勧めします。

nasm の場合:

-o hello.tmp - outfile
-f macho - specify format
Linux - elf or elf64
Mac OSX - macho

ld の場合:

-arch i386 - specify architecture (32 bit assembly)
-macosx_version_min 10.6 (Mac OSX - complains about default specification)
-no_pie (Mac OSX - removes ld warning)
-e main - specify main symbol name (Mac OSX - default is start)
-o hello.o - outfile

シェルの場合:

./hello.o - execution

一発ギャグ:

nasm -o hello.tmp -f macho hello.s && ld -arch i386 -macosx_version_min 10.6 -no_pie -e _main -o hello.o hello.tmp && ./hello.o

これが役立つかどうか教えてください!

私はここのブログでそれを行う方法を書きました:

http://blog.burrowsapps.com/2013/07/how-to-compile-helloworld-in-intel-x86.html

より詳細な説明については、こちらの Github で説明しました。

https://github.com/jaredsburrows/Assembly

于 2013-07-23T03:08:09.177 に答える
0

標準の mac gcc は elf オブジェクトをリンクしません。elf 形式に固執し、Mac で開発する必要がある人には、クロス コンパイラが必要です...

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
于 2015-12-03T16:48:13.887 に答える