오래된 오픈소스 라이브러리를 커스텀하려는데 천재 독일 할아버지가 이걸 어셈블리어로 작성해놨었음...
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
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.