Здравствуйте Незнает ли кто как сие лечится: Необходимо: обеспечить использование LIBC.LIB в masm32 Имеем: File.asm --------------------------- ... includelib libc.lib extern c malloc:near ... call malloc ... --------------------------- при сборке получаем: libc.lib(a_env.obj): error LNK2001: unresolved external symbol __imp__GetEnvironmentStrings@0
Спасибо за файл (если не секрет откуда это?) но к сожалению он не подходит т.к. в отличие от libc.lib из MSVC++ 6, не содержит _aulldiv, _alldiv, _allmul, _nh_malloc и вроде как он не statically linked
2 bober Спасибо попробую 2 green Да доступен но imho это не имеет значения т. к. речь идёт о __imp__GetEnvironmentStrings@0, а kernel32.dll содержит _GetEnvironmentStrings@0 и в общем то глядя в libc.lib(a_env.obj) с помощью IDA можно видеть: Код (Text): ... push esi call dword ptr ds:__imp__FreeEnvironmentStringsW@4 mov eax, ebx jmp short loc_0_12F ; -------------------------------------------------------- loc_0_DC: ; cmp eax, 2 jnz short loc_0_12D loc_0_E1: ; cmp edi, ebx jnz short loc_0_F1 call dword ptr ds:__imp__GetEnvironmentStrings@0 mov edi, eax .... extrn __imp__GetEnvironmentStrings@0:near extrn __imp__GetEnvironmentStringsW@0:near ... то есть __imp__GetEnvironmentStringsW@0 ошибки не вызывает а __imp__GetEnvironmentStrings@0 почемуто вызывает error LNK2001 - 2 tigsid libcmt.lib судя по MSDN для multithreaded, а если msvcrt.lib то придется за собой msvcrtXX.dll таскать -
2 cresta По поводу msvcrtXX.lib из MSVC у меня есть следующее: //-------------------------------------------------------- There are three forms of the C Run-time library provided with the Win32 SDK: - LIBC.LIB is a statically linked library for single-threaded programs. - LIBCMT.LIB is a statically linked library that supports multithreaded programs. - CRTDLL.LIB is an import library for CRTDLL.DLL that also supports multithreaded programs. CRTDLL.DLL itself is part of Windows NT. Microsoft Visual C++ 32-bit edition contains these three forms as well, however, the CRT in a DLL is named MSVCRT.LIB. The DLL is redistributable. Its name depends on the version of VC++ (ie MSVCRT10.DLL or MSVCRT20.DLL). Note however, that MSVCRT10.DLL is not supported on Win32s, while CRTDLL.LIB is supported on Win32s. MSVCRT20.DLL comes in two versions: one for Windows NT and the other for Win32s. //-------------------------------------------------------- а в masm32 я её не нашёл (может не там искал?)-
Сейчас проверил - действительно это просто переходник на msvcrt.dll. Хотя можно попробовать через DLL2LIB пропустить, чтобы получить статическую либу. А msvcrt.dll практически в любой винде есть, насколько я знаю
2 bober Спасибо за файл но он к сожалению также несодержит _nh_malloc и по беглому осмотру содержит переходы на msvcrtXX.dll, то есть в итоге imho возникнет необходимость контролировать присутствие и версию msvcrtXX.dll при исполнении файла на произвольном PC под управлением M$ Windows -
acdel1 не стесняйтесь искать в форуме http://www.wasm.ru/forum/index.php?action=vthread&forum=4&topic=8121
2 Asterix Спасибо за ссылку но я её уже видел - и в общем то у меня сделано так как там показано: \\------------------------------------- ... extern C strcpy:near ... push ebx call strcpy ... \masm32\bin\link /subsystem:windows msgbox.obj LIBCMT.LIB \\------------------------------------- за исключением того, что у меня используется libc.lib вместо LIBCMT.LIB и libc.lib указана в includelib, а не как *.obj линкеру но последнее как я выяснил не имеет значение - и проблема у меня не втом что линкер не находит вызываемую мной функцию, а в том что он не находит функцию к которой происходит обращение в a_env.obj libc.lib: \\--------a_env.obj IDA-------- ... loc_0_33: call dword ptr ds:__imp__GetEnvironmentStrings@0 mov edi, eax ... extrn __imp__GetEnvironmentStrings@0:near ... \\--------a_env.obj IDA--------
Здраствуйте. я шашёл следующее: судя по masm32 инклюдам GetEnvironmentStrings не сущестует, а существуют GetEnvironmentStringsA и GetEnvironmentStringsW Может быть кто нибудь знает как линкеру указать что GetEnvironmentStrings это то же что и GetEnvironmentStringsA? Или может быть кто нибудь знает софт для того чтобы извлечь *.obj из libc.lib а после исправления запихнуть их обратно?
2 bober я могу выслать, но размер архива составляет 893 kb - 2 Asterix дак есть в инклюдах: kernel32.inc GetEnvironmentStrings equ GetEnvironmentStringsA
Открываем первый попавшийся inc и видим: Код (Text): MIMEAssociationDialogA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD [b]MIMEAssociationDialog equ <MIMEAssociationDialogA>[/b] А что собственно за проблема такая? GetEnvironmentStrings кроме как через libc взять негде? В kernel32 есть, и переменные окружения такой код выдаёт без проблем: Код (Text): invoke GetEnvironmentStrings mov ebx,eax .while byte ptr[ebx] invoke MessageBox, NULL, ebx, NULL, MB_OK invoke lstrlen, ebx lea ebx,[ebx+eax+1] .endw Например у меня выдает такую инфу: Код (Text): ebx = ALLUSERSPROFILE=C:\Documents and Settings\All Users ebx = APPDATA=C:\Documents and Settings\• §à¨â\Application Data ebx = CLIENTNAME=Console ebx = CommonProgramFiles=C:\Program Files\Common Files ebx = COMPUTERNAME=CR ebx = ComSpec=C:\WINDOWS\system32\cmd.exe ebx = HOMEDRIVE=C: ebx = HOMEPATH=\Documents and Settings\• §à¨â ebx = LOGONSERVER=\\CR ebx = NUMBER_OF_PROCESSORS=1 ebx = OS=Windows_NT ebx = Path=c:\masm32\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\ Wbem;C:\PBWIN70\BIN ebx = PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH ebx = PROCESSOR_ARCHITECTURE=x86 ebx = PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD ebx = PROCESSOR_LEVEL=6 ebx = PROCESSOR_REVISION=0801 и т.д.