小さなアプリケーションでlibc
の代わりに使用するための小さなライブラリを作成しています。私は主要なlibc
代替のソースを読んだが、Linux上でx86_64アーキテクチャで動作するようにパラメータを渡すことができない。アセンブリからmainを呼び出す
_start
とmain
の間にライブラリを初期化する必要はありません。 libc
とその代替案は初期化ステップを使用しており、アセンブリの知識が限られているため、パラメータの並べ替えが問題を引き起こしていると思われます。
これは私が様々な実装からインスピレーションを得たアセンブリが含まれている、持っているものです:
.text
.global _start
_start:
/* Mark the outmost frame by clearing the frame pointer. */
xorl %ebp, %ebp
/* Pop the argument count of the stack and place it
* in the first parameter-passing register. */
popq %rdi
/* Place the argument array in the second parameter-passing register. */
movq %rsi, %rsp
/* Align the stack at a 16-byte boundary. */
andq $~15, %rsp
/* Invoke main (defined by the host program). */
call main
/* Request process termination by the kernel. This
* is x86 assembly but it works for now. */
mov %ebx, %eax
mov %eax, 1
int $80
とエントリポイントは、通常の主な署名です:int main(int argc, char* argv[])
。環境変数などは、この特定のプロジェクトには必要ありません。
AMD64 ABIは、最初のパラメータにrdi
を使用し、2番目のパラメータにはrsi
を使用する必要があります。
スタックを正しくセットアップし、パラメータをLinux x86_64のmain
に渡すにはどうすればよいですか?ありがとう!
参考文献:
http://www.eglibc.org/cgi-bin/viewvc.cgi/trunk/libc/sysdeps/x86_64/elf/start.S?view=markup
http://git.uclibc.org/uClibc/tree/libc/sysdeps/linux/x86_64/crt1.S
これはAT&Tの構文です。コメントはセミコロンで始まらない。 –
固定。私は、HPやPPCのコメントのようないくつかのアーキテクチャーでは、実際には、セミコロンで始まる – hirschhornsalz
Dohで始まることを言及したいと思います。私はGASが逆の順序でオペランドを取ったことを認識しませんでした(私はNASMで最初にこれを書いてから、ソースをより緊密に一致させるためにGASに書き直しました)。しかし、プログラムは今セグメンテーションする。しかし、これを指摘してくれてありがとう! – haste