2011-12-10 13 views
2

小さなアプリケーションでlibcの代わりに使用するための小さなライブラリを作成しています。私は主要なlibc代替のソースを読んだが、Linux上でx86_64アーキテクチャで動作するようにパラメータを渡すことができない。アセンブリからmainを呼び出す

_startmainの間にライブラリを初期化する必要はありません。 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

答えて

1

私はあなたが

/* Place the argument array in the second parameter-passing register. */ 
    movq %rsi, %rsp 

間違って持ってだと思います。それは

movq %rsp, %rsi  # move argv to rsi, the second parameter in x86_64 abi 
+0

これはAT&Tの構文です。コメントはセミコロンで始まらない。 –

+0

固定。私は、HPやPPCのコメントのようないくつかのアーキテクチャーでは、実際には、セミコロンで始まる – hirschhornsalz

+0

Dohで始まることを言及したいと思います。私はGASが逆の順序でオペランドを取ったことを認識しませんでした(私はNASMで最初にこれを書いてから、ソースをより緊密に一致させるためにGASに書き直しました)。しかし、プログラムは今セグメンテーションする。しかし、これを指摘してくれてありがとう! – haste

0

maincrt0.oによって呼び出されなければなりません。 this question

ABI文書(アーキテクチャ固有)に指定されているように、カーネルは初期スタックとプロセス環境をexecveの後に設定しています。 mainを呼び出すのはcrt0(および関連する)コードです。

関連する問題