Сейчас на форуме: rmn, Magister Yoda, vasilevradislav, tyns777 (+6 невидимых)

 eXeL@B —› Программирование —› Lcc Win32 - как избавиться от хлама и установить свою точку входа?
Посл.ответ Сообщение

Ранг: 135.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 31 июля 2008 15:37
· Личное сообщение · #1

Доброго времени суток!

[Запостил также данный вопрос на васм, но там ответов пока нет... может здесь кто знает]

Вопрос в следующем. Вот код моего простейшего хелловорда:

#include <windows.h>

void main()
{
MessageBox(0, "hello world", "(_._)", MB_OK|MB_ICONINFORMATION);
ExitProcess(0);
}


Размер exe получается нормальный - 3.1 кб, но вот пихает lcc туда много лишнего:

mov eax, large fs:0
push ebp
mov ebp, esp
push 0FFFFFFFFh
push offset unk_40201C
push offset sub_40109A
push eax
mov large fs:0, esp
sub esp, 10h
push ebx
push esi
push edi
mov [ebp+var_18], esp
push eax
fnstcw [esp+30h+var_30]
or [esp+30h+var_30], 300h
fldcw [esp+30h+var_30]
add esp, 4
push 0
push 0
push offset dword_402028
push offset dword_402024
push offset dword_402020
call __GetMainArgs
push dword_402028
push dword_402024
push dword_402020
mov dword_402014, esp
call sub_40129C ; <<-- и только тут будет вызвана ф-ия main
add esp, 18h
xor ecx, ecx
mov [ebp+var_4], ecx
push eax ; int
call exit


Плюс ко всему в импорте лишнего напихано

в VC подобные траблы просто решаются (изменяем точку входа + отключаем стандартную либу), а вот как подобное сотворить с LCC?

ЗЫ
Код пишется в среде RadASM, lcc 3.2

Зарание спасибо.



Ранг: 135.2 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 31 июля 2008 21:15
· Личное сообщение · #2

Проблема решена.
На самом деле lcc (как и borland C++/C++ Builder) не позволяет менять точку входа (кроме случая с DLL), а посему напишим свой startup-код без всякого мусора.

стандартный стартовый код для сборки EXE лежит в файле lcccrt0s.obj.
важный для нас кусок кода (из IDA):

.text:00000219 _mainCRTStartup proc near
.text:00000219
.text:00000219 var_30 = word ptr -30h
.text:00000219 var_18 = dword ptr -18h
.text:00000219 var_4 = dword ptr -4
.text:00000219
.text:00000219 mov eax, large fs:0
.text:0000021F push ebp
.text:00000220 mov ebp, esp
.text:00000222 push 0FFFFFFFFh
.text:00000224 push offset _$ExcepData
.text:00000229 push offset __except_handler3
.text:0000022E push eax
.text:0000022F mov large fs:0, esp
.text:00000236 sub esp, 10h
.text:00000239 push ebx
.text:0000023A push esi
.text:0000023B push edi
.text:0000023C mov [ebp+var_18], esp
.text:0000023F push eax
.text:00000240 fnstcw [esp+30h+var_30]
.text:00000243 or [esp+30h+var_30], 300h
.text:00000249 fldcw [esp+30h+var_30]
.text:0000024C add esp, 4
.text:0000024F push 0
.text:00000251 push 0
.text:00000253 push offset __environ
.text:00000258 push offset ___argv
.text:0000025D push offset ___argc
.text:00000262 call __GetMainArgs
.text:00000267 push __environ
.text:0000026D push ___argv
.text:00000273 push ___argc
.text:00000279 mov __InitialStack, esp
.text:0000027F call _main
.text:00000284 add esp, 18h
.text:00000287 xor ecx, ecx
.text:00000289 mov [ebp+var_4], ecx
.text:0000028C push eax
.text:0000028D call _exit
.text:0000028D _mainCRTStartup endp


Самый важный для нас момент - стартовая ф-ия должна носить имя _mainCRTStartup.
Всё. Можно приступить к написанию собственного начального кода.

.386P
.model flat

ASSUME CS: FLAT, DS: FLAT, SS: FLAT, ES: FLAT

;--------------------------------------------------------------------- -
; Code segment

_TEXT SEGMENT PUBLIC DWORD USE32 PUBLIC 'text'
_TEXT ENDS

;--------------------------------------------------------------------- -
; External function definitions

_TEXT SEGMENT PUBLIC DWORD USE32 PUBLIC 'text'

EXTRN _main:NEAR

_TEXT ENDS

;--------------------------------------------------------------------- -
; Startup code

_TEXT SEGMENT DWORD USE32 PUBLIC 'text'

public _mainCRTStartup
_mainCRTStartup PROC NEAR

jmp _main

_mainCRTStartup ENDP

_TEXT ENDS

END _mainCRTStartup


К0мпелируем это дело в masm32. Получив obj-файл переименовываем в lcccrt0s.obj кидаем в папку с либой lcc (C:\lcc\lib).

Вот так вот.

Тему закрываю


 eXeL@B —› Программирование —› Lcc Win32 - как избавиться от хлама и установить свою точку входа?
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати