Всем привет. Не хочет нормально запускаться прога, компилированная тасмом с пустой секцией данных. Брал версию с C++ Builder 6, то же. А как добавишь в неё что-то, так работает. Такая же трабла возникла у меня при попытке отключения RTL от билдера (создание программ размером несколько кб.), так там загрузчик говорит, что файл не валиден. Присутсвие таблицы импорта почему-то не влияет. А я думал, что должно быть на оборот. Проверял на OS WinXp и Win2000. Кто-нибудь знает, что это может быть? И не влияют ли на загрузку файла без таблицы импорта сервис паки?
Немного разобрался. Почему-то не создаётcя импорт когда нет данных, хотя функции объявлены и используются. А адреса в фунциях ставятся на начало загрузки PE образа.)) Причём видимо объектник создаётся кривой, так как я уже писал выше, билдеровский Ilink32 собрать его корректно не может. А возможно и все вместе портачат, и компилятор и линкёр? Кстати кто-нибудь пытался собрать на С++ Builder маленькие программы, без RTL?
Я конечно полностью не врубился в тему, но на вопрос Кстати кто-нибудь пытался собрать на С++ Builder маленькие программы, без RTL? могу ответить. Создаешь асм-модуль, который вызывает _Winmain или _main. Линкуешь его вместе со своими модулями и все. а рантайм отбрасываешь. Если указать билдеру компилировать через ассемблер, то в hll- код можно вставить все что захочешь на асме. например, хочется вставить в кодовую секцию какую-то ху_ню не вылезая из ИДЕ, но вумный до жути компилер сует все асмовые вставки в секцию данных. Итак: void foo1 () {}; // здесь компилер откроет секцию данных asm { // мы ему скажем от винта ends segment _TEXT db "Asm is power",0 ends segment _DATA } void foo2 () {}; примерно так. Подробности нуно уточнить. И повторяю, компилировать через ассемблер. свитч вроде /B между прочим,специфика компилятора bcc32 такова, что она для функций создает виртуальные сегменты, которые обьединятся потом в один. А наши вставки виртуальными сегментами не будут.
Потому и говорю, что MSVC проще: #pragma comment(linker, "/entry:my_main") #pragma comment(linker, "/nodefaultlib:libc.lib") тоже и у intel'а
ещё можно заюзать wcrt вместо libc, довольно-таки приятная вещь (аналог libctiny.lib), тем более с открытым кодом
Нет, тема все-таки была о том, что тасм криво делает объектник, а линкёр криво потом его собирает, если в секции данных ничего нет. При этом в .exe отсутствует импорт, хотя в проге они юзуются, и все вызовы на адрес начала PE. С масмом такого нет. А вопрос про прогу без RTL в билдере, был всязи с этим. Попробуйте в нём такой код: Код (Text): WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBoxA(0, 0, 0, 0); return 0; } Без VCL и заменив в проекте оригинальный c0w32w.obj на свой, в котором тоже нет данных.Так загрузчик OS пишет, что он не валиден. Я пробовал компилить и Tasm5 и из проекта билдера, одно и тоже. IMHO - это грубый баг борланда.
Если прога собирается, приаттач сюда пример пустого приложения, сразу станет понятно, баг ето или нет. А если в лом, тагда пасматри и скажи атрибуты секций созданного приложения. Помнится тоже примерно такая трабла када - то была.
Выкладываю весь проект на билдере с асм модулем и .exe. Если раскомментировать в сишном коде строку <<//char c[] = "a";>> или же в асм модуле секцию данных, со строкой обращения к ней (иначе "хитрый" компилятор не сделает секцию), то загружается нормально. _1643626821__No_data.rar
секция DATA в PE-файле создается с нулевыми вирт. и физическим размером секции данных. Если удалим секцию данных, все заработает нормально. Как вывод: глюк скорее в винде ( функция запуска приложения, нежели баг борландовского линкера). Кстати, Ваш код на вызова MessageBox некорректен. MessageBox (0,0,0,0) означает обращение по нулевому указателю, на что система незамедлительно ругнется. А MessageBox ( 0, "", "", 0) создаст непустую секцию данных, что нам совсем не нужно. Я проверял асеммблерный код ( TASM32), что в принципе значения не имеет, так как наш объект внимания линкер, а не компилятор.
MrHammer "Как вывод: глюк скорее в винде" Вполне возможно, тем более что мелкомягкие знают больше о багах в своих осях. Поэтому и могут сделать так, чтобы не натыкаться на свои же грабли(это я в данном случае о компиляторах). Но как насчёт того что я писал выше:адреса системных вызовов(функций) Tasm ставит на адрес ImageBase, причём всех.То-есть если мы создадим .exe тасмом без секции данных и сделаем в ней допустим просто ret, то всё Ok. А если добавим вызов системной функции, то вызов будет на ImageBase. А это более чем странно. "код на вызова MessageBox некорректен. MessageBox (0,0,0,0)" Вполне возможно, я пишу на XP и она это переваривает. Не знаю как это работает на других осях, но думаю что в функции производится проверка на 0, и она обращаться к нулевому адресу не должна.
Booster, привет. Поразбирался я с тасмом32, нифига не заставишь его правильно компилировать такой код: .... .data extrn ExitProcess:near end ему обяз. нужна секция с какими нить данными,иначе глюк.
Я компилил на tasm32 .386 .model flat .code start: mov eax,eax end start как видите секции данных нет все собирается нормально PS: вопрос возник вот у меня файл только с секцией кода я пытаюсь сжать его upx а неполучается .. пишет : CantPackException: empty resource sections are not supported может знаете как решить эту проблему ?
Вот полный код: .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 может знаете как решить эту проблему ? Попробуй указать упкс в командной строке не сжимать секцию ресурсов, тогда может и пайдет.
Переименуй тагда, зачем париться, или в чем у тя прикол. Может прояснишь? ВОзможно, ответ в этом случае будет на поверхности.
MrHammer Да прикол в том что собрал прогу без данных и импорта и экспорта (только секция кода) на tasm32 ... а вот сжать upx-ом неполучается .