오래된 오픈소스 라이브러리를 커스텀하려는데 천재 독일 할아버지가 이걸 어셈블리어로 작성해놨었음...

12년쯤 전에는 아무것도 몰라서 일단 다운로드 받은채로 묵혀뒀었는데

현업6년차가 넘은 인제서야 readme 꼼꼼히 살펴보고 masm인가 깔고 개발환경 만들어서 빌드성공


헌데 본격적으로 수정을 하려니 어셈블리어 공부하고 읽고쓸생각을 하니, 내가 어디 늙다리 고연봉직장이라도 가서 꺼드럭거릴게 아닌이상 너무 비생산적이였음.

그래서 masm에서 닷넷Aot로 빌드한 라이브러리를 호출할수 있을거라생각해 파다가 실패.

dll이 아니라 lib를 뱉어야 하고 닷넷이 x64밖에 Aot지원을 안하고, 연구과정이 아까워서 x64어셈블리에서 x64 Aot빌드의 함수를 호출하는방법 까지만 정리하려고 했는데, 그마저도 도저히 할수가 없었음. 기냥 하루 날림.


근데 포기하려다가 DNNE 라는 라이브러리를 어쩌다 찾은덕분에 냅다 성공해버렸다.

.NET Framework: 971. UnmanagedCallersOnly 특성과 DNNE 사용 (sysnet.pe.kr)

Aot랑 상관없이 .dll을 .lib로 호출가능하게 연결지어주는 녀석같다.

Aot의 목표는 성능최적화인데 내 목적은 성능이랑은 아무렴 상관없으니 딱 맞는 역할이다.


여기까지 해본사람이 없는건지 검색으로 비슷한 사례도 찾기 어려워서 출력이랑 기타 유효한 자료들만 열거해둠.

테스트가능한 예제는 추후에 작성


C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC

> ml64 Asse-mbly1.asm /link /SUBSYSTEM:CONSOLE /entry:main kernel32.lib libcmt.lib advapi32.lib bcrypt.lib crypt32.lib iphlpapi.lib mswsock.lib ncrypt.lib normaliz.lib ntdll.lib ole32.lib oleaut32.lib secur32.lib user32.lib version.lib ws2_32.lib


Microsoft (R) Incremental Linker Version 14.40.33617.1

Copyright (C) Microsoft Corporation. All rights reserved.


/OUT:Assem-bly1.exe

Assem-bly1.obj

/SUBSYSTEM:CONSOLE

/entry:main

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 _tls_index

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpNewArray

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpAssignRef

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpNewFast

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpReversePInvoke

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpReversePInvokeReturn

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpPInvoke

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpPInvokeReturn

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCheckedAssignRef

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpTrapThreads

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGcPoll

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpThrowEx

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 __security_cookie

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpFallbackFailFast

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 BCryptGenRandom

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetOSModuleFromPointer

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetRuntimeVersion

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetKnobValues

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhBulkMoveWithWriteBarrier

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhHandleFree

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhHandleSet

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpNewFinalizable

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetProcessCpuCount

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhSuppressFinalize

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhReReg---------------------isterForFinalize

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetMemoryInfo

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhNewString

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 g_cpuFeatures

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 NativeRuntimeEventSource_LogExceptionThrown

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhCurrentOSThreadId

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetCrashInfoBuffer

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RaiseFailFastException

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCheckedLockCmpXchg

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhSpinWait

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 GetTickCount64

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhSetThreadExitCallback

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhYield

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 SleepConditionVariableCS

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 WakeConditionVariable

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 InitializeConditionVariable

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhCompatibleReentrantWaitAny

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhFindMethodStartAddress

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpHandleAlloc

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpHandleAllocDependent

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetDispatchCellInfo

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpUpdateDispatchCellCache

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpSearchDispatchCellCache

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetClasslibFunctionFromEEType

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpWaitForFinalizerRequest

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpSignalFinalizationComplete

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCollect

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetNextFinalizableObject

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetClasslibFunctionFromCodeAddress

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCopyContextFromExInfo

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetThreadAbortException

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpSfiInit

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpSfiNext

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpSetThreadDoNotTriggerGC

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCallCatchFunclet

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpEHEnumInitFromStackFrameIterator

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpEHEnumNext

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCallFilterFunclet

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCallFinallyFunclet

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetGcTotalMemory

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpStartNoGCRegion

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpEndNoGCRegion

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGcSafeZeroMemory

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetCurrentThreadStackTrace

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetThunkSize

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetNumThunksPerBlock

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetNumThunkBlocksPerMapping

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetThunkBlockSize

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpAcquireThunkPoolLock

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpReleaseThunkPoolLock

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetThunkDataBlockAddress

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetThunkStubsBlockAddress

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhAllocateThunksMapping

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpByRefAssignRef

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhRegi--------------sterInlinedThreadStaticRoot

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetThreadStaticStorage

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpGetModuleSection

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetModuleFileName

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpReg---------------isterOsModule

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCreateTypeManager

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpRegi--------------sterFrozenSegment

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhAllocateNewObject

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpDbl2ULng

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 GetCurrentProcessorNumberEx

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 CreateEventExW

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 CoGetApartmentType

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpRethrow

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetCodeTarget

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhGetTargetOfUnboxingAndInstantiatingStub

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhFindBlob

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpCheckedXchg

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhHandleGetDependent

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhAllocateNewArray

NativeLibrary.lib(NativeLibrary.obj) : error LNK2001: 확인할 수 없는 외부 기호 RhpInitialDynamicInterfaceDispatch

Assem-bly1.exe : fatal error LNK1120: 98개의 확인할 수 없는 외부 참조입니다.

Assembling: Assem-bly1.asm


MASM32 SDK

http://www.masm32.com/download/install64.zip Masm 64 programs (masm32.com)

ThomasJaeger/VisualMASM: Visual MASM - Assem-bly IDE for Microsoft MASM (github.com)

위는 자체적으로 masm개발환경을 구축할때 필요한것들이다.

대신 비주얼스튜디오 데스크톱C++개발환경을 설치하고 x86, x64 전용콘솔을 실행시키면 ml ml64 link 등 masm 빌드환경이 갖춰져있다.

https://learn.microsoft.com/cpp/build/how-to-enable-a-64-bit-visual-cpp-toolset-on-the-command-line

How to: Enable a 64-Bit MSVC Toolset on the Command LineLearn more about: How to: Enable a 64-Bit, x64 hosted MSVC toolset on the command linelearn.microsoft.com