アセンブラ関数をCからリンクする

http://homepage1.nifty.com/herumi/prog/prog10.html
を見てやってみる。

gas(linux)

リンカに拘ると前に進めない。
gas仕様のsum.Sを写経してリンクする。

$ gcc -c main.c
$ as sum.S -o sum.o
$ ld -o sum main.o sum.o -e main
undefined reference to `atoi とか出る。
$ ld -o sum main.o sum.o -e main -lc
$ ./sum
zsh: そのようなファイルやディレクトリはありません: ./sum
$ ld -o sum main.o sum.o -e main --dynamic-linker /lib/ld-linux.so.2 -lc 
$ ./sum
zsh: segmentation fault  ./sum

ここまでで頓挫。
今はリンカじゃなくてアセンブラをやっているということに妥協してすなおにgccを使う。

$ gcc -o sum main.o sum.o
$ ./sum 1 2
1 + 2 = 3

いままで気にしていなかったがmainに至る道は複雑なのかもしれない。

nasm(windows)

section .text

global _sum

_sum:
  mov eax, [esp+4]
  add eax, [esp+8]
  ret
> cl /c main.c
> nasm -f coff sum.asm
> link /out:sum.exe sum.o main.obj
> ./sum.exe
> ./sum.exe 1 2
1 + 2 = 3

リンクはWindowsの方があっさりいった。
link.exeがldと違いgccのように暗躍しているのかもしれない。
関数名の先頭にアンダーバーをつけないといけないのは回避できないのだろうか。