Создание lib из dll средствами пакета masm

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

  1. baldr

    baldr New Member

    Публикаций:
    0
    Регистрация:
    29 апр 2010
    Сообщения:
    327
    Извини за прямоту, но с работой dumpbin при наличии символов ты, похоже, не знаком. Вот фрагмент дампа user32.dll:
    Код (Text):
    1. ...
    2.         476  1DB 00021F3B MessageBeep = _MessageBeep@4
    3.         477  1DC 0004058A MessageBoxA = _MessageBoxA@16
    4.         478  1DD 000405FC MessageBoxExA = _MessageBoxExA@20
    5.         479  1DE 000405D8 MessageBoxExW = _MessageBoxExW@20
    6.         480  1DF 0002A04A MessageBoxIndirectA = _MessageBoxIndirectA@4
    7.         481  1E0 000562AB MessageBoxIndirectW = _MessageBoxIndirectW@4
    8.         482  1E1 000561DC MessageBoxTimeoutA = _MessageBoxTimeoutA@24
    9.         483  1E2 00056159 MessageBoxTimeoutW = _MessageBoxTimeoutW@24
    10.         484  1E3 0005630A MessageBoxW = _MessageBoxW@16
    11.         485  1E4 0003EFAB ModifyMenuA = _ModifyMenuA@20
    12. ...
    Вот то же для mfc42u.dll:
    Код (Text):
    1. ...
    2.         258      0008386B [NONAME] ?_AfxBinaryCompatibleStubFunction@@YAXXZ (void __cdecl _AfxBinaryCompatibleStubFunction(void))
    3. ...
    4.         590      0008386B [NONAME] ?_AfxBinaryCompatibleStubFunction@@YAXXZ (void __cdecl _AfxBinaryCompatibleStubFunction(void))
    5. ...
    6.         598      0008386B [NONAME] ?_AfxBinaryCompatibleStubFunction@@YAXXZ (void __cdecl _AfxBinaryCompatibleStubFunction(void))
    7. ...
    8.         944      0008386B [NONAME] ?_AfxBinaryCompatibleStubFunction@@YAXXZ (void __cdecl _AfxBinaryCompatibleStubFunction(void))
    9. ...
    В общем, всё там есть. Кстати, _MessageBoxA@16 — не псевдоним а полноценное имя, экспортируемое нормальной user32.lib (это адрес переходника), как и __imp__MessageBoxA@16 (а это адрес в IAT).

    Как видим из предыдущего абзаца, это всё-таки так.

    Формат дефов воистину примитивен, в них нет возможности указать хинты и информацию для биндинга. То есть либы получаются вроде как рабочие, но тоже примитивные.

    Не сочти за флэйм. Просто уточняю моменты.
     
  2. Scholium

    Scholium New Member

    Публикаций:
    0
    Регистрация:
    5 мар 2009
    Сообщения:
    96
    Я действительно, работал с dumpbin без символов. Просто в этом нет никакой необходимости. Ибо с символами можно работать и с IdaPro. Информации это дает ничуть не меньше. Но опять же, речь идет о создании полных деф-файлов для создании из них либов, чтобы компилировать нужные асм-проекты. В ссылке с примерами есть и асм-проекты и дефы. Эти проекты не компилируются целиком и полностью под стандартные либы, а под предлагаемые либы (генерирукемые из приложенных дефов) – компилируются. Вот в чем соль – показано средство решения проблем компиляции со стандартными либами. Причем тут знаком «с работой dumpbin при наличии символов» или не знаком? Какую проблему решает это «знакомство» из нерешенных в предлагаемой статье? Похоже на детский сад. Мол, я знаю, как строить дефы из листингов «Иды» с символами, а я знаю, как строить дефы из листингов dumpbin’a с символами! Из сути статьи видно, что символы поставляют pdb-файлы. Я имел в виду чистый dumpbin, а Вы – с отладочными символами. Но у нас есть скрипт построения деф-файлов, а у Вас – нет. Так что будем заострять на этом внимание? Конечно, при желании Вы его напишите, не сомневаюсь. Однако гораздо интересней обсуждать именно Ваши достижения, которые еще не реализованы у других. Или наши конкретные недостатки, а не поиск того, что мы чего-то не знаем из того, что нам не нужно.

    Хорошо, в статье перечислены ординалы:

    1016, 1055, 1747, 2015, 2016, 2017, 2474, 2977, 3074, 3101, 3142, 3254, 3744, 4043, 4103, 4112, 4383, 4564, 4650, 4666, 4721, 4876, 4974, 5010, 5501, 5508, 5523, 5524, 5526, 5549, 5559, 5561, 6051, 6320

    из mfc42u.dll. Вы можете дать все их имена (алиасы)?

    Далее, возьмем первую Вашу функцию с ординалом 258. В нашем деф-файле она определена как

    Код (Text):
    1. ?_AfxBinaryCompatibleStubFunction@@YAXXZ  @258  ; @590, 598, 944, 946, 947, 948, 949, 951, 952, 953, 954, 1178, 1187, 1188, 2186, 2761
    Т.е., показано, что еще шестнадцать функций (с перечисленными ординалами) имеют общее с 258-й функцией тело. У Вас эта информация отображается? «Ида» дает и си-шное определение этой функции (и всех других)

    Код (Text):
    1. void __cdecl _AfxBinaryCompatibleStubFunction(void)
    как и у Вас. Так что я так и не понял, что Вы хотели доказать?

    Ну, мы уже и философские вопросы готовы обсуждать :) . Типа, что первично, user32.dll или user32.lib? Я полагаю, что длл, Вы, судя по-всему, готовы отдать пальму первенства либу. Откройте в шестнадцатеричном редакторе эту длл и Вы увидите, что там присутствует только имя MessageBoxA , но нет имени _MessageBoxA@16. Если мы создадим файл user32.def

    Код (Text):
    1. LIBRARY "user32.dll"
    2. EXPORTS
    3. MessageBoxA
    и скомпилируем из него user32.lib, то не найдем второго имени и в либе, ибо мы его туда не положили. Будет ли работоспособным этот либ? Да будет. Только экспортирование этой функции возможно будет только по первому имени или по имени _imp__MessageBoxA. Хотя, мы можем в самом асм-файле написать любой псевдоним, используя директиву equ. Чтобы увидеть в либе второе имя, и заодно имя _imp__MessageBoxA@16 мы должны написать в user32.def

    Код (Text):
    1. LIBRARY "user32.dll"
    2. EXPORTS
    3. MessageBoxA
    4. _MessageBoxA@16 = MessageBoxA
    В этом случае, мы сожжем экспортировать любое из четырех упоминавшихся имен, ибо все они уже будут присутствовать в либе. Заметим, что саму длл-ку мы не трогали. Более того, в дефе мы можем указать еще массу других имен. Например, сам Майкрософт использует различные алиасы для функции DestroyWindow из той же user32.dll. У нас это показано кодом

    Код (Text):
    1. LIBRARY "user32.dll"
    2. EXPORTS
    3. DestroyWindow
    4. _NtUserDestroyWindow@4 = DestroyWindow
    5. _DestroyWindow@4 = DestroyWindow
    Естественно, подобных определений может быть сколько угодно для одной единственной функции. Так это будут «псевдонимы» или «полноценные имена»? Мы называем это алиасами (псевдонимами), но если сильно хочется, можно назвать и по-Вашему, если не следить за строгостью речи.

    Если сказанное выше не убеждает Вас в обратном, то этот вопрос можно вычеркнуть из обсуждения, как исчерпавший себя.

    Ну, биндинг не есть тема ни обсуждаемой статьи, ни данного топика. Для него можно создать отдельную тему и обсуждать проблемы там. А предлагаемые либы во многом лучше стандартных, так что все либы от Майкрософта примитивные? По-моему, где-то смещены понятия.