Для чего нужны секции .CRT .tls и .eh_fram?

Тема в разделе "WASM.BEGINNERS", создана пользователем Praetor11, 14 апр 2011.

  1. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Всем здрасти.

    Недавно установил новый 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 но почему же в предыдущих версиях такая секция не создавалсь?) и какими опциями компиляции можно отключить их создание? (править скрипт линкера не предлагайте, т.к. в старой версии этого делать не приодилось).

    Заранее спасибо всем заранее за помощь.
     
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    .CRT - си рантайм
    .tls - тред локал сторадж
    .eh_frame - относится к обработке исключений
    все три секции относятся к си рантайму... отключается флагом nostdlib...
     
  3. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Спасибо за объяснение! Но вот только этот флаг не дает использовать стандартные сишные функции, такие как printf, scanf, getch и т.д. А в прошлой версии можно было их использовать и этих секций не появлялось, особые флаги типа -std=c++0x я не использую. Весь набор флагов такой же как и раньше, код программы - один и тот же...Такое ощущение что все делают против людей(
     
  4. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    Код (Text):
    1. #include <windows.h>
    2.  
    3. int _main()
    4. {
    5.     MessageBoxA(NULL, "Test", "Test", MB_OK);
    6.     return 0;
    7. }
    ключи компиляции: -s -Os
    ключи линкера: -nostdlib
    размер на выходе 2 кб, можно еще смерджить секции, ужать до 1.5 кб, можно еще поколдовать над ключами и кодом и наверное ужать до менее килобайта...
    вот "пруф оф консепт": http://zalil.ru/30864709
     
  5. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Это я умею, но хотелось бы использовать стандартные сишные функции. Как мне удалось понять погуглив - eh_fram это отладочная информация формата Dwarf, о которой я слыхом не слыхивал и ваще её поддержка мне нафиг не сдалась, а копмлиятор по умолчанию включает её поддержку(
     
  6. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    чтобы использовать сишные функции, нужен сишный рантайм... либо смиритесь с секциями, либо пишите свой рантайм, либо используйте какой-нить менее толстый сишный рантайм от стороннего производителя...
     
  7. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Вы забыли о варианте "вернутся на старый компилятор", которой я и воспользуюсь, учитывая что стандартные функции вызываются все равно из все той же msvcrt.dll
     
  8. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    что мешает залинковать на libmsvcrt.a?
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int _main()
    4. {
    5.     printf("Hello world!\n");
    6.     return 0;
    7. }
    "пруф оф консепт": http://zalil.ru/30866951 (2 kB)
    проблема не в компиляторе - проблема в голове)
    и кстати в msvcrt.dll есть довольно существенное количество косяков, доработанных в собственных реализациях CRT различных компиляторов и сторонних производителей / интузиастов... даже у меня есть своя "реализация CRT"... из сторонних можно посоветовать например WCRT...
     
  9. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    #4, плохо компилятор выдал
    Код (Text):
    1. CPU Disasm
    2. Address       Hex dump                Command                                        Comments
    3. <ModuleEntryP /.  55                  push    ebp
    4. 00401001      |.  89E5                mov     ebp,esp
    5. 00401003      |.  83EC 18             sub     esp,18
    6. 00401006      |.  C74424 0C 00000000  mov     [dword ss:esp+0C],0                    ; /Type => MB_OK|MB_DEFBUTTON1|MB_APPLMODAL
    7. 0040100E      |.  C74424 08 00204000  mov     [dword ss:esp+8],offset Test.00402000  ; |Caption => "Test"
    8. 00401016      |.  C74424 04 00204000  mov     [dword ss:esp+4],offset Test.00402000  ; |Text => "Test"
    9. 0040101E      |.  C70424 00000000     mov     [dword ss:esp],0                       ; |hOwner => NULL
    10. 00401025      |.  E8 0A000000         call    <jmp.&USER32.MessageBoxA>              ; \USER32.MessageBoxA
    11. 0040102A      |.  83EC 10             sub     esp,10
    12. 0040102D      |.  31C0                xor     eax,eax
    13. 0040102F      |.  C9                  leave
    14. 00401030      \.  C3                  retn
     
  10. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Попробую!

    Извините, а в какой программе вы дизассемблировали код Test.exe? Комментарии вы сами писали?
     
  11. Sunzer

    Sunzer Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    256
    ollydbg

    нет
     
  12. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    вообще в вашем CFF Explorer'е есть декомпилятор...

    да, канеш не хорошо... надо подробнее посмотреть флаги оптимизации, может я что-то напутал там)
    кстати кто знает, как смерждить секции в мингв?)
     
  13. Praetor11

    Praetor11 New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2009
    Сообщения:
    80
    Странно, но даже я знаю что секции в мингв можно объединить только написав скрипт линкера собственный...Аналогов такого:
    #pragma comment(linker, "/merge:.rdata=.text")
    #pragma comment(linker, "/merge:.data=.text")
    #pragma comment(linker, "/merge:.reloc=.text")
    Линкер от gcc не предоставляет..тока скрипт.
     
  14. edemko

    edemko New Member

    Публикаций:
    0
    Регистрация:
    25 ноя 2009
    Сообщения:
    454
    -fomit-frame-pointer(убрать ebp)
    -mpush-args(push, а не mov), ничего не дает
     
  15. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.315
    понятно, что не понимает, но какой-то аналог должен быть по идее... что значит "скрипт линкера"?

    вообще надо будет со всеми этими флагами разобраться, но чет их очень много))):
    http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
     
  16. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Значит вот это: http://www.math.utah.edu/docs/info/ld_3.html

    Простейший выглядит так:

    Код (Text):
    1. SECTIONS
    2. {
    3.     .text : { *(.text) *(.data) *(.rodata) }
    4.     .bss : { *(.bss) *(COMMON) }
    5. }