私は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)内で定義されたコメントがどこにありますか。
これは、上記と同じリンクエラーが発生しました...
私は間違っていますか?
は、オブジェクトの後に '-l'のスイッチを入れてみてください。 'ld'のいくつかのバージョンは厄介であることが知られています。また、アンダースコアを削除しようとすると、自動的にいくつかのバージョンが追加されます。アップデート:実際には2つのアンダースコアを持つ '__execlp'を使う必要がありますので、削除せずにもう1つ追加してください:) – Jester
スイッチの位置は役に立ちません。 execlpのレガシー関数はアンダースコアで問題ありません。アンダースコアをガスのものとして認識しなくても、それはパラメータと機能が同じである_execlpを呼び出します。そして、アンダースコアは赤ちゃんが好きなやり方にすぎないので、私はそれを騙しません。まだ固まって.... – August
私はテストした、あなたは2つのアンダースコアが必要です。少なくとも私のmsvcrtの唯一のバージョンです。 – Jester