Tôi đang tìm kiếm giải thích kỹ thuật hơn sau đó hệ điều hành gọi hàm. Có ai có thể giúp tôi hoặc chỉ cho tôi một trang web hoặc một cuốn sách không?Trong chương trình C/C++, hệ thống (windows, linux, mac OS X) gọi hàm main()
Trả lời
Các tập tin .exe (hoặc tương đương trên các nền tảng khác) có chứa một 'điểm nhập cảnh ' địa chỉ nhà. Để một xấp xỉ đầu tiên, hệ điều hành tải các phần có liên quan của tập tin .EXE vào ram, và sau đó nhảy đến điểm vào.
Như những người khác đã nói, điểm vào này sẽ không là 'chính', nhưng thay vào đó sẽ là một phần của thư viện thời gian chạy - nó sẽ làm những việc như khởi tạo đối tượng tĩnh, thiết lập tham số argc/argv, thiết lập stdin/stdout/stderr, vv Khi nó được thực hiện tất cả, nó sẽ gọi hàm main() của bạn. Khi thoát ra chính, thời gian chạy đi qua một quá trình analagous truyền mã trả về của bạn trở lại môi trường, gọi là destructor tĩnh, gọi các thường trình _atexit, v.v.
Nếu bạn có công cụ MS (có thể không phải là freebie), thì bạn có tất cả các nguồn thời gian chạy, và một cách dễ dàng để xem xét nó là đặt một điểm ngắt trên dấu ngoặc đóng của phương thức main() của bạn và một bước duy nhất sao lưu vào thời gian chạy.
main()
là một phần của thư viện C và không phải là chức năng của hệ thống. Tôi không biết cho OS X hoặc Linux, nhưng Windows thường bắt đầu một chương trình với WinMainCRTStartup()
. Biểu tượng này bắt đầu quá trình của bạn, trích xuất đối số dòng lệnh và môi trường (argc, argv, end
) và gọi main()
. Nó cũng chịu trách nhiệm gọi bất kỳ mã nào sẽ chạy sau main()
, như atexit()
.
Bằng cách tìm trong tệp Visual Studio của bạn, bạn sẽ có thể tìm thấy triển khai mặc định là WinMainCRTStartup
để xem nó hoạt động như thế nào.
Bạn cũng có thể xác định một chức năng của riêng bạn để gọi khi khởi động, điều này được thực hiện bằng cách thay đổi "điểm vào" trong tùy chọn trình liên kết. Đây thường là một hàm không có đối số và trả về một khoảng trống.
Bạn có thể có một cái nhìn tại liên kết sau:
Expert C++/CLI (kiểm tra trang 279) có chi tiết rất cụ thể về các kịch bản khởi động khác nhau cho các cụm CLR gốc, hỗn hợp và thuần túy.
Tùy thuộc vào hệ điều hành. Trong OS X, có một khung trong tiêu đề mach chứa địa chỉ xuất phát cho thanh ghi EIP (chỉ dẫn).
Khi nhị phân được nạp, hệ điều hành khởi động thực hiện từ địa chỉ này:
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 [..]
Địa chỉ là địa chỉ của các "bắt đầu" chức năng từ nhị phân:
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
Trong Mac OS X, đó là chức năng "bắt đầu" được gọi là đầu tiên, ngay cả trước chức năng "chính":
(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()
Theo như w indows đi, các chức năng nhập điểm là:
- Console:
void __cdecl mainCRTStartup(void) {}
- GUI:
void __stdcall WinMainCRTStartup(void) {}
- DLL:
BOOL __stdcall _DllMainCRTStartup(HINSTANCE hinstDLL,DWORD fdwReason,void* lpReserved) {}
Lý do duy nhất để sử dụng các so với bình thường chính/WinMain/DllMain là nếu bạn muốn sử dụng thư viện thời gian chạy của riêng mình (Nếu bạn muốn kích thước tệp hoặc các tính năng tùy chỉnh nhỏ hơn)
Để triển khai tùy chỉnh thời gian chạy ion và thủ thuật khác để có được file PE nhỏ, xem:
Nếu Bạn đang quan tâm đến một cuốn sách liên quan đến Windows và Win32 API hãy thử
"Ứng dụng lập trình cho Mi "Windows của" Jeffrey Richter.
- 1. Phát triển "Hệ thống tệp" cho linux, mac, windows
- 2. Hành vi làm tròn toán học khác nhau giữa Linux, Mac OS X và Windows
- 3. Chương trình Windows Phone 7 có sẵn trên máy tính chạy trên Mac OS X không?
- 4. Thay đổi Tùy chọn Hệ thống Âm thanh (hoặc khác) trong Mac OS X
- 5. Cập nhật ứng dụng trong Mac OS X
- 6. Cách biên dịch và chạy chương trình C trên Mac OS X
- 7. Cách đăng nhập hoạt động chương trình python trong Mac OS X
- 8. JNotify trên Mac OS X?
- 9. Cuộc gọi hệ thống trên Windows
- 10. ldconfig cho Mac OS X
- 11. móc khóa bàn phím hệ thống trên X dưới linux
- 12. Theo dõi Clipboard trên Mac OS X | Java
- 13. Gọi hệ thống Linux để tạo quy trình và luồng
- 14. Cách tạo dịch vụ Windows cho Mac OS X?
- 15. Truy cập hệ thống tệp iPhone từ ứng dụng Mac OS X
- 16. Chụp hệ thống Mac OS X Đầu ra âm thanh bằng Python
- 17. chown (mac os x)
- 18. Mac OS X tương đương với Linux bầy (1) lệnh
- 19. Tách tệp bằng AWK trên Mac OS X
- 20. Mac OS X: CGGetLastMouseDelta và di chuyển chuột theo chương trình
- 21. Pascal IDE dành cho Mac OS X
- 22. Soạn thảo chương trình C sử dụng OpenGl trong Mac OS X
- 23. Phát triển cho Mac OS X, trên Windows?
- 24. Mã hóa Unicode cho hệ thống tập tin trong Mac OS X không chính xác trong Python?
- 25. Mẫu lập trình bluetooth của Mac OS X?
- 26. Kéo và thả Java trên Mac OS X
- 27. clamxav homebrew mac os x
- 28. SetWindowsHookEx dành cho Mac OS X?
- 29. Máy ảo với Mac OS X
- 30. Hình ảnh xem nhanh lập trình trong Mac OS X
Ai đã bỏ phiếu để đóng? Câu hỏi này có vẻ hoàn toàn hợp lệ với tôi. Đây là câu hỏi hay !!! – Destructor