Как зайти в Даркнет?!
25th January, 01:11
8
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
898
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
951
0
Очень долго работает Update запрос Oracle
27th January, 09:58
916
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
907
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
941
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1726
0
период по дням
25th October, 10:44
3957
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3722
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4614
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4382
0
Помогите пожалуйста решить задачи
24th November, 23:53
6087
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4352
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4398
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
В программе C/C++ как система (windows, linux, mac OS X) вызывает функцию main()
Я ищу более техническое объяснение, чем вызов функции OS. Может ли кто-нибудь помочь мне или указать мне на веб-сайт или книгу?
Файл .exe (или его эквивалент на других платформах) содержит адрес 'entry point'. В первом приближении OS загружает соответствующие разделы файла .EXE в ram, а затем переходит к точке входа.
Как уже говорили другие, эта точка входа не будет 'main', а будет частью библиотеки времени выполнения - она будет выполнять такие действия, как инициализация статических объектов, настройка параметров argc/argv, настройка stdin/stdout/stderr и т. д. Когда все это будет сделано, он вызовет вашу функцию main(). При выходе из main среда выполнения проходит через аналитический процесс передачи кода возврата обратно в среду, вызывая статические деструкторы, вызывая подпрограммы _atexit и т. д.
Если у вас есть инструменты MS (возможно, не халявные), то у вас есть весь источник среды выполнения, и простой способ взглянуть на него-поставить точку останова на закрывающей скобке вашего метода main() и сделать один шаг назад в среду выполнения.
main() является частью библиотеки C и не является системной функцией. Я не знаю для OS X или Linux, но Windows обычно запускает программу с WinMainCRTStartup() . Этот символ инициализирует ваш процесс, извлекает аргументы командной строки и окружение (argc, argv, end) и вызывает main() . Он также отвечает за вызов любого кода, который должен выполняться после main(), например atexit() .
Заглянув в файл Visual Studio, вы сможете найти реализацию по умолчанию WinMainCRTStartup , чтобы посмотреть, что она делает.
Вы также можете определить свою собственную функцию для вызова при запуске,это делается путем изменения "entry point" в параметрах компоновщика. Это часто функция, которая не принимает аргументов и возвращает пустоту.
Что касается windows, то функции точки входа являются:
- Консоль:
void __cdecl mainCRTStartup( void ) {} - GUI:
void __stdcall WinMainCRTStartup( void ) {} - DLL:
BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
Единственная причина использовать их над обычным main/WinMain/DllMain - это если вы хотите использовать свою собственную библиотеку времени выполнения (Если вы хотите меньший размер файла или пользовательские функции)
Для пользовательских реализаций времени выполнения и других трюков, чтобы получить меньшие файлы PE, см. раздел:
- http://www.microsoft.com/msj/archive/S569.aspx
- http://www.codeproject.com/KB/tips/aggressiveoptimize.aspx
- http://www.catch22.net/tuts/minexe.asp
- http://www.hailstorm.net/papers/smallwin32.htm
Expert C++/CLI (проверьте страницу 279) содержит очень подробные сведения о различных сценариях начальной загрузки для нативных, смешанных и чистых сборок CLR.
Это зависит от 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 ()