libc.lib в masm32

Тема в разделе "WASM.ASSEMBLER", создана пользователем acdel1, 5 ноя 2005.

  1. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Здравствуйте



    Незнает ли кто как сие лечится:



    Необходимо: обеспечить использование 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
     
  2. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
  3. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Спасибо за файл (если не секрет откуда это?)

    но к сожалению он не подходит т.к.

    в отличие от libc.lib из MSVC++ 6,

    не содержит _aulldiv, _alldiv, _allmul, _nh_malloc и вроде как он не statically linked
     
  4. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
  5. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    а линкеру kernel32.lib доступна ?
     
  6. tigsid

    tigsid Member

    Публикаций:
    0
    Регистрация:
    11 июн 2004
    Сообщения:
    62
    А почему нужна именно LibC. Может подойдет LIBCMT.LIB, MSVCRT.LIB ... .
     
  7. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober Спасибо попробую



    2 green Да доступен но imho это не имеет значения т. к. речь идёт о __imp__GetEnvironmentStrings@0, а kernel32.dll содержит _GetEnvironmentStrings@0 и в общем то глядя в libc.lib(a_env.obj) с помощью IDA можно видеть:
    Код (Text):
    1.  
    2. ...                                        
    3.    push    esi
    4.    call    dword ptr ds:__imp__FreeEnvironmentStringsW@4
    5.    mov     eax, ebx
    6.    jmp     short loc_0_12F
    7. ; --------------------------------------------------------
    8. loc_0_DC:                               ;
    9.    cmp     eax, 2
    10.    jnz     short loc_0_12D
    11.  
    12. loc_0_E1:                               ;  
    13.    cmp     edi, ebx
    14.    jnz     short loc_0_F1
    15.    call    dword ptr ds:__imp__GetEnvironmentStrings@0
    16.    mov     edi, eax
    17. ....
    18.    extrn __imp__GetEnvironmentStrings@0:near
    19.    extrn __imp__GetEnvironmentStringsW@0:near
    20. ...
    21.  


    то есть __imp__GetEnvironmentStringsW@0 ошибки не вызывает а __imp__GetEnvironmentStrings@0 почемуто вызывает error LNK2001 -:dntknw:



    2 tigsid libcmt.lib судя по MSDN для multithreaded,

    а если msvcrt.lib то придется за собой msvcrtXX.dll таскать -:dntknw:
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Разве msvcrt.lib из пакета masm не для статической линковки?
     
  9. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    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 я её не нашёл (может не там искал?)-:dntknw:
     
  10. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Сейчас проверил - действительно это просто переходник на msvcrt.dll. Хотя можно попробовать через DLL2LIB пропустить, чтобы получить статическую либу.

    А msvcrt.dll практически в любой винде есть, насколько я знаю
     
  11. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober Спасибо за файл но он к сожалению также несодержит _nh_malloc

    и по беглому осмотру содержит переходы на msvcrtXX.dll, то есть в итоге

    imho возникнет необходимость контролировать присутствие и версию msvcrtXX.dll

    при исполнении файла на произвольном PC под управлением M$ Windows -:dntknw:
     
  12. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 cresta Как я понял MSDN, то LIBC.LIB и есть статический вариант

    msvcrt.dll
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
  14. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 Asterix Спасибо за ссылку но я её уже видел -:dntknw:

    и в общем то у меня сделано так как там показано:

    \\-------------------------------------

    ...

    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 линкеру

    но последнее как я выяснил не имеет значение -:dntknw:

    и проблема у меня не втом что линкер не находит вызываемую мной функцию,

    а в том что он не находит функцию к которой происходит обращение в 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--------
     
  15. bober

    bober New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2005
    Сообщения:
    153
    А можно мне тоже попробовать компильнуть чтонить такое инрересное? А то не врублюсь что за проблема.
     
  16. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    Здраствуйте. я шашёл следующее:

    судя по masm32 инклюдам GetEnvironmentStrings не сущестует, а

    существуют GetEnvironmentStringsA и GetEnvironmentStringsW



    Может быть кто нибудь знает как линкеру указать что GetEnvironmentStrings

    это то же что и GetEnvironmentStringsA?



    Или может быть кто нибудь знает софт для того чтобы извлечь *.obj из

    libc.lib а после исправления запихнуть их обратно?
     
  17. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576




    А инклуды разве не для этого существуют?
     
  18. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35
    2 bober я могу выслать, но размер архива составляет

    893 kb -:dntknw:

    2 Asterix дак есть в инклюдах: kernel32.inc

    GetEnvironmentStrings equ GetEnvironmentStringsA
     
  19. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Открываем первый попавшийся inc и видим:


    Код (Text):
    1. MIMEAssociationDialogA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    2. [b]MIMEAssociationDialog equ <MIMEAssociationDialogA>[/b]




    А что собственно за проблема такая? GetEnvironmentStrings кроме как через libc взять негде? В kernel32 есть, и переменные окружения такой код выдаёт без проблем:


    Код (Text):
    1.     invoke  GetEnvironmentStrings
    2.     mov     ebx,eax
    3.     .while byte ptr[ebx]
    4.         invoke  MessageBox, NULL, ebx, NULL, MB_OK
    5.         invoke  lstrlen, ebx
    6.         lea     ebx,[ebx+eax+1]
    7.     .endw




    Например у меня выдает такую инфу:


    Код (Text):
    1. ebx = ALLUSERSPROFILE=C:\Documents and Settings\All Users
    2. ebx = APPDATA=C:\Documents and Settings\• §à¨â\Application Data
    3. ebx = CLIENTNAME=Console
    4. ebx = CommonProgramFiles=C:\Program Files\Common Files
    5. ebx = COMPUTERNAME=CR
    6. ebx = ComSpec=C:\WINDOWS\system32\cmd.exe
    7. ebx = HOMEDRIVE=C:
    8. ebx = HOMEPATH=\Documents and Settings\• §à¨â
    9. ebx = LOGONSERVER=\\CR
    10. ebx = NUMBER_OF_PROCESSORS=1
    11. ebx = OS=Windows_NT
    12. ebx = Path=c:\masm32\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\ Wbem;C:\PBWIN70\BIN
    13. ebx = PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    14. ebx = PROCESSOR_ARCHITECTURE=x86
    15. ebx = PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD
    16. ebx = PROCESSOR_LEVEL=6
    17. ebx = PROCESSOR_REVISION=0801
    18. и т.д.
     
  20. acdel1

    acdel1 New Member

    Публикаций:
    0
    Регистрация:
    5 ноя 2005
    Сообщения:
    35