пустая секция данных в Tasm

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

  1. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Всем привет.

    Не хочет нормально запускаться прога, компилированная тасмом с пустой секцией данных. Брал версию с C++ Builder 6, то же. А как добавишь в неё что-то, так работает. Такая же трабла возникла у меня при попытке отключения RTL от билдера (создание программ размером несколько кб.), так там загрузчик говорит, что файл не валиден. Присутсвие таблицы импорта почему-то не влияет. А я думал, что должно быть на оборот. Проверял на OS WinXp и Win2000.

    Кто-нибудь знает, что это может быть?

    И не влияют ли на загрузку файла без таблицы импорта сервис паки?
     
  2. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    imho, виндовый загрузчик не "ест" проги с пустыми секциями, тотже fasm, к примеру
     
  3. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Немного разобрался. Почему-то не создаётcя импорт когда нет данных, хотя функции объявлены и используются. А адреса в фунциях ставятся на начало загрузки PE образа.:)))

    Причём видимо объектник создаётся кривой, так как я уже писал выше, билдеровский Ilink32 собрать его корректно не может. А возможно и все вместе портачат, и компилятор и линкёр? Кстати кто-нибудь пытался собрать на С++ Builder маленькие программы, без RTL?
     
  4. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Для маленьких программ на Си лучше (и проще) всего использовать MSVC.
     
  5. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Я конечно полностью не врубился в тему, но на вопрос Кстати кто-нибудь пытался собрать на С++ Builder маленькие программы, без RTL? могу ответить.

    Создаешь асм-модуль, который вызывает _Winmain или _main.

    Линкуешь его вместе со своими модулями и все. а рантайм отбрасываешь.

    Если указать билдеру компилировать через ассемблер, то в hll- код можно вставить все что захочешь на асме.

    например, хочется вставить в кодовую секцию какую-то ху_ню

    не вылезая из ИДЕ, но вумный до жути компилер сует все асмовые вставки в секцию данных.



    Итак:



    void foo1 () {};



    // здесь компилер откроет секцию данных

    asm {

    // мы ему скажем от винта

    ends



    segment _TEXT

    db "Asm is power",0

    ends



    segment _DATA

    }



    void foo2 () {};



    примерно так. Подробности нуно уточнить.

    И повторяю, компилировать через ассемблер. свитч вроде /B

    между прочим,специфика компилятора bcc32 такова, что она для функций создает виртуальные сегменты, которые обьединятся потом в один. А наши вставки виртуальными сегментами не будут.
     
  6. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Потому и говорю, что MSVC проще:



    #pragma comment(linker, "/entry:my_main")

    #pragma comment(linker, "/nodefaultlib:libc.lib")



    тоже и у intel'а
     
  7. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    ещё можно заюзать wcrt вместо libc, довольно-таки приятная вещь (аналог libctiny.lib), тем более с открытым кодом
     
  8. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Нет, тема все-таки была о том, что тасм криво делает объектник, а линкёр криво потом его собирает, если в секции данных ничего нет. При этом в .exe отсутствует импорт, хотя в проге они юзуются, и все вызовы на адрес начала PE. С масмом такого нет. А вопрос про прогу без RTL в билдере, был всязи с этим.

    Попробуйте в нём такой код:


    Код (Text):
    1. WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
    2. {
    3.   MessageBoxA(0, 0, 0, 0);
    4.   return 0;
    5. }
    Без VCL и заменив в проекте оригинальный c0w32w.obj на свой, в котором тоже нет данных.Так загрузчик OS пишет, что он не валиден. Я пробовал компилить и Tasm5 и из проекта билдера, одно и тоже. IMHO - это грубый баг борланда.
     
  9. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Если прога собирается, приаттач сюда пример пустого приложения, сразу станет понятно, баг ето или нет.

    А если в лом, тагда пасматри и скажи атрибуты секций созданного приложения. Помнится тоже примерно такая трабла када - то была.
     
  10. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Выкладываю весь проект на билдере с асм модулем и .exe. Если раскомментировать в сишном коде строку <<//char c[] = "a";>> или же в асм модуле секцию данных, со строкой обращения к ней (иначе "хитрый" компилятор не сделает секцию), то загружается нормально.









    [​IMG] _1643626821__No_data.rar
     
  11. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    секция DATA в PE-файле создается с нулевыми вирт. и физическим размером секции данных. Если удалим секцию данных, все заработает нормально. Как вывод: глюк скорее в винде ( функция запуска приложения, нежели баг борландовского линкера). Кстати, Ваш код на вызова MessageBox некорректен. MessageBox (0,0,0,0) означает

    обращение по нулевому указателю, на что система незамедлительно ругнется. А MessageBox ( 0, "", "", 0) создаст непустую секцию данных, что нам совсем не нужно. Я проверял асеммблерный код ( TASM32), что в принципе значения не имеет, так как наш объект внимания линкер, а не компилятор.
     
  12. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    MrHammer

    "Как вывод: глюк скорее в винде"



    Вполне возможно, тем более что мелкомягкие знают больше о багах в своих осях. Поэтому и могут сделать так, чтобы не натыкаться на свои же грабли(это я в данном случае о компиляторах).

    Но как насчёт того что я писал выше:адреса системных вызовов(функций) Tasm ставит на адрес ImageBase, причём всех.То-есть если мы создадим .exe тасмом без секции данных и сделаем в ней допустим просто ret, то всё Ok. А если добавим вызов системной функции, то вызов будет на ImageBase. А это более чем странно.



    "код на вызова MessageBox некорректен. MessageBox (0,0,0,0)"

    Вполне возможно, я пишу на XP и она это переваривает. Не знаю как это работает на других осях, но думаю что в функции производится проверка на 0, и она обращаться к нулевому адресу не должна.
     
  13. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Booster, привет.

    Поразбирался я с тасмом32, нифига не заставишь его правильно компилировать такой код:



    ....



    .data

    extrn ExitProcess:near



    end



    ему обяз. нужна секция с какими нить данными,иначе глюк.
     
  14. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    Я компилил на tasm32



    .386

    .model flat

    .code

    start:

    mov eax,eax

    end start



    как видите секции данных нет

    все собирается нормально :)



    PS: вопрос возник вот у меня файл только с секцией кода

    я пытаюсь сжать его upx а неполучается .. пишет :

    CantPackException: empty resource sections are not supported

    может знаете как решить эту проблему ?
     
  15. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Вот полный код:



    .586

    .model flat



    includelib import32.lib



    .code

    start:

    xor eax, eax

    Call ExitProcess,eax



    .data

    extrn ExitProcess:near



    ; db 0



    end start



    Глюк в том, что если не инициализировать секцию данных чем-нить , в примере в виде комментария например нуль,

    то вызов импортируемой функи будет указывать на начало imagebase. Вот такой вот глюкан.



    вопрос возник вот у меня файл только с секцией кода

    я пытаюсь сжать его upx а неполучается .. пишет :

    CantPackException: empty resource sections are not supported

    может знаете как решить эту проблему ?




    Попробуй указать упкс в командной строке не сжимать секцию ресурсов, тогда может и пайдет.
     
  16. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    указывал --compress-resources=0 .. все равно таже ошибка .
     
  17. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Переименуй тагда, зачем париться, или в чем у тя прикол. Может прояснишь? ВОзможно, ответ в этом случае будет на поверхности.
     
  18. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    MrHammer

    Да прикол в том что собрал прогу без данных и импорта и экспорта (только секция кода) на tasm32 ... а вот сжать upx-ом неполучается .