Всем здрасти. Недавно установил новый mingw (4.5.2 вместо используемого ранее 3.4.2), и для тестинга создал такую консольную программу со следующим исходным кодом: #include<stdio.h> #include<conio.h> int main() { getch(); } Откомпилировал сначала в старой версии, потом в новой с опциями: --static-libgcc -Wl,-s -Wl,-x. Разница в размере .exe файла составила 2,5 кб. Посмотрел в CFF Explorerе, в файле созданным в более поздней версии есть три секции которых нет в файле созданном в старой версии, это .CRT .tls и .eh_fram. Собственно вопрос: что содержится в этих секциях (хотя тлс видимо Thread Local Storage но почему же в предыдущих версиях такая секция не создавалсь?) и какими опциями компиляции можно отключить их создание? (править скрипт линкера не предлагайте, т.к. в старой версии этого делать не приодилось). Заранее спасибо всем заранее за помощь.
.CRT - си рантайм .tls - тред локал сторадж .eh_frame - относится к обработке исключений все три секции относятся к си рантайму... отключается флагом nostdlib...
Спасибо за объяснение! Но вот только этот флаг не дает использовать стандартные сишные функции, такие как printf, scanf, getch и т.д. А в прошлой версии можно было их использовать и этих секций не появлялось, особые флаги типа -std=c++0x я не использую. Весь набор флагов такой же как и раньше, код программы - один и тот же...Такое ощущение что все делают против людей(
Код (Text): #include <windows.h> int _main() { MessageBoxA(NULL, "Test", "Test", MB_OK); return 0; } ключи компиляции: -s -Os ключи линкера: -nostdlib размер на выходе 2 кб, можно еще смерджить секции, ужать до 1.5 кб, можно еще поколдовать над ключами и кодом и наверное ужать до менее килобайта... вот "пруф оф консепт": http://zalil.ru/30864709
Это я умею, но хотелось бы использовать стандартные сишные функции. Как мне удалось понять погуглив - eh_fram это отладочная информация формата Dwarf, о которой я слыхом не слыхивал и ваще её поддержка мне нафиг не сдалась, а копмлиятор по умолчанию включает её поддержку(
чтобы использовать сишные функции, нужен сишный рантайм... либо смиритесь с секциями, либо пишите свой рантайм, либо используйте какой-нить менее толстый сишный рантайм от стороннего производителя...
Вы забыли о варианте "вернутся на старый компилятор", которой я и воспользуюсь, учитывая что стандартные функции вызываются все равно из все той же msvcrt.dll
что мешает залинковать на libmsvcrt.a? Код (Text): #include <stdio.h> int _main() { printf("Hello world!\n"); return 0; } "пруф оф консепт": http://zalil.ru/30866951 (2 kB) проблема не в компиляторе - проблема в голове) и кстати в msvcrt.dll есть довольно существенное количество косяков, доработанных в собственных реализациях CRT различных компиляторов и сторонних производителей / интузиастов... даже у меня есть своя "реализация CRT"... из сторонних можно посоветовать например WCRT...
#4, плохо компилятор выдал Код (Text): CPU Disasm Address Hex dump Command Comments <ModuleEntryP /. 55 push ebp 00401001 |. 89E5 mov ebp,esp 00401003 |. 83EC 18 sub esp,18 00401006 |. C74424 0C 00000000 mov [dword ss:esp+0C],0 ; /Type => MB_OK|MB_DEFBUTTON1|MB_APPLMODAL 0040100E |. C74424 08 00204000 mov [dword ss:esp+8],offset Test.00402000 ; |Caption => "Test" 00401016 |. C74424 04 00204000 mov [dword ss:esp+4],offset Test.00402000 ; |Text => "Test" 0040101E |. C70424 00000000 mov [dword ss:esp],0 ; |hOwner => NULL 00401025 |. E8 0A000000 call <jmp.&USER32.MessageBoxA> ; \USER32.MessageBoxA 0040102A |. 83EC 10 sub esp,10 0040102D |. 31C0 xor eax,eax 0040102F |. C9 leave 00401030 \. C3 retn
Попробую! Извините, а в какой программе вы дизассемблировали код Test.exe? Комментарии вы сами писали?
вообще в вашем CFF Explorer'е есть декомпилятор... да, канеш не хорошо... надо подробнее посмотреть флаги оптимизации, может я что-то напутал там) кстати кто знает, как смерждить секции в мингв?)
Странно, но даже я знаю что секции в мингв можно объединить только написав скрипт линкера собственный...Аналогов такого: #pragma comment(linker, "/merge:.rdata=.text") #pragma comment(linker, "/merge:.data=.text") #pragma comment(linker, "/merge:.reloc=.text") Линкер от gcc не предоставляет..тока скрипт.
понятно, что не понимает, но какой-то аналог должен быть по идее... что значит "скрипт линкера"? вообще надо будет со всеми этими флагами разобраться, но чет их очень много))): http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Значит вот это: http://www.math.utah.edu/docs/info/ld_3.html Простейший выглядит так: Код (Text): SECTIONS { .text : { *(.text) *(.data) *(.rodata) } .bss : { *(.bss) *(COMMON) } }