Сведения о вопросе

Pytdev

23:20, 9th August, 2020

Теги

c++   c   main    

В программе C/C++ как система (windows, linux, mac OS X) вызывает функцию main()

Просмотров: 442   Ответов: 7

Я ищу более техническое объяснение, чем вызов функции OS. Может ли кто-нибудь помочь мне или указать мне на веб-сайт или книгу?



  Сведения об ответе

dump

16:44, 15th August, 2020

Файл .exe (или его эквивалент на других платформах) содержит адрес 'entry point'. В первом приближении OS загружает соответствующие разделы файла .EXE в ram, а затем переходит к точке входа.

Как уже говорили другие, эта точка входа не будет 'main', а будет частью библиотеки времени выполнения - она будет выполнять такие действия, как инициализация статических объектов, настройка параметров argc/argv, настройка stdin/stdout/stderr и т. д. Когда все это будет сделано, он вызовет вашу функцию main(). При выходе из main среда выполнения проходит через аналитический процесс передачи кода возврата обратно в среду, вызывая статические деструкторы, вызывая подпрограммы _atexit и т. д.

Если у вас есть инструменты MS (возможно, не халявные), то у вас есть весь источник среды выполнения, и простой способ взглянуть на него-поставить точку останова на закрывающей скобке вашего метода main() и сделать один шаг назад в среду выполнения.


  Сведения об ответе

LAST

17:47, 5th August, 2020

main() является частью библиотеки C и не является системной функцией. Я не знаю для OS X или Linux, но Windows обычно запускает программу с WinMainCRTStartup() . Этот символ инициализирует ваш процесс, извлекает аргументы командной строки и окружение (argc, argv, end) и вызывает main() . Он также отвечает за вызов любого кода, который должен выполняться после main(), например atexit() .

Заглянув в файл Visual Studio, вы сможете найти реализацию по умолчанию WinMainCRTStartup , чтобы посмотреть, что она делает.

Вы также можете определить свою собственную функцию для вызова при запуске,это делается путем изменения "entry point" в параметрах компоновщика. Это часто функция, которая не принимает аргументов и возвращает пустоту.


  Сведения об ответе

park

20:52, 15th August, 2020

Что касается windows, то функции точки входа являются:

  • Консоль: void __cdecl mainCRTStartup( void ) {}
  • GUI: void __stdcall WinMainCRTStartup( void ) {}
  • DLL: BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}

Единственная причина использовать их над обычным main/WinMain/DllMain - это если вы хотите использовать свою собственную библиотеку времени выполнения (Если вы хотите меньший размер файла или пользовательские функции)

Для пользовательских реализаций времени выполнения и других трюков, чтобы получить меньшие файлы PE, см. раздел:


  Сведения об ответе

P_S_S

10:34, 6th August, 2020

Expert C++/CLI (проверьте страницу 279) содержит очень подробные сведения о различных сценариях начальной загрузки для нативных, смешанных и чистых сборок CLR.


  Сведения об ответе

pumpa

22:09, 17th August, 2020

Это зависит от OS. В OS X есть фрейм в заголовке mach, который содержит начальный адрес для регистра EIP (указатель инструкции).

Как только двоичный файл загружен, OS запускает выполнение с этого адреса:

cristi:test diciu$ otool -l ./a.out | grep -A 10 LC_UNIXTHREAD
        cmd LC_UNIXTHREAD
    cmdsize 80
     flavor i386_THREAD_STATE
      count i386_THREAD_STATE_COUNT
[..]
        ss  0x00000000 eflags 0x00000000 eip 0x00001f8c cs  0x00000000
[..]

Адрес - это адрес функции "start" из двоичного файла:

cristi:test diciu$ nm ./a.out
0000200c D _NXArgc
00002008 D _NXArgv
00002000 D ___progname
00001fe0 t __dyld_func_lookup
00001000 A __mh_execute_header
[..]
00001f8c T start

В Mac OS X это функция "start", которая вызывается первой, даже до функции "main":

(gdb) b start
Breakpoint 1 at 0x1f90
(gdb) b main
Breakpoint 2 at 0x1ff4
(gdb) r
Starting program: /Users/diciu/Programming/test/a.out 
Reading symbols for shared libraries ++. done

Breakpoint 1, 0x00001f90 in start ()


  Сведения об ответе

P_S_S

11:04, 8th August, 2020

  Сведения об ответе

lourence

21:06, 1st October, 2020

Если вы заинтересованы в книге, связанной с Windows и Win32 API попробуйте

"Programming Applications for Microsoft Windows" Джеффри Рихтер.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться