6

単純な hello world C プログラムがあり、/FA でコンパイルします。その結果、コンパイラは対応するアセンブリ リストも生成します。ここで、masm/link を使用して、生成された .asm リストから実行可能ファイルをアセンブルしたいと考えています。

次のコマンド ラインでは、3 つのリンカ エラーが発生します。

\masm32\bin\ml /I"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include" /c /coff asm_test.asm
\masm32\bin\link /SUBSYSTEM:CONSOLE /LIBPATH:"C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" asm_test.obj

C ランタイム関数が以前に生成されたオブジェクト ファイルにリンクされていなかったことを示します。

asm_test.obj : エラー LNK2001: 未解決の外部シンボル @__security_check_cookie@4

生成されたアセンブリ リストは次のとおりです。

; Listing generated by Microsoft (R) Optimizing Compiler Version 15.00.30729.01 

    TITLE   c:\asm_test\asm_test\asm_test.cpp
    .686P
    .XMM
    include listing.inc
    .model  flat

INCLUDELIB OLDNAMES

PUBLIC  ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@   ; `string'
EXTRN   @__security_check_cookie@4:PROC
EXTRN   _printf:PROC
;   COMDAT ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
CONST   SEGMENT
??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@ DB 'hello world!', 0aH, 00H ; `string'
CONST   ENDS
PUBLIC  _wmain
; Function compile flags: /Ogtpy
;   COMDAT _wmain
_TEXT   SEGMENT
_argc$ = 8                      ; size = 4
_argv$ = 12                     ; size = 4
_wmain  PROC                        ; COMDAT
; File c:\users\octon\desktop\asm_test\asm_test\asm_test.cpp
; Line 21
    push    OFFSET ??_C@_0O@OBPALAEI@hello?5world?$CB?6?$AA@
    call    _printf
    add esp, 4
; Line 22
    xor eax, eax
; Line 23
    ret 0
_wmain  ENDP
_TEXT   ENDS
END

最新のmasm32バージョン(6.14.8444)を使用しています。

更新

Cogwheel の提案に従って、INCLUDELIB msvcrt.libasm ソースに を含めました。プログラムがコンパイルされ、実行可能ファイルが作成されますが、リンカーは警告を生成します。

msvcrt.lib(crtmanifestrtm.obj): 警告 LNK4044: 認識されないオプション "manifestdependency:type='win32' name='Microsoft.VC90.CRT' version='9.0.21022.8' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b'"; 無視された

実行可能ファイルを起動すると、C ランタイムで次のエラーが生成されます。

ランタイム エラー: R6034 アプリケーションが C ランタイム ライブラリを正しくロードしようとしました

4

2 に答える 2

0

listing.inc を削除する security_check_cookie 参照を削除する add INCLUDELIB MSVCRT ...et Robert est ton oncle!

また、以下を追加することもできます: EXTERN _getchar:PROC および ret の直前: call _getchar これは、プログラムが終了する前にキーが押されるのを待ちます。

ホンジョンク。

于 2013-04-21T08:13:28.637 に答える