Có nhiều thứ khác nhau được yêu cầu theo tiêu chuẩn C++ mà bạn có thể gặp phải.
Quan trọng nhất là cần có mã xử lý bất kỳ số liệu thống kê nào trong đơn vị dịch chính trước khi gọi chính và chức năng sau lá chính xử lý sự hủy diệt của chúng. Ngoài ra, tiêu chuẩn yêu cầu một hàm atexit
cho phép bạn đăng ký các hàm bổ sung được gọi sau khi trả về chính.
Vì vậy, ở mức tối thiểu, mã khởi động cần có khả năng tạo cấu trúc dữ liệu này của các hàm sẽ được gọi khi trả về từ chính. Đây là một cấu trúc dữ liệu động bởi vì nó cần được thêm vào thời gian chạy bởi chương trình, và thứ tự các cuộc gọi ngược lại với việc đăng ký (vì vậy thông thường bạn muốn có một cấu trúc dữ liệu bổ sung cho nơi bạn đi bộ một cách dễ dàng).
Nhưng ngoài ra, tiêu chuẩn yêu cầu rằng các số liệu thống kê trong các đơn vị dịch thuật khác được tạo trước khi thực hiện bất kỳ chức năng nào trong đơn vị dịch đó. Thông thường, các trình biên dịch sẽ đơn giản sắp xếp mọi thứ trong trình liên kết để mọi thứ được gọi trước chính, nhưng điều đó không bắt buộc. Những trình biên dịch đó làm những việc khác nhau, sau đó cần phải cung cấp các thói quen khởi tạo trong các mã đơn vị dịch thuật khác được liên kết mà sẽ được gọi vào cuộc gọi hàm đầu tiên.
Đây chỉ là một chút công việc nếu bạn sử dụng bất kỳ thư viện chuẩn nào. Hãy nhớ rằng, std :: cout là một đối tượng tĩnh (static lifetime, không liên kết tĩnh - confusingly overloaded alert alert). Vì vậy, điều đó có nghĩa là xây dựng thông tin liên lạc đến giao diện điều khiển của bạn, sẽ có bất kỳ API nào cần thiết bởi nền tảng của bạn được gọi. Có nhiều đối tượng như vậy trong tiêu chuẩn.
Và sau đó, có thể có nội dung cụ thể cho nền tảng và/hoặc trình biên dịch của bạn chuẩn bị quy trình theo cách hữu ích hoặc phân tích biến môi trường hoặc tải thư viện động/thư viện "chuẩn" hoặc nội dung tương tự.
Thông thường, lối ra chỉ là đi bộ danh sách đó và bằng cách nào đó cung cấp giá trị trả về chính cho môi trường, vì hầu hết các hệ điều hành hiện đại đều tự dọn dẹp, nhưng có thể có thêm hệ thống cụ thể.
Trình biên dịch và nền tảng cụ thể. Tôi nghi ngờ bạn sẽ nhận được câu trả lời chính xác mà bạn muốn. – Matt
Tôi khuyên bạn nên [bài đăng này] (http://stackoverflow.com/a/9952374/176769) làm lộ trình cho bất kỳ người kỹ sư đảo ngược-guru-wannabe nào. – karlphillip
Tôi không có kinh nghiệm trong kỹ thuật đảo ngược, nhưng bạn không thể chỉ cần thiết lập một điểm ngắt trình gỡ lỗi ở đầu của chính để có được địa chỉ tương đối? Hoặc, cách khác, tìm kiếm chính trong một kết xuất đối tượng của tập tin thực thi? – bjhend