2016-06-01 6 views
1

私はWindowsでこのexeclpプログラムをldを使用してリンクするにはどうすればよいですか?用いて微細なコンパイル

.text 
    .globl _main 
    .def _main; .scl 2; .type 32; .endef 
    #.extern _execlp 
    .def _execlp; .scl 2; .type 32; .endef 
_main: 
    push %ebp 
    movl %esp, %ebp 
    pushl $0 
    pushl $0x00657865 
    pushl $0x2e646d63 
    call _execlp 
    movl %ebp, %esp 
    pop %ebp 

... Windowsの場合、以下に-なるシェルコードをコンパイルするためのMinGW(GCCとして、そして具体的には、LD)からのガスを使用しています...

as -o ex.o ex.s 

ここで、ex.sはアセンブリソースファイルです。

しかし、リンク...

ld -o ex.exe ex.o 

時にはエラーになります...

ex.o:fake:(.text+0x10): undefined reference to 'execlp' 

だから私はそれにextern入れて作ってみました...

.extern _execlp 

...上の定義は(コメント)です。

一方、私は(もともとはgccを-S -m32 -o ex.s ex.c)を使用してex.sファイルを(生成する)このコードでの.cファイルを持っていた...

#include <process.h> 
int main(int argc, char *argv[]) 
{ 
    execlp("cmd.exe", 0); 
    return 0; 
} 

コンパイル時に...

gcc -o exc.exe exc.c 

ここで、exc.cはcファイルです。それはコンパイルし、目的の機能で実行されます... 私はDLLをexc.exeで使用されていることを見つけるためにDependency Walkerを使用し、kernel32.dll、ntdll.dll、およびmsvcrt.dllが使用されていることがわかりました。 msvcrtはcランタイムライブラリ(execlpを含む)であるため、重要です。 だから私は

.extern _execlp 

で...そう...

ld -lkernel32 -lndtll -lmsvcrt -o ex.exe ex.o 

ようex.oリンクしようとした...ソースファイル(ex.s)内で定義されたコメントがどこにありますか。

これは、上記と同じリンクエラーが発生しました...

私は間違っていますか?

+0

は、オブジェクトの後に '-l'のスイッチを入れてみてください。 'ld'のいくつかのバージョンは厄介であることが知られています。また、アンダースコアを削除しようとすると、自動的にいくつかのバージョンが追加されます。アップデート:実際には2つのアンダースコアを持つ '__execlp'を使う必要がありますので、削除せずにもう1つ追加してください:) – Jester

+0

スイッチの位置は役に立ちません。 execlpのレガシー関数はアンダースコアで問題ありません。アンダースコアをガスのものとして認識しなくても、それはパラメータと機能が同じである_execlpを呼び出します。そして、アンダースコアは赤ちゃんが好きなやり方にすぎないので、私はそれを騙しません。まだ固まって.... – August

+0

私はテストした、あなたは2つのアンダースコアが必要です。少なくとも私のmsvcrtの唯一のバージョンです。 – Jester

答えて

3

アンダースコアを2つ使用し、オブジェクトファイルの後にライブラリをリストする必要があります。 また、引数を間違って渡します。これは私の作品:as -o ex.o ex.s

と連動:

.globl _main 
_main: 
    push %ebp 
    movl %esp, %ebp 
    pushl $0x00657865 
    pushl $0x2e646d63 
    pushl $0 
    lea 4(%esp), %eax 
    pushl %eax 
    call __execlp 

で組み立てld -o ex.exe ex.o -lkernel32 -lmsvcrt

+0

作品!どうもありがとう! – August

関連する問題